blob: 72984dfa802e7af10da53e48cbba92a95cc42000 [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
Mike Weiblen40b160e2017-02-06 19:21:52 -07002 * Copyright (c) 2015-2017 The Khronos Group Inc.
3 * Copyright (c) 2015-2017 Valve Corporation
4 * Copyright (c) 2015-2017 LunarG, Inc.
5 * Copyright (c) 2015-2017 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
Cody Northrop1242dfd2016-07-13 17:24:59 -060020 * Author: Cody Northrop <cnorthrop@google.com>
Dave Houlton59a20702017-02-02 17:26:23 -070021 * Author: Dave Houlton <daveh@lunarg.com>
Karl Schultz6addd812016-02-02 17:17:23 -070022 */
Tony Barbour65c48b32015-11-17 10:02:56 -070023
Cody Northrop8e54a402016-03-08 22:25:52 -070024#ifdef ANDROID
25#include "vulkan_wrapper.h"
26#else
David Pinedo9316d3b2015-11-06 12:54:48 -070027#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070028#endif
Cody Northrop1242dfd2016-07-13 17:24:59 -060029
30#if defined(ANDROID) && defined(VALIDATION_APK)
31#include <android/log.h>
32#include <android_native_app_glue.h>
33#endif
34
Jon Ashburn7fa7e222016-02-02 12:08:10 -070035#include "icd-spv.h"
Mark Lobodzinskice751c62016-09-08 10:45:35 -060036#include "test_common.h"
37#include "vk_layer_config.h"
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060038#include "vk_validation_error_messages.h"
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060039#include "vkrenderframework.h"
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070040
41#include <algorithm>
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060042#include <limits.h>
43#include <unordered_set>
Tony Barbour300a6082015-04-07 13:44:53 -060044
Mark Lobodzinski3780e142015-05-14 15:08:13 -050045#define GLM_FORCE_RADIANS
46#include "glm/glm.hpp"
47#include <glm/gtc/matrix_transform.hpp>
48
49//--------------------------------------------------------------------------------------
50// Mesh and VertexFormat Data
51//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070052struct Vertex {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070053 float posX, posY, posZ, posW; // Position data
54 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050055};
56
Karl Schultz6addd812016-02-02 17:17:23 -070057#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050058
59typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070060 BsoFailNone = 0x00000000,
61 BsoFailLineWidth = 0x00000001,
62 BsoFailDepthBias = 0x00000002,
63 BsoFailViewport = 0x00000004,
64 BsoFailScissor = 0x00000008,
65 BsoFailBlend = 0x00000010,
66 BsoFailDepthBounds = 0x00000020,
67 BsoFailStencilReadMask = 0x00000040,
68 BsoFailStencilWriteMask = 0x00000080,
69 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060070 BsoFailCmdClearAttachments = 0x00000200,
Tobin Ehlis379ba3b2016-07-19 11:22:29 -060071 BsoFailIndexBuffer = 0x00000400,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050072} BsoFailSelect;
73
74struct vktriangle_vs_uniform {
75 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070076 float mvp[4][4];
77 float position[3][4];
78 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050079};
80
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070081static const char bindStateVertShaderText[] =
82 "#version 450\n"
83 "vec2 vertices[3];\n"
84 "out gl_PerVertex {\n"
85 " vec4 gl_Position;\n"
86 "};\n"
87 "void main() {\n"
88 " vertices[0] = vec2(-1.0, -1.0);\n"
89 " vertices[1] = vec2( 1.0, -1.0);\n"
90 " vertices[2] = vec2( 0.0, 1.0);\n"
91 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
92 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050093
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070094static const char bindStateFragShaderText[] =
95 "#version 450\n"
96 "\n"
97 "layout(location = 0) out vec4 uFragColor;\n"
98 "void main(){\n"
99 " uFragColor = vec4(0,1,0,1);\n"
100 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500101
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600102static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
103 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
104 void *pUserData);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600105
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600106// ErrorMonitor Usage:
107//
Dave Houltonfbf52152017-01-06 12:55:29 -0700108// Call SetDesiredFailureMsg with a string to be compared against all
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600109// encountered log messages, or a validation error enum identifying
110// desired error message. Passing NULL or VALIDATION_ERROR_MAX_ENUM
111// will match all log messages. logMsg will return true for skipCall
112// only if msg is matched or NULL.
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600113//
Dave Houltonfbf52152017-01-06 12:55:29 -0700114// Call VerifyFound to determine if all desired failure messages
115// were encountered. Call VerifyNotFound to determine if any unexpected
116// failure was encountered.
Tony Barbour300a6082015-04-07 13:44:53 -0600117class ErrorMonitor {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700118 public:
Karl Schultz6addd812016-02-02 17:17:23 -0700119 ErrorMonitor() {
Dave Houltonfbf52152017-01-06 12:55:29 -0700120 test_platform_thread_create_mutex(&mutex_);
121 test_platform_thread_lock_mutex(&mutex_);
122 Reset();
123 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600124 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600125
Dave Houltonfbf52152017-01-06 12:55:29 -0700126 ~ErrorMonitor() { test_platform_thread_delete_mutex(&mutex_); }
Dustin Graves48458142016-04-29 16:11:55 -0600127
Dave Houltonfbf52152017-01-06 12:55:29 -0700128 // Set monitor to pristine state
129 void Reset() {
130 message_flags_ = VK_DEBUG_REPORT_ERROR_BIT_EXT;
131 bailout_ = NULL;
132 message_found_ = VK_FALSE;
133 failure_message_strings_.clear();
134 desired_message_strings_.clear();
135 desired_message_ids_.clear();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700136 ignore_message_strings_.clear();
Dave Houltonfbf52152017-01-06 12:55:29 -0700137 other_messages_.clear();
138 message_outstanding_count_ = 0;
139 }
140
141 // ErrorMonitor will look for an error message containing the specified string(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700142 void SetDesiredFailureMsg(const VkFlags msgFlags, const char *const msgString) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700143 test_platform_thread_lock_mutex(&mutex_);
144 desired_message_strings_.insert(msgString);
145 message_flags_ |= msgFlags;
146 message_outstanding_count_++;
147 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600148 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600149
Jeremy Hayesde6d96c2017-02-01 15:22:32 -0700150 // ErrorMonitor will look for an error message containing the specified string(s)
151 template <typename Iter>
152 void SetDesiredFailureMsg(const VkFlags msgFlags, Iter iter, const Iter end) {
153 for (; iter != end; ++iter) {
154 SetDesiredFailureMsg(msgFlags, *iter);
155 }
156 }
157
Dave Houltonfbf52152017-01-06 12:55:29 -0700158 // ErrorMonitor will look for a message ID matching the specified one(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700159 void SetDesiredFailureMsg(const VkFlags msgFlags, const UNIQUE_VALIDATION_ERROR_CODE msg_id) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700160 test_platform_thread_lock_mutex(&mutex_);
161 desired_message_ids_.insert(msg_id);
162 message_flags_ |= msgFlags;
163 message_outstanding_count_++;
164 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600165 }
166
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700167 // Set an error that the error monitor will ignore. Do not use this function if you are creating a new test.
168 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
169 // function and its definition.
170 void SetUnexpectedError(const char *const msg) {
171 test_platform_thread_lock_mutex(&mutex_);
172
173 ignore_message_strings_.emplace_back(msg);
174
175 test_platform_thread_unlock_mutex(&mutex_);
176 }
177
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700178 VkBool32 CheckForDesiredMsg(const uint32_t message_code, const char *const msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600179 VkBool32 result = VK_FALSE;
Dave Houltonfbf52152017-01-06 12:55:29 -0700180 test_platform_thread_lock_mutex(&mutex_);
181 if (bailout_ != NULL) {
182 *bailout_ = true;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600183 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600184 string errorString(msgString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600185 bool found_expected = false;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600186
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700187 if (!IgnoreMessage(errorString)) {
188 for (auto desired_msg : desired_message_strings_) {
189 if (desired_msg.length() == 0) {
190 // An empty desired_msg string "" indicates a positive test - not expecting an error.
191 // Return true to avoid calling layers/driver with this error.
192 // And don't erase the "" string, so it remains if another error is found.
193 result = VK_TRUE;
194 found_expected = true;
195 message_found_ = VK_TRUE;
196 failure_message_strings_.insert(errorString);
197 } else if (errorString.find(desired_msg) != string::npos) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600198 found_expected = true;
Dave Houltonfbf52152017-01-06 12:55:29 -0700199 message_outstanding_count_--;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700200 failure_message_strings_.insert(errorString);
Dave Houltonfbf52152017-01-06 12:55:29 -0700201 message_found_ = VK_TRUE;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700202 result = VK_TRUE;
203 // We only want one match for each expected error so remove from set here
204 // Since we're about the break the loop it's ok to remove from set we're iterating over
205 desired_message_strings_.erase(desired_msg);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600206 break;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600207 }
208 }
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700209 for (auto desired_id : desired_message_ids_) {
210 if (desired_id == VALIDATION_ERROR_MAX_ENUM) {
211 // A message ID set to MAX_ENUM indicates a positive test - not expecting an error.
212 // Return true to avoid calling layers/driver with this error.
213 result = VK_TRUE;
214 } else if (desired_id == message_code) {
215 // Double-check that the string matches the error enum
216 if (errorString.find(validation_error_map[desired_id]) != string::npos) {
217 found_expected = true;
218 message_outstanding_count_--;
219 result = VK_TRUE;
220 message_found_ = VK_TRUE;
221 desired_message_ids_.erase(desired_id);
222 break;
223 } else {
224 // Treat this message as a regular unexpected error, but print a warning jic
225 printf("Message (%s) from MessageID %d does not correspond to expected message from error Database (%s)\n",
226 errorString.c_str(), desired_id, validation_error_map[desired_id]);
227 }
228 }
229 }
230
231 if (!found_expected) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600232 printf("Unexpected: %s\n", msgString);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700233 other_messages_.push_back(errorString);
234 }
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600235 }
236
Dave Houltonfbf52152017-01-06 12:55:29 -0700237 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600238 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600239 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600240
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600241 vector<string> GetOtherFailureMsgs(void) const { return other_messages_; }
242
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700243 VkDebugReportFlagsEXT GetMessageFlags(void) const { return message_flags_; }
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600244
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700245 VkBool32 AnyDesiredMsgFound(void) const { return message_found_; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600246
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700247 VkBool32 AllDesiredMsgsFound(void) const { return (0 == message_outstanding_count_); }
Dave Houltonfbf52152017-01-06 12:55:29 -0700248
249 void SetBailout(bool *bailout) { bailout_ = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600250
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600251 void DumpFailureMsgs(void) const {
252 vector<string> otherMsgs = GetOtherFailureMsgs();
253 if (otherMsgs.size()) {
254 cout << "Other error messages logged for this test were:" << endl;
255 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
256 cout << " " << *iter << endl;
Tony Barbour59b42282016-11-03 13:31:28 -0600257 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600258 }
259 }
260
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600261 // Helpers
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200262
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600263 // ExpectSuccess now takes an optional argument allowing a custom combination of debug flags
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700264 void ExpectSuccess(VkDebugReportFlagsEXT const message_flag_mask = VK_DEBUG_REPORT_ERROR_BIT_EXT) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600265 // Match ANY message matching specified type
266 SetDesiredFailureMsg(message_flag_mask, "");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700267 message_flags_ = message_flag_mask; // override mask handling in SetDesired...
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200268 }
269
270 void VerifyFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600271 // Not seeing the desired message is a failure. /Before/ throwing, dump any other messages.
Dave Houltonfbf52152017-01-06 12:55:29 -0700272 if (!AllDesiredMsgsFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600273 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700274 for (auto desired_msg : desired_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700275 ADD_FAILURE() << "Did not receive expected error '" << desired_msg << "'";
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600276 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700277 for (auto desired_id : desired_message_ids_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700278 ADD_FAILURE() << "Did not receive expected error ENUM '" << desired_id << "'";
Tony Barbour59b42282016-11-03 13:31:28 -0600279 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200280 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700281 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200282 }
283
284 void VerifyNotFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600285 // ExpectSuccess() configured us to match anything. Any error is a failure.
Dave Houltonfbf52152017-01-06 12:55:29 -0700286 if (AnyDesiredMsgFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600287 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700288 for (auto msg : failure_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700289 ADD_FAILURE() << "Expected to succeed but got error: " << msg;
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600290 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200291 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700292 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200293 }
294
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700295 private:
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700296 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
297 // function and its definition.
298 bool IgnoreMessage(std::string const &msg) const {
299 if (ignore_message_strings_.empty()) {
300 return false;
301 }
302
303 return std::find_if(ignore_message_strings_.begin(), ignore_message_strings_.end(), [&msg](std::string const &str) {
304 return msg.find(str) != std::string::npos;
305 }) != ignore_message_strings_.end();
306 }
307
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700308 VkFlags message_flags_;
309 std::unordered_set<uint32_t> desired_message_ids_;
310 std::unordered_set<string> desired_message_strings_;
311 std::unordered_set<string> failure_message_strings_;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700312 std::vector<std::string> ignore_message_strings_;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700313 vector<string> other_messages_;
314 test_platform_thread_mutex mutex_;
315 bool *bailout_;
316 VkBool32 message_found_;
317 int message_outstanding_count_;
Tony Barbour300a6082015-04-07 13:44:53 -0600318};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500319
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600320static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
321 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
322 void *pUserData) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600323 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
324 if (msgFlags & errMonitor->GetMessageFlags()) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600325 return errMonitor->CheckForDesiredMsg(msgCode, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600326 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600327 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600328}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500329
Karl Schultz6addd812016-02-02 17:17:23 -0700330class VkLayerTest : public VkRenderFramework {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700331 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600332 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
333 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet,
Karl Schultz6addd812016-02-02 17:17:23 -0700334 BsoFailSelect failMask);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600335 void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
336 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet, failMask);
Karl Schultz6addd812016-02-02 17:17:23 -0700337 }
Tony Barbour300a6082015-04-07 13:44:53 -0600338
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600339 void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
340 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700341 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600342 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
Karl Schultz6addd812016-02-02 17:17:23 -0700343 uint32_t firstInstance) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600344 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700345 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600346 void QueueCommandBuffer(bool checkSuccess = true) { m_commandBuffer->QueueCommandBuffer(checkSuccess); }
347 void QueueCommandBuffer(const VkFence &fence) { m_commandBuffer->QueueCommandBuffer(fence); }
348 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding) {
Karl Schultz6addd812016-02-02 17:17:23 -0700349 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
350 }
351 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
352 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
353 }
Tony Barbour1fa09702017-03-16 12:09:08 -0600354 void Init(VkPhysicalDeviceFeatures *features = nullptr, const VkCommandPoolCreateFlags flags = 0) {
355 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
356 InitState(features, flags);
357 }
358
Karl Schultz6addd812016-02-02 17:17:23 -0700359
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700360 protected:
Karl Schultz6addd812016-02-02 17:17:23 -0700361 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600362 bool m_enableWSI;
Tony Barbour1fa09702017-03-16 12:09:08 -0600363 std::vector<const char *> instance_layer_names;
364 std::vector<const char *> instance_extension_names;
365 std::vector<const char *> device_extension_names;
Tony Barbour300a6082015-04-07 13:44:53 -0600366
367 virtual void SetUp() {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700368 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600369 /*
370 * Since CreateDbgMsgCallback is an instance level extension call
371 * any extension / layer that utilizes that feature also needs
372 * to be enabled at create instance time.
373 */
Karl Schultz6addd812016-02-02 17:17:23 -0700374 // Use Threading layer first to protect others from
375 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700376 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600377 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800378 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700379 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Ian Elliotte48a1382016-04-28 14:22:58 -0600380 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700381 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600382
Ian Elliott2c1daf52016-05-12 09:41:46 -0600383 if (m_enableWSI) {
384 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
385 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
386#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
387#if defined(VK_USE_PLATFORM_ANDROID_KHR)
388 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700389#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600390#if defined(VK_USE_PLATFORM_MIR_KHR)
391 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700392#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600393#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
394 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700395#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600396#if defined(VK_USE_PLATFORM_WIN32_KHR)
397 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700398#endif // VK_USE_PLATFORM_WIN32_KHR
399#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott2c1daf52016-05-12 09:41:46 -0600400#if defined(VK_USE_PLATFORM_XCB_KHR)
401 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
402#elif defined(VK_USE_PLATFORM_XLIB_KHR)
403 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700404#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600405 }
406
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600407 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600408 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800409 this->app_info.pApplicationName = "layer_tests";
410 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600411 this->app_info.pEngineName = "unittest";
412 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600413 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600414
Tony Barbour15524c32015-04-29 17:34:29 -0600415 m_errorMonitor = new ErrorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600416 }
417
418 virtual void TearDown() {
419 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600420 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600421 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600422 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600423
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600424 VkLayerTest() { m_enableWSI = false; }
Tony Barbour300a6082015-04-07 13:44:53 -0600425};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500426
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600427void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500428 // Create identity matrix
429 int i;
430 struct vktriangle_vs_uniform data;
431
432 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700433 glm::mat4 View = glm::mat4(1.0f);
434 glm::mat4 Model = glm::mat4(1.0f);
435 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500436 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700437 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500438
439 memcpy(&data.mvp, &MVP[0][0], matrixSize);
440
Karl Schultz6addd812016-02-02 17:17:23 -0700441 static const Vertex tri_data[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600442 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)}, {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)}, {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500443 };
444
Karl Schultz6addd812016-02-02 17:17:23 -0700445 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500446 data.position[i][0] = tri_data[i].posX;
447 data.position[i][1] = tri_data[i].posY;
448 data.position[i][2] = tri_data[i].posZ;
449 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700450 data.color[i][0] = tri_data[i].r;
451 data.color[i][1] = tri_data[i].g;
452 data.color[i][2] = tri_data[i].b;
453 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500454 }
455
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500456 ASSERT_NO_FATAL_FAILURE(InitViewport());
457
Chris Forbesbcfaadd2016-09-16 14:13:53 +1200458 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float), (const void *)&data,
459 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500460
Karl Schultz6addd812016-02-02 17:17:23 -0700461 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600462 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500463
464 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800465 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500466 pipelineobj.AddShader(&vs);
467 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600468 if (failMask & BsoFailLineWidth) {
469 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600470 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600471 ia_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600472 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
473 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600474 }
475 if (failMask & BsoFailDepthBias) {
476 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600477 VkPipelineRasterizationStateCreateInfo rs_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600478 rs_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600479 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600480 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600481 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600482 }
Rene Lindsayacbf5e62016-12-15 18:47:11 -0700483 // Viewport and scissors must stay in sync or other errors will occur than
Karl Schultz6addd812016-02-02 17:17:23 -0700484 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600485 if (failMask & BsoFailViewport) {
486 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
487 }
488 if (failMask & BsoFailScissor) {
489 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
490 }
491 if (failMask & BsoFailBlend) {
492 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600493 VkPipelineColorBlendAttachmentState att_state = {};
494 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
495 att_state.blendEnable = VK_TRUE;
496 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600497 }
498 if (failMask & BsoFailDepthBounds) {
499 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
500 }
501 if (failMask & BsoFailStencilReadMask) {
502 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
503 }
504 if (failMask & BsoFailStencilWriteMask) {
505 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
506 }
507 if (failMask & BsoFailStencilReference) {
508 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
509 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500510
511 VkDescriptorSetObj descriptorSet(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600512 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500513
514 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbour552f6c02016-12-21 14:34:07 -0700515 m_commandBuffer->BeginCommandBuffer();
516 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500517
Tony Barbourfe3351b2015-07-28 10:17:20 -0600518 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500519
520 // render triangle
Tobin Ehlis379ba3b2016-07-19 11:22:29 -0600521 if (failMask & BsoFailIndexBuffer) {
522 // Use DrawIndexed w/o an index buffer bound
523 DrawIndexed(3, 1, 0, 0, 0);
524 } else {
525 Draw(3, 1, 0, 0);
526 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500527
Mark Muellerd4914412016-06-13 17:52:06 -0600528 if (failMask & BsoFailCmdClearAttachments) {
529 VkClearAttachment color_attachment = {};
530 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700531 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
Mark Muellerd4914412016-06-13 17:52:06 -0600532 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
533
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600534 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Muellerd4914412016-06-13 17:52:06 -0600535 }
536
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500537 // finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -0700538 m_commandBuffer->EndRenderPass();
539 m_commandBuffer->EndCommandBuffer();
Tony Barbourfe3351b2015-07-28 10:17:20 -0600540 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500541}
542
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600543void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj,
544 VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500545 if (m_depthStencil->Initialized()) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600546 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500547 } else {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600548 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500549 }
550
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800551 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700552 // Make sure depthWriteEnable is set so that Depth fail test will work
553 // correctly
554 // Make sure stencilTestEnable is set so that Stencil fail test will work
555 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600556 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800557 stencil.failOp = VK_STENCIL_OP_KEEP;
558 stencil.passOp = VK_STENCIL_OP_KEEP;
559 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
560 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600561
562 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
563 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600564 ds_ci.pNext = NULL;
565 ds_ci.depthTestEnable = VK_FALSE;
566 ds_ci.depthWriteEnable = VK_TRUE;
567 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
568 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600569 if (failMask & BsoFailDepthBounds) {
570 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600571 ds_ci.maxDepthBounds = 0.0f;
572 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600573 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600574 ds_ci.stencilTestEnable = VK_TRUE;
575 ds_ci.front = stencil;
576 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600577
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600578 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600579 pipelineobj.SetViewport(m_viewports);
580 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800581 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600582 VkResult err = pipelineobj.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600583 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800584 commandBuffer->BindPipeline(pipelineobj);
585 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500586}
587
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600588class VkPositiveLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700589 public:
590 protected:
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600591};
592
Ian Elliott2c1daf52016-05-12 09:41:46 -0600593class VkWsiEnabledLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700594 public:
595 protected:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600596 VkWsiEnabledLayerTest() { m_enableWSI = true; }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600597};
598
Mark Muellerdfe37552016-07-07 14:47:42 -0600599class VkBufferTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700600 public:
Mark Muellerdfe37552016-07-07 14:47:42 -0600601 enum eTestEnFlags {
602 eDoubleDelete,
603 eInvalidDeviceOffset,
604 eInvalidMemoryOffset,
605 eBindNullBuffer,
606 eFreeInvalidHandle,
Mark Mueller4042b652016-09-05 22:52:21 -0600607 eNone,
Mark Muellerdfe37552016-07-07 14:47:42 -0600608 };
609
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600610 enum eTestConditions { eOffsetAlignment = 1 };
Mark Muellerdfe37552016-07-07 14:47:42 -0600611
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600612 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice, eTestEnFlags aTestFlag, VkBufferUsageFlags aBufferUsage = 0) {
613 if (eInvalidDeviceOffset != aTestFlag && eInvalidMemoryOffset != aTestFlag) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600614 return true;
615 }
616 VkDeviceSize offset_limit = 0;
617 if (eInvalidMemoryOffset == aTestFlag) {
618 VkBuffer vulkanBuffer;
619 VkBufferCreateInfo buffer_create_info = {};
620 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
621 buffer_create_info.size = 32;
622 buffer_create_info.usage = aBufferUsage;
623
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600624 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr, &vulkanBuffer);
Mark Mueller4042b652016-09-05 22:52:21 -0600625 VkMemoryRequirements memory_reqs = {};
Mark Muellerdfe37552016-07-07 14:47:42 -0600626
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600627 vkGetBufferMemoryRequirements(aVulkanDevice->device(), vulkanBuffer, &memory_reqs);
Mark Muellerdfe37552016-07-07 14:47:42 -0600628 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
629 offset_limit = memory_reqs.alignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600630 } else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
631 offset_limit = aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600632 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600633 offset_limit = aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600634 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600635 offset_limit = aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600636 }
637 if (eOffsetAlignment < offset_limit) {
638 return true;
639 }
640 return false;
641 }
642
643 // A constructor which performs validation tests within construction.
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600644 VkBufferTest(VkDeviceObj *aVulkanDevice, VkBufferUsageFlags aBufferUsage, eTestEnFlags aTestFlag = eNone)
645 : AllocateCurrent(false), BoundCurrent(false), CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600646 if (eBindNullBuffer == aTestFlag) {
647 VulkanMemory = 0;
648 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
649 } else {
650 VkBufferCreateInfo buffer_create_info = {};
651 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
652 buffer_create_info.size = 32;
653 buffer_create_info.usage = aBufferUsage;
654
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600655 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr, &VulkanBuffer);
Mark Muellerdfe37552016-07-07 14:47:42 -0600656
657 CreateCurrent = true;
658
659 VkMemoryRequirements memory_requirements;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600660 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer, &memory_requirements);
Mark Muellerdfe37552016-07-07 14:47:42 -0600661
662 VkMemoryAllocateInfo memory_allocate_info = {};
663 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Stratton77a0d592017-02-17 13:14:13 -0800664 memory_allocate_info.allocationSize = memory_requirements.size + eOffsetAlignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600665 bool pass = aVulkanDevice->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info,
666 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Muellerdfe37552016-07-07 14:47:42 -0600667 if (!pass) {
668 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
669 return;
670 }
671
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600672 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL, &VulkanMemory);
Mark Muellerdfe37552016-07-07 14:47:42 -0600673 AllocateCurrent = true;
674 // NB: 1 is intentionally an invalid offset value
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600675 const bool offset_en = eInvalidDeviceOffset == aTestFlag || eInvalidMemoryOffset == aTestFlag;
676 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, offset_en ? eOffsetAlignment : 0);
Mark Muellerdfe37552016-07-07 14:47:42 -0600677 BoundCurrent = true;
678
679 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
680 }
681 }
682
683 ~VkBufferTest() {
684 if (CreateCurrent) {
685 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
686 }
687 if (AllocateCurrent) {
688 if (InvalidDeleteEn) {
689 union {
690 VkDeviceMemory device_memory;
691 unsigned long long index_access;
692 } bad_index;
693
694 bad_index.device_memory = VulkanMemory;
695 bad_index.index_access++;
696
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600697 vkFreeMemory(VulkanDevice, bad_index.device_memory, nullptr);
Mark Muellerdfe37552016-07-07 14:47:42 -0600698 }
699 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
700 }
701 }
702
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600703 bool GetBufferCurrent() { return AllocateCurrent && BoundCurrent && CreateCurrent; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600704
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600705 const VkBuffer &GetBuffer() { return VulkanBuffer; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600706
707 void TestDoubleDestroy() {
708 // Destroy the buffer but leave the flag set, which will cause
709 // the buffer to be destroyed again in the destructor.
710 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
711 }
712
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700713 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600714 bool AllocateCurrent;
715 bool BoundCurrent;
716 bool CreateCurrent;
717 bool InvalidDeleteEn;
718
719 VkBuffer VulkanBuffer;
720 VkDevice VulkanDevice;
721 VkDeviceMemory VulkanMemory;
Mark Muellerdfe37552016-07-07 14:47:42 -0600722};
723
724class VkVerticesObj {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700725 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600726 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount, unsigned aBindingCount, unsigned aByteStride,
Mark Muellerdfe37552016-07-07 14:47:42 -0600727 VkDeviceSize aVertexCount, const float *aVerticies)
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700728 : BoundCurrent(false),
729 AttributeCount(aAttributeCount),
730 BindingCount(aBindingCount),
731 BindId(BindIdGenerator),
Mark Muellerdfe37552016-07-07 14:47:42 -0600732 PipelineVertexInputStateCreateInfo(),
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600733 VulkanMemoryBuffer(aVulkanDevice, 1, static_cast<int>(aByteStride * aVertexCount),
734 reinterpret_cast<const void *>(aVerticies), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700735 BindIdGenerator++; // NB: This can wrap w/misuse
Mark Muellerdfe37552016-07-07 14:47:42 -0600736
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600737 VertexInputAttributeDescription = new VkVertexInputAttributeDescription[AttributeCount];
738 VertexInputBindingDescription = new VkVertexInputBindingDescription[BindingCount];
Mark Muellerdfe37552016-07-07 14:47:42 -0600739
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600740 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = VertexInputAttributeDescription;
741 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = AttributeCount;
742 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = VertexInputBindingDescription;
743 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = BindingCount;
744 PipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -0600745
746 unsigned i = 0;
747 do {
748 VertexInputAttributeDescription[i].binding = BindId;
749 VertexInputAttributeDescription[i].location = i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600750 VertexInputAttributeDescription[i].format = VK_FORMAT_R32G32B32_SFLOAT;
751 VertexInputAttributeDescription[i].offset = sizeof(float) * aByteStride;
Mark Muellerdfe37552016-07-07 14:47:42 -0600752 i++;
753 } while (AttributeCount < i);
754
755 i = 0;
756 do {
757 VertexInputBindingDescription[i].binding = BindId;
758 VertexInputBindingDescription[i].stride = aByteStride;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600759 VertexInputBindingDescription[i].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
Mark Muellerdfe37552016-07-07 14:47:42 -0600760 i++;
761 } while (BindingCount < i);
762 }
763
764 ~VkVerticesObj() {
765 if (VertexInputAttributeDescription) {
766 delete[] VertexInputAttributeDescription;
767 }
768 if (VertexInputBindingDescription) {
769 delete[] VertexInputBindingDescription;
770 }
771 }
772
773 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600774 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription, AttributeCount);
775 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription, BindingCount);
Mark Muellerdfe37552016-07-07 14:47:42 -0600776 return true;
777 }
778
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600779 void BindVertexBuffers(VkCommandBuffer aCommandBuffer, unsigned aOffsetCount = 0, VkDeviceSize *aOffsetList = nullptr) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600780 VkDeviceSize *offsetList;
781 unsigned offsetCount;
782
783 if (aOffsetCount) {
784 offsetList = aOffsetList;
785 offsetCount = aOffsetCount;
786 } else {
787 offsetList = new VkDeviceSize[1]();
788 offsetCount = 1;
789 }
790
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600791 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount, &VulkanMemoryBuffer.handle(), offsetList);
Mark Muellerdfe37552016-07-07 14:47:42 -0600792 BoundCurrent = true;
793
794 if (!aOffsetCount) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600795 delete[] offsetList;
Mark Muellerdfe37552016-07-07 14:47:42 -0600796 }
797 }
798
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700799 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600800 static uint32_t BindIdGenerator;
801
802 bool BoundCurrent;
803 unsigned AttributeCount;
804 unsigned BindingCount;
805 uint32_t BindId;
806
807 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
808 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
809 VkVertexInputBindingDescription *VertexInputBindingDescription;
810 VkConstantBufferObj VulkanMemoryBuffer;
811};
812
813uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500814// ********************************************************************************************************************
815// ********************************************************************************************************************
816// ********************************************************************************************************************
817// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600818TEST_F(VkLayerTest, RequiredParameter) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700819 TEST_DESCRIPTION(
820 "Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
821 "pointer, array, and array count parameters");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600822
Tony Barbour1fa09702017-03-16 12:09:08 -0600823 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600824
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600825 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pFeatures specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600826 // Specify NULL for a pointer to a handle
827 // Expected to trigger an error with
828 // parameter_validation::validate_required_pointer
829 vkGetPhysicalDeviceFeatures(gpu(), NULL);
830 m_errorMonitor->VerifyFound();
831
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600832 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
833 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600834 // Specify NULL for pointer to array count
835 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600836 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600837 m_errorMonitor->VerifyFound();
838
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600839 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter viewportCount must be greater than 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600840 // Specify 0 for a required array count
841 // Expected to trigger an error with parameter_validation::validate_array
842 VkViewport view_port = {};
843 m_commandBuffer->SetViewport(0, 0, &view_port);
844 m_errorMonitor->VerifyFound();
845
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pViewports specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600847 // Specify NULL for a required array
848 // Expected to trigger an error with parameter_validation::validate_array
849 m_commandBuffer->SetViewport(0, 1, NULL);
850 m_errorMonitor->VerifyFound();
851
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter memory specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600853 // Specify VK_NULL_HANDLE for a required handle
854 // Expected to trigger an error with
855 // parameter_validation::validate_required_handle
856 vkUnmapMemory(device(), VK_NULL_HANDLE);
857 m_errorMonitor->VerifyFound();
858
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600859 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
860 "required parameter pFences[0] specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600861 // Specify VK_NULL_HANDLE for a required handle array entry
862 // Expected to trigger an error with
863 // parameter_validation::validate_required_handle_array
864 VkFence fence = VK_NULL_HANDLE;
865 vkResetFences(device(), 1, &fence);
866 m_errorMonitor->VerifyFound();
867
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600868 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pAllocateInfo specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600869 // Specify NULL for a required struct pointer
870 // Expected to trigger an error with
871 // parameter_validation::validate_struct_type
872 VkDeviceMemory memory = VK_NULL_HANDLE;
873 vkAllocateMemory(device(), NULL, NULL, &memory);
874 m_errorMonitor->VerifyFound();
875
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600876 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of faceMask must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600877 // Specify 0 for a required VkFlags parameter
878 // Expected to trigger an error with parameter_validation::validate_flags
879 m_commandBuffer->SetStencilReference(0, 0);
880 m_errorMonitor->VerifyFound();
881
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600882 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of pSubmits[0].pWaitDstStageMask[0] must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600883 // Specify 0 for a required VkFlags array entry
884 // Expected to trigger an error with
885 // parameter_validation::validate_flags_array
886 VkSemaphore semaphore = VK_NULL_HANDLE;
887 VkPipelineStageFlags stageFlags = 0;
888 VkSubmitInfo submitInfo = {};
889 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
890 submitInfo.waitSemaphoreCount = 1;
891 submitInfo.pWaitSemaphores = &semaphore;
892 submitInfo.pWaitDstStageMask = &stageFlags;
893 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
894 m_errorMonitor->VerifyFound();
895}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600896
Dustin Gravesfce74c02016-05-10 11:42:58 -0600897TEST_F(VkLayerTest, ReservedParameter) {
898 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
899
Tony Barbour1fa09702017-03-16 12:09:08 -0600900 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -0600901
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600902 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must be 0");
Dustin Gravesfce74c02016-05-10 11:42:58 -0600903 // Specify 0 for a reserved VkFlags parameter
904 // Expected to trigger an error with
905 // parameter_validation::validate_reserved_flags
906 VkEvent event_handle = VK_NULL_HANDLE;
907 VkEventCreateInfo event_info = {};
908 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
909 event_info.flags = 1;
910 vkCreateEvent(device(), &event_info, NULL, &event_handle);
911 m_errorMonitor->VerifyFound();
912}
913
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600914TEST_F(VkLayerTest, InvalidStructSType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700915 TEST_DESCRIPTION(
916 "Specify an invalid VkStructureType for a Vulkan "
917 "structure's sType field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600918
Tony Barbour1fa09702017-03-16 12:09:08 -0600919 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600920
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600921 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pAllocateInfo->sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600922 // Zero struct memory, effectively setting sType to
923 // VK_STRUCTURE_TYPE_APPLICATION_INFO
924 // Expected to trigger an error with
925 // parameter_validation::validate_struct_type
926 VkMemoryAllocateInfo alloc_info = {};
927 VkDeviceMemory memory = VK_NULL_HANDLE;
928 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
929 m_errorMonitor->VerifyFound();
930
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600931 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pSubmits[0].sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600932 // Zero struct memory, effectively setting sType to
933 // VK_STRUCTURE_TYPE_APPLICATION_INFO
934 // Expected to trigger an error with
935 // parameter_validation::validate_struct_type_array
936 VkSubmitInfo submit_info = {};
937 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
938 m_errorMonitor->VerifyFound();
939}
940
941TEST_F(VkLayerTest, InvalidStructPNext) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600942 TEST_DESCRIPTION("Specify an invalid value for a Vulkan structure's pNext field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600943
Tony Barbour1fa09702017-03-16 12:09:08 -0600944 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600945
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "value of pCreateInfo->pNext must be NULL");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600947 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be NULL.
Karl Schultz38b50992016-07-11 16:09:09 -0600948 // Need to pick a function that has no allowed pNext structure types.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600949 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Karl Schultz38b50992016-07-11 16:09:09 -0600950 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600951 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600952 // Zero-initialization will provide the correct sType
953 VkApplicationInfo app_info = {};
954 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
955 event_alloc_info.pNext = &app_info;
956 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
957 m_errorMonitor->VerifyFound();
958
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600959 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
960 " chain includes a structure with unexpected VkStructureType ");
Karl Schultz38b50992016-07-11 16:09:09 -0600961 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
962 // a function that has allowed pNext structure types and specify
963 // a structure type that is not allowed.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600964 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600965 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -0600966 VkMemoryAllocateInfo memory_alloc_info = {};
967 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
968 memory_alloc_info.pNext = &app_info;
969 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600970 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600971}
Dustin Graves5d33d532016-05-09 16:21:12 -0600972
973TEST_F(VkLayerTest, UnrecognizedValue) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600974 TEST_DESCRIPTION("Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
Dustin Graves5d33d532016-05-09 16:21:12 -0600975
Tony Barbour1fa09702017-03-16 12:09:08 -0600976 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Graves5d33d532016-05-09 16:21:12 -0600977
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700978 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
979 "does not fall within the begin..end "
980 "range of the core VkFormat "
981 "enumeration tokens");
Dustin Graves5d33d532016-05-09 16:21:12 -0600982 // Specify an invalid VkFormat value
983 // Expected to trigger an error with
984 // parameter_validation::validate_ranged_enum
985 VkFormatProperties format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600986 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000), &format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -0600987 m_errorMonitor->VerifyFound();
988
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -0600990 // Specify an invalid VkFlags bitmask value
991 // Expected to trigger an error with parameter_validation::validate_flags
992 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600993 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
994 static_cast<VkImageUsageFlags>(1 << 25), 0, &image_format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -0600995 m_errorMonitor->VerifyFound();
996
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600997 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -0600998 // Specify an invalid VkFlags array entry
999 // Expected to trigger an error with
1000 // parameter_validation::validate_flags_array
1001 VkSemaphore semaphore = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001002 VkPipelineStageFlags stage_flags = static_cast<VkPipelineStageFlags>(1 << 25);
Dustin Graves5d33d532016-05-09 16:21:12 -06001003 VkSubmitInfo submit_info = {};
1004 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1005 submit_info.waitSemaphoreCount = 1;
1006 submit_info.pWaitSemaphores = &semaphore;
1007 submit_info.pWaitDstStageMask = &stage_flags;
1008 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1009 m_errorMonitor->VerifyFound();
1010
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is neither VK_TRUE nor VK_FALSE");
Dustin Graves5d33d532016-05-09 16:21:12 -06001012 // Specify an invalid VkBool32 value
1013 // Expected to trigger a warning with
1014 // parameter_validation::validate_bool32
1015 VkSampler sampler = VK_NULL_HANDLE;
1016 VkSamplerCreateInfo sampler_info = {};
1017 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1018 sampler_info.pNext = NULL;
1019 sampler_info.magFilter = VK_FILTER_NEAREST;
1020 sampler_info.minFilter = VK_FILTER_NEAREST;
1021 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1022 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1023 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1024 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1025 sampler_info.mipLodBias = 1.0;
1026 sampler_info.maxAnisotropy = 1;
1027 sampler_info.compareEnable = VK_FALSE;
1028 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1029 sampler_info.minLod = 1.0;
1030 sampler_info.maxLod = 1.0;
1031 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1032 sampler_info.unnormalizedCoordinates = VK_FALSE;
1033 // Not VK_TRUE or VK_FALSE
1034 sampler_info.anisotropyEnable = 3;
1035 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1036 m_errorMonitor->VerifyFound();
1037}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001038
1039TEST_F(VkLayerTest, FailedReturnValue) {
1040 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1041
Tony Barbour1fa09702017-03-16 12:09:08 -06001042 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -06001043
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001044 // Find an unsupported image format
1045 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1046 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1047 VkFormat format = static_cast<VkFormat>(f);
1048 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001049 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001050 unsupported = format;
1051 break;
1052 }
1053 }
1054
1055 if (unsupported != VK_FORMAT_UNDEFINED) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001056 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1057 "the requested format is not supported on this device");
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001058 // Specify an unsupported VkFormat value to generate a
1059 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1060 // Expected to trigger a warning from
1061 // parameter_validation::validate_result
1062 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001063 VkResult err = vkGetPhysicalDeviceImageFormatProperties(gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1064 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001065 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1066 m_errorMonitor->VerifyFound();
1067 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001068}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001069
1070TEST_F(VkLayerTest, UpdateBufferAlignment) {
1071 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001072 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001073
Tony Barbour1fa09702017-03-16 12:09:08 -06001074 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001075
1076 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1077 vk_testing::Buffer buffer;
1078 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1079
Tony Barbour552f6c02016-12-21 14:34:07 -07001080 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001081 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001082 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001083 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1084 m_errorMonitor->VerifyFound();
1085
1086 // Introduce failure by using dataSize that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001087 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001088 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1089 m_errorMonitor->VerifyFound();
1090
1091 // Introduce failure by using dataSize that is < 0
1092 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001093 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001094 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1095 m_errorMonitor->VerifyFound();
1096
1097 // Introduce failure by using dataSize that is > 65536
1098 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001099 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001100 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1101 m_errorMonitor->VerifyFound();
1102
Tony Barbour552f6c02016-12-21 14:34:07 -07001103 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001104}
1105
1106TEST_F(VkLayerTest, FillBufferAlignment) {
1107 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1108
Tony Barbour1fa09702017-03-16 12:09:08 -06001109 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001110
1111 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1112 vk_testing::Buffer buffer;
1113 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1114
Tony Barbour552f6c02016-12-21 14:34:07 -07001115 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001116
1117 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001119 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1120 m_errorMonitor->VerifyFound();
1121
1122 // Introduce failure by using size that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001123 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001124 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1125 m_errorMonitor->VerifyFound();
1126
1127 // Introduce failure by using size that is zero
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001128 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be greater than zero");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001129 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1130 m_errorMonitor->VerifyFound();
1131
Tony Barbour552f6c02016-12-21 14:34:07 -07001132 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001133}
Dustin Graves40f35822016-06-23 11:12:53 -06001134
Cortd889ff92016-07-27 09:51:27 -07001135TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1136 VkResult err;
1137
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001138 TEST_DESCRIPTION(
1139 "Attempt to use a non-solid polygon fill mode in a "
1140 "pipeline when this feature is not enabled.");
Cortd889ff92016-07-27 09:51:27 -07001141
Tony Barbour1fa09702017-03-16 12:09:08 -06001142 ASSERT_NO_FATAL_FAILURE(Init());
Cortd889ff92016-07-27 09:51:27 -07001143 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1144
1145 std::vector<const char *> device_extension_names;
1146 auto features = m_device->phy().features();
1147 // Artificially disable support for non-solid fill modes
1148 features.fillModeNonSolid = false;
1149 // The sacrificial device object
1150 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1151
1152 VkRenderpassObj render_pass(&test_device);
1153
1154 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1155 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1156 pipeline_layout_ci.setLayoutCount = 0;
1157 pipeline_layout_ci.pSetLayouts = NULL;
1158
1159 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001160 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Cortd889ff92016-07-27 09:51:27 -07001161 ASSERT_VK_SUCCESS(err);
1162
1163 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1164 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1165 rs_ci.pNext = nullptr;
1166 rs_ci.lineWidth = 1.0f;
1167 rs_ci.rasterizerDiscardEnable = true;
1168
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001169 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1170 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Cortd889ff92016-07-27 09:51:27 -07001171
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001172 // Set polygonMode to unsupported value POINT, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001173 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1174 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001175 {
1176 VkPipelineObj pipe(&test_device);
1177 pipe.AddShader(&vs);
1178 pipe.AddShader(&fs);
1179 pipe.AddColorAttachment();
1180 // Introduce failure by setting unsupported polygon mode
1181 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1182 pipe.SetRasterization(&rs_ci);
1183 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1184 }
1185 m_errorMonitor->VerifyFound();
1186
1187 // Try again with polygonMode=LINE, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1189 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001190 {
1191 VkPipelineObj pipe(&test_device);
1192 pipe.AddShader(&vs);
1193 pipe.AddShader(&fs);
1194 pipe.AddColorAttachment();
1195 // Introduce failure by setting unsupported polygon mode
1196 rs_ci.polygonMode = VK_POLYGON_MODE_LINE;
1197 pipe.SetRasterization(&rs_ci);
1198 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1199 }
1200 m_errorMonitor->VerifyFound();
1201
Cortd889ff92016-07-27 09:51:27 -07001202 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1203}
1204
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001205#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001206TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001207{
1208 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001209 VkFenceCreateInfo fenceInfo = {};
1210 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1211 fenceInfo.pNext = NULL;
1212 fenceInfo.flags = 0;
1213
Mike Weiblencce7ec72016-10-17 19:33:05 -06001214 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001215
Tony Barbour1fa09702017-03-16 12:09:08 -06001216 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001217
1218 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1219 vk_testing::Buffer buffer;
1220 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001221
Tony Barbourfe3351b2015-07-28 10:17:20 -06001222 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001223 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001224 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001225
1226 testFence.init(*m_device, fenceInfo);
1227
1228 // Bypass framework since it does the waits automatically
1229 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001230 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001231 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1232 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001233 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001234 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001235 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001236 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001237 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001238 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001239 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001240
1241 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001242 ASSERT_VK_SUCCESS( err );
1243
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001244 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001245 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001246
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001247 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001248}
1249
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001250TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001251{
1252 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001253 VkFenceCreateInfo fenceInfo = {};
1254 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1255 fenceInfo.pNext = NULL;
1256 fenceInfo.flags = 0;
1257
Mike Weiblencce7ec72016-10-17 19:33:05 -06001258 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001259
Tony Barbour1fa09702017-03-16 12:09:08 -06001260 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001261 ASSERT_NO_FATAL_FAILURE(InitViewport());
1262 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1263
Tony Barbourfe3351b2015-07-28 10:17:20 -06001264 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001265 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001266 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001267
1268 testFence.init(*m_device, fenceInfo);
1269
1270 // Bypass framework since it does the waits automatically
1271 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001272 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001273 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1274 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001275 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001276 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001277 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001278 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001279 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001280 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001281 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001282
1283 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001284 ASSERT_VK_SUCCESS( err );
1285
Jon Ashburnf19916e2016-01-11 13:12:43 -07001286 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001287 VkCommandBufferBeginInfo info = {};
1288 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1289 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001290 info.renderPass = VK_NULL_HANDLE;
1291 info.subpass = 0;
1292 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001293 info.occlusionQueryEnable = VK_FALSE;
1294 info.queryFlags = 0;
1295 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001296
1297 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001298 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001299
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001300 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001301}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001302#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001303
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001304TEST_F(VkLayerTest, SparseBindingImageBufferCreate) {
1305 TEST_DESCRIPTION("Create buffer/image with sparse attributes but without the sparse_binding bit set");
1306
Tony Barbour1fa09702017-03-16 12:09:08 -06001307 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001308
1309 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00669);
1310 VkBuffer buffer;
1311 VkBufferCreateInfo buf_info = {};
1312 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1313 buf_info.pNext = NULL;
1314 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
1315 buf_info.size = 2048;
1316 buf_info.queueFamilyIndexCount = 0;
1317 buf_info.pQueueFamilyIndices = NULL;
1318 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1319 buf_info.flags = VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
1320 vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1321 m_errorMonitor->VerifyFound();
1322
1323 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02160);
1324 VkImage image;
1325 VkImageCreateInfo image_create_info = {};
1326 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1327 image_create_info.pNext = NULL;
1328 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1329 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1330 image_create_info.extent.width = 512;
1331 image_create_info.extent.height = 64;
1332 image_create_info.extent.depth = 1;
1333 image_create_info.mipLevels = 1;
1334 image_create_info.arrayLayers = 1;
1335 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1336 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1337 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1338 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1339 image_create_info.queueFamilyIndexCount = 0;
1340 image_create_info.pQueueFamilyIndices = NULL;
1341 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1342 image_create_info.flags = VK_BUFFER_CREATE_SPARSE_ALIASED_BIT;
1343 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1344 m_errorMonitor->VerifyFound();
1345}
1346
Dave Houlton829c0d82017-01-24 15:09:17 -07001347TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedTypes) {
1348 TEST_DESCRIPTION("Create images with sparse residency with unsupported types");
Tony Barbour1fa09702017-03-16 12:09:08 -06001349 ASSERT_NO_FATAL_FAILURE(InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton829c0d82017-01-24 15:09:17 -07001350
1351 // Determine which device feature are available
Jamie Madill35127872017-03-15 16:17:46 -04001352 VkPhysicalDeviceFeatures available_features = {};
Dave Houlton829c0d82017-01-24 15:09:17 -07001353 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&available_features));
1354
1355 // Mask out device features we don't want
1356 VkPhysicalDeviceFeatures desired_features = available_features;
1357 desired_features.sparseResidencyImage2D = VK_FALSE;
1358 desired_features.sparseResidencyImage3D = VK_FALSE;
Mark Lobodzinski77e590c2017-03-17 12:05:16 -06001359 ASSERT_NO_FATAL_FAILURE(Init(&desired_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001360
1361 VkImage image = VK_NULL_HANDLE;
1362 VkResult result = VK_RESULT_MAX_ENUM;
1363 VkImageCreateInfo image_create_info = {};
1364 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1365 image_create_info.pNext = NULL;
1366 image_create_info.imageType = VK_IMAGE_TYPE_1D;
1367 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1368 image_create_info.extent.width = 512;
1369 image_create_info.extent.height = 1;
1370 image_create_info.extent.depth = 1;
1371 image_create_info.mipLevels = 1;
1372 image_create_info.arrayLayers = 1;
1373 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1374 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1375 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1376 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1377 image_create_info.queueFamilyIndexCount = 0;
1378 image_create_info.pQueueFamilyIndices = NULL;
1379 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1380 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1381
1382 // 1D image w/ sparse residency is an error
1383 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02352);
1384 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1385 m_errorMonitor->VerifyFound();
1386 if (VK_SUCCESS == result) {
1387 vkDestroyImage(m_device->device(), image, NULL);
1388 image = VK_NULL_HANDLE;
1389 }
1390
1391 // 2D image w/ sparse residency when feature isn't available
1392 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1393 image_create_info.extent.height = 64;
1394 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02144);
1395 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1396 m_errorMonitor->VerifyFound();
1397 if (VK_SUCCESS == result) {
1398 vkDestroyImage(m_device->device(), image, NULL);
1399 image = VK_NULL_HANDLE;
1400 }
1401
1402 // 3D image w/ sparse residency when feature isn't available
1403 image_create_info.imageType = VK_IMAGE_TYPE_3D;
1404 image_create_info.extent.depth = 8;
1405 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02145);
1406 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1407 m_errorMonitor->VerifyFound();
1408 if (VK_SUCCESS == result) {
1409 vkDestroyImage(m_device->device(), image, NULL);
1410 image = VK_NULL_HANDLE;
1411 }
1412}
1413
1414TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedSamples) {
1415 TEST_DESCRIPTION("Create images with sparse residency with unsupported tiling or sample counts");
Tony Barbour1fa09702017-03-16 12:09:08 -06001416 ASSERT_NO_FATAL_FAILURE(InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton829c0d82017-01-24 15:09:17 -07001417
1418 // Determine which device feature are available
Jamie Madill35127872017-03-15 16:17:46 -04001419 VkPhysicalDeviceFeatures available_features = {};
Dave Houlton829c0d82017-01-24 15:09:17 -07001420 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&available_features));
1421
1422 // These tests all require that the device support sparse residency for 2D images
1423 if (VK_TRUE != available_features.sparseResidencyImage2D) {
1424 return;
1425 }
1426
1427 // Mask out device features we don't want
1428 VkPhysicalDeviceFeatures desired_features = available_features;
1429 desired_features.sparseResidency2Samples = VK_FALSE;
1430 desired_features.sparseResidency4Samples = VK_FALSE;
1431 desired_features.sparseResidency8Samples = VK_FALSE;
1432 desired_features.sparseResidency16Samples = VK_FALSE;
Mark Lobodzinski77e590c2017-03-17 12:05:16 -06001433 ASSERT_NO_FATAL_FAILURE(Init(&desired_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001434
1435 VkImage image = VK_NULL_HANDLE;
1436 VkResult result = VK_RESULT_MAX_ENUM;
1437 VkImageCreateInfo image_create_info = {};
1438 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1439 image_create_info.pNext = NULL;
1440 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1441 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1442 image_create_info.extent.width = 64;
1443 image_create_info.extent.height = 64;
1444 image_create_info.extent.depth = 1;
1445 image_create_info.mipLevels = 1;
1446 image_create_info.arrayLayers = 1;
1447 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1448 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1449 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1450 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1451 image_create_info.queueFamilyIndexCount = 0;
1452 image_create_info.pQueueFamilyIndices = NULL;
1453 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1454 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1455
1456 // 2D image w/ sparse residency and linear tiling is an error
1457 m_errorMonitor->SetDesiredFailureMsg(
1458 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1459 "VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT then image tiling of VK_IMAGE_TILING_LINEAR is not supported");
1460 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1461 m_errorMonitor->VerifyFound();
1462 if (VK_SUCCESS == result) {
1463 vkDestroyImage(m_device->device(), image, NULL);
1464 image = VK_NULL_HANDLE;
1465 }
1466 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1467
1468 // Multi-sample image w/ sparse residency when feature isn't available (4 flavors)
1469 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
1470 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02146);
1471 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1472 m_errorMonitor->VerifyFound();
1473 if (VK_SUCCESS == result) {
1474 vkDestroyImage(m_device->device(), image, NULL);
1475 image = VK_NULL_HANDLE;
1476 }
1477
1478 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
1479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02147);
1480 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1481 m_errorMonitor->VerifyFound();
1482 if (VK_SUCCESS == result) {
1483 vkDestroyImage(m_device->device(), image, NULL);
1484 image = VK_NULL_HANDLE;
1485 }
1486
1487 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
1488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02148);
1489 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1490 m_errorMonitor->VerifyFound();
1491 if (VK_SUCCESS == result) {
1492 vkDestroyImage(m_device->device(), image, NULL);
1493 image = VK_NULL_HANDLE;
1494 }
1495
1496 image_create_info.samples = VK_SAMPLE_COUNT_16_BIT;
1497 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02149);
1498 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1499 m_errorMonitor->VerifyFound();
1500 if (VK_SUCCESS == result) {
1501 vkDestroyImage(m_device->device(), image, NULL);
1502 image = VK_NULL_HANDLE;
1503 }
1504}
1505
Tobin Ehlisf11be982016-05-11 13:52:53 -06001506TEST_F(VkLayerTest, InvalidMemoryAliasing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001507 TEST_DESCRIPTION(
1508 "Create a buffer and image, allocate memory, and bind the "
1509 "buffer and image to memory such that they will alias.");
Tobin Ehlisf11be982016-05-11 13:52:53 -06001510 VkResult err;
1511 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001512 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf11be982016-05-11 13:52:53 -06001513
Tobin Ehlis077ded32016-05-12 17:39:13 -06001514 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001515 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001516 VkImage image2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001517 VkDeviceMemory mem; // buffer will be bound first
1518 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001519 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Rene Lindsayd14f5572016-12-16 14:57:18 -07001520 VkMemoryRequirements buff_mem_reqs2, img_mem_reqs2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001521
1522 VkBufferCreateInfo buf_info = {};
1523 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1524 buf_info.pNext = NULL;
1525 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1526 buf_info.size = 256;
1527 buf_info.queueFamilyIndexCount = 0;
1528 buf_info.pQueueFamilyIndices = NULL;
1529 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1530 buf_info.flags = 0;
1531 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1532 ASSERT_VK_SUCCESS(err);
1533
Tobin Ehlis077ded32016-05-12 17:39:13 -06001534 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001535
1536 VkImageCreateInfo image_create_info = {};
1537 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1538 image_create_info.pNext = NULL;
1539 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1540 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1541 image_create_info.extent.width = 64;
1542 image_create_info.extent.height = 64;
1543 image_create_info.extent.depth = 1;
1544 image_create_info.mipLevels = 1;
1545 image_create_info.arrayLayers = 1;
1546 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001547 // Image tiling must be optimal to trigger error when aliasing linear buffer
1548 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001549 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1550 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1551 image_create_info.queueFamilyIndexCount = 0;
1552 image_create_info.pQueueFamilyIndices = NULL;
1553 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1554 image_create_info.flags = 0;
1555
Tobin Ehlisf11be982016-05-11 13:52:53 -06001556 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1557 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001558 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
1559 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001560
Tobin Ehlis077ded32016-05-12 17:39:13 -06001561 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1562
1563 VkMemoryAllocateInfo alloc_info = {};
1564 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1565 alloc_info.pNext = NULL;
1566 alloc_info.memoryTypeIndex = 0;
1567 // Ensure memory is big enough for both bindings
1568 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001569 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1570 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001571 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001572 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001573 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinskid2d2d4c2017-02-16 11:51:58 -07001574 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001575 return;
1576 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001577 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1578 ASSERT_VK_SUCCESS(err);
1579 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1580 ASSERT_VK_SUCCESS(err);
1581
Rene Lindsayd14f5572016-12-16 14:57:18 -07001582 vkGetImageMemoryRequirements(m_device->device(), image2, &img_mem_reqs2);
1583
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001584 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001585 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001586 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1587 m_errorMonitor->VerifyFound();
1588
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001589 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001590 // aliasing buffer2
1591 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1592 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001593 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1594 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001595 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001596 ASSERT_VK_SUCCESS(err);
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001597 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is aliased with non-linear image 0x");
Rene Lindsayd14f5572016-12-16 14:57:18 -07001598 vkGetBufferMemoryRequirements(m_device->device(), buffer2, &buff_mem_reqs2);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001599 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001600 m_errorMonitor->VerifyFound();
1601
1602 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001603 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001604 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001605 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001606 vkFreeMemory(m_device->device(), mem, NULL);
1607 vkFreeMemory(m_device->device(), mem_img, NULL);
1608}
1609
Tobin Ehlis35372522016-05-12 08:32:31 -06001610TEST_F(VkLayerTest, InvalidMemoryMapping) {
1611 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1612 VkResult err;
1613 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001614 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis35372522016-05-12 08:32:31 -06001615
1616 VkBuffer buffer;
1617 VkDeviceMemory mem;
1618 VkMemoryRequirements mem_reqs;
1619
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001620 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
1621
Tobin Ehlis35372522016-05-12 08:32:31 -06001622 VkBufferCreateInfo buf_info = {};
1623 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1624 buf_info.pNext = NULL;
1625 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1626 buf_info.size = 256;
1627 buf_info.queueFamilyIndexCount = 0;
1628 buf_info.pQueueFamilyIndices = NULL;
1629 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1630 buf_info.flags = 0;
1631 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1632 ASSERT_VK_SUCCESS(err);
1633
1634 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1635 VkMemoryAllocateInfo alloc_info = {};
1636 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1637 alloc_info.pNext = NULL;
1638 alloc_info.memoryTypeIndex = 0;
1639
1640 // Ensure memory is big enough for both bindings
1641 static const VkDeviceSize allocation_size = 0x10000;
1642 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001643 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001644 if (!pass) {
1645 vkDestroyBuffer(m_device->device(), buffer, NULL);
1646 return;
1647 }
1648 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1649 ASSERT_VK_SUCCESS(err);
1650
1651 uint8_t *pData;
1652 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VkMapMemory: Attempting to map memory range of size zero");
Tobin Ehlis35372522016-05-12 08:32:31 -06001654 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1655 m_errorMonitor->VerifyFound();
1656 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001657 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001658 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001659 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1660 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1661 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001662 m_errorMonitor->VerifyFound();
1663
1664 // Unmap the memory to avoid re-map error
1665 vkUnmapMemory(m_device->device(), mem);
1666 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001667 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1668 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1669 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001670 m_errorMonitor->VerifyFound();
1671 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001672 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
1673 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001674 m_errorMonitor->VerifyFound();
1675 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001676 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06001677 vkUnmapMemory(m_device->device(), mem);
1678 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001679
Tobin Ehlis35372522016-05-12 08:32:31 -06001680 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001681 err = vkMapMemory(m_device->device(), mem, 4 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001682 ASSERT_VK_SUCCESS(err);
1683 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001684 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001685 mmr.memory = mem;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001686 mmr.offset = atom_size; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001687 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
Tobin Ehlis35372522016-05-12 08:32:31 -06001688 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1689 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001690
Tobin Ehlis35372522016-05-12 08:32:31 -06001691 // Now flush range that oversteps mapped range
1692 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001693 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001694 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001695 mmr.offset = atom_size;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001696 mmr.size = 4 * atom_size; // Flushing bounds exceed mapped bounds
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001697 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
1698 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1699 m_errorMonitor->VerifyFound();
1700
1701 // Now flush range with VK_WHOLE_SIZE that oversteps offset
1702 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001703 err = vkMapMemory(m_device->device(), mem, 2 * atom_size, 4 * atom_size, 0, (void **)&pData);
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001704 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001705 mmr.offset = atom_size;
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001706 mmr.size = VK_WHOLE_SIZE;
1707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00643);
Tobin Ehlis35372522016-05-12 08:32:31 -06001708 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1709 m_errorMonitor->VerifyFound();
1710
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001711#if 0 // Planning discussion with working group on this validation check.
Mark Lobodzinski3826a4f2016-11-15 09:38:51 -07001712 // Some platforms have an atomsize of 1 which makes the test meaningless
1713 if (atom_size > 3) {
1714 // Now with an offset NOT a multiple of the device limit
1715 vkUnmapMemory(m_device->device(), mem);
1716 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1717 ASSERT_VK_SUCCESS(err);
1718 mmr.offset = 3; // Not a multiple of atom_size
1719 mmr.size = VK_WHOLE_SIZE;
1720 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00644);
1721 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1722 m_errorMonitor->VerifyFound();
1723
1724 // Now with a size NOT a multiple of the device limit
1725 vkUnmapMemory(m_device->device(), mem);
1726 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1727 ASSERT_VK_SUCCESS(err);
1728 mmr.offset = atom_size;
1729 mmr.size = 2 * atom_size + 1; // Not a multiple of atom_size
1730 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00645);
1731 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1732 m_errorMonitor->VerifyFound();
1733 }
Tony Barboure3975eb2016-12-15 14:52:44 -07001734#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001735 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1736 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001737 if (!pass) {
1738 vkFreeMemory(m_device->device(), mem, NULL);
1739 vkDestroyBuffer(m_device->device(), buffer, NULL);
1740 return;
1741 }
1742 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1743 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1744
1745 vkDestroyBuffer(m_device->device(), buffer, NULL);
1746 vkFreeMemory(m_device->device(), mem, NULL);
1747}
1748
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001749#if 0 // disabled until PV gets real extension enable checks
Ian Elliott1c32c772016-04-28 14:47:13 -06001750TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1751 VkResult err;
1752 bool pass;
1753
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001754 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
1755 // following declaration (which is temporarily being moved below):
1756 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001757 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001758 VkSwapchainCreateInfoKHR swapchain_create_info = {VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR};
Ian Elliott1c32c772016-04-28 14:47:13 -06001759 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001760 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06001761 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001762 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001763
Tony Barbour1fa09702017-03-16 12:09:08 -06001764 ASSERT_NO_FATAL_FAILURE(Init());
Ian Elliott1c32c772016-04-28 14:47:13 -06001765
Ian Elliott3f06ce52016-04-29 14:46:21 -06001766#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1767#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1768 // Use the functions from the VK_KHR_android_surface extension without
1769 // enabling that extension:
1770
1771 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001772 VkAndroidSurfaceCreateInfoKHR android_create_info = {VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001773 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1774 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001775 pass = (err != VK_SUCCESS);
1776 ASSERT_TRUE(pass);
1777 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001778#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001779
Ian Elliott3f06ce52016-04-29 14:46:21 -06001780#if defined(VK_USE_PLATFORM_MIR_KHR)
1781 // Use the functions from the VK_KHR_mir_surface extension without enabling
1782 // that extension:
1783
1784 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001785 VkMirSurfaceCreateInfoKHR mir_create_info = {VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001786 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001787 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1788 pass = (err != VK_SUCCESS);
1789 ASSERT_TRUE(pass);
1790 m_errorMonitor->VerifyFound();
1791
1792 // Tell whether an mir_connection supports presentation:
1793 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001794 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1795 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001796 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001797#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001798
Ian Elliott3f06ce52016-04-29 14:46:21 -06001799#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1800 // Use the functions from the VK_KHR_wayland_surface extension without
1801 // enabling that extension:
1802
1803 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001804 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1806 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001807 pass = (err != VK_SUCCESS);
1808 ASSERT_TRUE(pass);
1809 m_errorMonitor->VerifyFound();
1810
1811 // Tell whether an wayland_display supports presentation:
1812 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001813 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1814 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001815 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001816#endif // VK_USE_PLATFORM_WAYLAND_KHR
1817#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001818
Ian Elliott3f06ce52016-04-29 14:46:21 -06001819#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001820 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1821 // TO NON-LINUX PLATFORMS:
1822 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001823 // Use the functions from the VK_KHR_win32_surface extension without
1824 // enabling that extension:
1825
1826 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001827 VkWin32SurfaceCreateInfoKHR win32_create_info = {VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001828 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1829 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001830 pass = (err != VK_SUCCESS);
1831 ASSERT_TRUE(pass);
1832 m_errorMonitor->VerifyFound();
1833
1834 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001835 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001836 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001837 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001838// Set this (for now, until all platforms are supported and tested):
1839#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001840#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001841#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001842 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1843 // TO NON-LINUX PLATFORMS:
1844 VkSurfaceKHR surface = VK_NULL_HANDLE;
Tony Barbour2e7bd402016-11-14 14:46:33 -07001845#endif
1846#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott1c32c772016-04-28 14:47:13 -06001847 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1848 // that extension:
1849
1850 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001851 VkXcbSurfaceCreateInfoKHR xcb_create_info = {VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001853 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1854 pass = (err != VK_SUCCESS);
1855 ASSERT_TRUE(pass);
1856 m_errorMonitor->VerifyFound();
1857
1858 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001859 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001860 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001861 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1862 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06001863 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001864// Set this (for now, until all platforms are supported and tested):
1865#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001866#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott1c32c772016-04-28 14:47:13 -06001867
Ian Elliott12630812016-04-29 14:35:43 -06001868#if defined(VK_USE_PLATFORM_XLIB_KHR)
1869 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1870 // that extension:
1871
1872 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001873 VkXlibSurfaceCreateInfoKHR xlib_create_info = {VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001875 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1876 pass = (err != VK_SUCCESS);
1877 ASSERT_TRUE(pass);
1878 m_errorMonitor->VerifyFound();
1879
1880 // Tell whether an Xlib VisualID supports presentation:
1881 Display *dpy = NULL;
1882 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001884 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1885 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001886// Set this (for now, until all platforms are supported and tested):
1887#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001888#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott12630812016-04-29 14:35:43 -06001889
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001890// Use the functions from the VK_KHR_surface extension without enabling
1891// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001892
Ian Elliott489eec02016-05-05 14:12:44 -06001893#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001894 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001895 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001896 vkDestroySurfaceKHR(instance(), surface, NULL);
1897 m_errorMonitor->VerifyFound();
1898
1899 // Check if surface supports presentation:
1900 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001901 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001902 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1903 pass = (err != VK_SUCCESS);
1904 ASSERT_TRUE(pass);
1905 m_errorMonitor->VerifyFound();
1906
1907 // Check surface capabilities:
1908 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1910 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06001911 pass = (err != VK_SUCCESS);
1912 ASSERT_TRUE(pass);
1913 m_errorMonitor->VerifyFound();
1914
1915 // Check surface formats:
1916 uint32_t format_count = 0;
1917 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001918 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1919 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06001920 pass = (err != VK_SUCCESS);
1921 ASSERT_TRUE(pass);
1922 m_errorMonitor->VerifyFound();
1923
1924 // Check surface present modes:
1925 uint32_t present_mode_count = 0;
1926 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001927 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1928 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06001929 pass = (err != VK_SUCCESS);
1930 ASSERT_TRUE(pass);
1931 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001932#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001933
Ian Elliott1c32c772016-04-28 14:47:13 -06001934 // Use the functions from the VK_KHR_swapchain extension without enabling
1935 // that extension:
1936
1937 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001939 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1940 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001941 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06001942 pass = (err != VK_SUCCESS);
1943 ASSERT_TRUE(pass);
1944 m_errorMonitor->VerifyFound();
1945
1946 // Get the images from the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1948 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06001949 pass = (err != VK_SUCCESS);
1950 ASSERT_TRUE(pass);
1951 m_errorMonitor->VerifyFound();
1952
Chris Forbeseb7d5502016-09-13 18:19:21 +12001953 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
1954 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
1955 VkFence fence;
1956 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
1957
Ian Elliott1c32c772016-04-28 14:47:13 -06001958 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001959 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12001960 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06001961 pass = (err != VK_SUCCESS);
1962 ASSERT_TRUE(pass);
1963 m_errorMonitor->VerifyFound();
1964
Chris Forbeseb7d5502016-09-13 18:19:21 +12001965 vkDestroyFence(m_device->device(), fence, nullptr);
1966
Ian Elliott1c32c772016-04-28 14:47:13 -06001967 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001968 //
1969 // NOTE: Currently can't test this because a real swapchain is needed (as
1970 // opposed to the fake one we created) in order for the layer to lookup the
1971 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001972
1973 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001975 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1976 m_errorMonitor->VerifyFound();
1977}
Chris Forbes09368e42016-10-13 11:59:22 +13001978#endif
Ian Elliott1c32c772016-04-28 14:47:13 -06001979
Karl Schultz6addd812016-02-02 17:17:23 -07001980TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1981 VkResult err;
1982 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001983
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001984 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1985 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001986
Tony Barbour1fa09702017-03-16 12:09:08 -06001987 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001988
1989 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001990 VkImage image;
1991 VkDeviceMemory mem;
1992 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001993
Karl Schultz6addd812016-02-02 17:17:23 -07001994 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1995 const int32_t tex_width = 32;
1996 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001997
Tony Barboureb254902015-07-15 12:50:33 -06001998 VkImageCreateInfo image_create_info = {};
1999 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002000 image_create_info.pNext = NULL;
2001 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2002 image_create_info.format = tex_format;
2003 image_create_info.extent.width = tex_width;
2004 image_create_info.extent.height = tex_height;
2005 image_create_info.extent.depth = 1;
2006 image_create_info.mipLevels = 1;
2007 image_create_info.arrayLayers = 1;
2008 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2009 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2010 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2011 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12002012 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002013
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002014 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002015 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002016 mem_alloc.pNext = NULL;
2017 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002018
Chia-I Wuf7458c52015-10-26 21:10:41 +08002019 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002020 ASSERT_VK_SUCCESS(err);
2021
Karl Schultz6addd812016-02-02 17:17:23 -07002022 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002023
Mark Lobodzinski23065352015-05-29 09:32:35 -05002024 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002025
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002026 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002027 if (!pass) { // If we can't find any unmappable memory this test doesn't
2028 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002029 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002030 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002031 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002032
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002033 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002034 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002035 ASSERT_VK_SUCCESS(err);
2036
2037 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002038 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002039 ASSERT_VK_SUCCESS(err);
2040
2041 // Map memory as if to initialize the image
2042 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002043 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002044
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002045 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002046
Chia-I Wuf7458c52015-10-26 21:10:41 +08002047 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002048 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002049}
2050
Karl Schultz6addd812016-02-02 17:17:23 -07002051TEST_F(VkLayerTest, RebindMemory) {
2052 VkResult err;
2053 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002054
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002055 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002056
Tony Barbour1fa09702017-03-16 12:09:08 -06002057 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002058
2059 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002060 VkImage image;
2061 VkDeviceMemory mem1;
2062 VkDeviceMemory mem2;
2063 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002064
Karl Schultz6addd812016-02-02 17:17:23 -07002065 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2066 const int32_t tex_width = 32;
2067 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002068
Tony Barboureb254902015-07-15 12:50:33 -06002069 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002070 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2071 image_create_info.pNext = NULL;
2072 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2073 image_create_info.format = tex_format;
2074 image_create_info.extent.width = tex_width;
2075 image_create_info.extent.height = tex_height;
2076 image_create_info.extent.depth = 1;
2077 image_create_info.mipLevels = 1;
2078 image_create_info.arrayLayers = 1;
2079 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2080 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2081 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2082 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002083
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002084 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002085 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2086 mem_alloc.pNext = NULL;
2087 mem_alloc.allocationSize = 0;
2088 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002089
Karl Schultz6addd812016-02-02 17:17:23 -07002090 // Introduce failure, do NOT set memProps to
2091 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002092 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002093 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002094 ASSERT_VK_SUCCESS(err);
2095
Karl Schultz6addd812016-02-02 17:17:23 -07002096 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002097
2098 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002099 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002100 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002101
2102 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002103 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002104 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002105 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002106 ASSERT_VK_SUCCESS(err);
2107
2108 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002109 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002110 ASSERT_VK_SUCCESS(err);
2111
Karl Schultz6addd812016-02-02 17:17:23 -07002112 // Introduce validation failure, try to bind a different memory object to
2113 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002114 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002115
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002116 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002117
Chia-I Wuf7458c52015-10-26 21:10:41 +08002118 vkDestroyImage(m_device->device(), image, NULL);
2119 vkFreeMemory(m_device->device(), mem1, NULL);
2120 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002121}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002122
Karl Schultz6addd812016-02-02 17:17:23 -07002123TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002124 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002125
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002126 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2127 "submitted in SIGNALED state. Fences "
2128 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002129
2130 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002131 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2132 fenceInfo.pNext = NULL;
2133 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002134
Tony Barbour1fa09702017-03-16 12:09:08 -06002135 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour300a6082015-04-07 13:44:53 -06002136 ASSERT_NO_FATAL_FAILURE(InitViewport());
2137 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2138
Tony Barbour552f6c02016-12-21 14:34:07 -07002139 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002140 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07002141 m_commandBuffer->EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002142
2143 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002144
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002145 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002146 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2147 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002148 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002149 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002150 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002151 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002152 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002153 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002154 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002155
2156 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002157 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002158
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002159 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002160}
Chris Forbes4e44c912016-06-16 10:20:00 +12002161
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002162TEST_F(VkLayerTest, InvalidUsageBits) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002163 TEST_DESCRIPTION(
2164 "Specify wrong usage for image then create conflicting view of image "
2165 "Initialize buffer with wrong usage then perform copy expecting errors "
2166 "from both the image and the buffer (2 calls)");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002167 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002168
Tony Barbour1fa09702017-03-16 12:09:08 -06002169 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002170
Tony Barbourf887b162017-03-09 10:06:46 -07002171 auto format = find_depth_stencil_format(m_device);
2172 if (!format) {
2173 printf(" No Depth + Stencil format found. Skipped.\n");
2174 return;
2175 }
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002176
Tony Barbourf92621a2016-05-02 14:28:12 -06002177 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06002178 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002179 image.init(128, 128, format, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002180 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06002181
Tony Barbourf92621a2016-05-02 14:28:12 -06002182 VkImageView dsv;
2183 VkImageViewCreateInfo dsvci = {};
2184 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2185 dsvci.image = image.handle();
2186 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002187 dsvci.format = format;
Tony Barbourf92621a2016-05-02 14:28:12 -06002188 dsvci.subresourceRange.layerCount = 1;
2189 dsvci.subresourceRange.baseMipLevel = 0;
2190 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002191 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002192
Tony Barbourf92621a2016-05-02 14:28:12 -06002193 // Create a view with depth / stencil aspect for image with different usage
2194 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002195
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002196 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002197
2198 // Initialize buffer with TRANSFER_DST usage
2199 vk_testing::Buffer buffer;
2200 VkMemoryPropertyFlags reqs = 0;
2201 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2202 VkBufferImageCopy region = {};
2203 region.bufferRowLength = 128;
2204 region.bufferImageHeight = 128;
Mark Lobodzinski80871462017-02-16 10:37:27 -07002205 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Tony Barbourf92621a2016-05-02 14:28:12 -06002206 region.imageSubresource.layerCount = 1;
2207 region.imageExtent.height = 16;
2208 region.imageExtent.width = 16;
2209 region.imageExtent.depth = 1;
2210
Mark Lobodzinski80871462017-02-16 10:37:27 -07002211 // Buffer usage not set to TRANSFER_SRC and image usage not set to TRANSFER_DST
Tony Barbour552f6c02016-12-21 14:34:07 -07002212 m_commandBuffer->BeginCommandBuffer();
Tony Barbourf92621a2016-05-02 14:28:12 -06002213
Chris Forbesda581202016-10-06 18:25:26 +13002214 // two separate errors from this call:
2215 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "image should have VK_IMAGE_USAGE_TRANSFER_DST_BIT");
2216 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "buffer should have VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
2217
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002218 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
2219 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06002220 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002221}
Tony Barbour75d79f02016-08-30 09:39:07 -06002222
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002223TEST_F(VkLayerTest, LeakAnObject) {
2224 VkResult err;
2225
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002226 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002227
2228 // Note that we have to create a new device since destroying the
2229 // framework's device causes Teardown() to fail and just calling Teardown
2230 // will destroy the errorMonitor.
2231
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002232 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002233
Tony Barbour1fa09702017-03-16 12:09:08 -06002234 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002235
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002236 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002237 std::vector<VkDeviceQueueCreateInfo> queue_info;
2238 queue_info.reserve(queue_props.size());
2239 std::vector<std::vector<float>> queue_priorities;
2240 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2241 VkDeviceQueueCreateInfo qi = {};
2242 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2243 qi.pNext = NULL;
2244 qi.queueFamilyIndex = i;
2245 qi.queueCount = queue_props[i].queueCount;
2246 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2247 qi.pQueuePriorities = queue_priorities[i].data();
2248 queue_info.push_back(qi);
2249 }
2250
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002251 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002252
2253 // The sacrificial device object
2254 VkDevice testDevice;
2255 VkDeviceCreateInfo device_create_info = {};
2256 auto features = m_device->phy().features();
2257 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2258 device_create_info.pNext = NULL;
2259 device_create_info.queueCreateInfoCount = queue_info.size();
2260 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06002261 device_create_info.enabledLayerCount = 0;
2262 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002263 device_create_info.pEnabledFeatures = &features;
2264 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2265 ASSERT_VK_SUCCESS(err);
2266
2267 VkFence fence;
2268 VkFenceCreateInfo fence_create_info = {};
2269 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2270 fence_create_info.pNext = NULL;
2271 fence_create_info.flags = 0;
2272 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2273 ASSERT_VK_SUCCESS(err);
2274
2275 // Induce failure by not calling vkDestroyFence
2276 vkDestroyDevice(testDevice, NULL);
2277 m_errorMonitor->VerifyFound();
2278}
2279
2280TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002281 TEST_DESCRIPTION(
2282 "Allocate command buffers from one command pool and "
2283 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002284
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002285 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002286
Tony Barbour1fa09702017-03-16 12:09:08 -06002287 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002288 VkCommandPool command_pool_one;
2289 VkCommandPool command_pool_two;
2290
2291 VkCommandPoolCreateInfo pool_create_info{};
2292 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2293 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2294 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2295
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002296 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002297
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002298 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002299
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002300 VkCommandBuffer cb;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002301 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002302 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002303 command_buffer_allocate_info.commandPool = command_pool_one;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002304 command_buffer_allocate_info.commandBufferCount = 1;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002305 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002306 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002307
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002308 vkFreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002309
2310 m_errorMonitor->VerifyFound();
2311
2312 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2313 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2314}
2315
2316TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2317 VkResult err;
2318
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002319 TEST_DESCRIPTION(
2320 "Allocate descriptor sets from one DS pool and "
2321 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002322
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002323 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002324
Tony Barbour1fa09702017-03-16 12:09:08 -06002325 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002326 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2327
2328 VkDescriptorPoolSize ds_type_count = {};
2329 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2330 ds_type_count.descriptorCount = 1;
2331
2332 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2333 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2334 ds_pool_ci.pNext = NULL;
2335 ds_pool_ci.flags = 0;
2336 ds_pool_ci.maxSets = 1;
2337 ds_pool_ci.poolSizeCount = 1;
2338 ds_pool_ci.pPoolSizes = &ds_type_count;
2339
2340 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002341 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002342 ASSERT_VK_SUCCESS(err);
2343
2344 // Create a second descriptor pool
2345 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002346 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002347 ASSERT_VK_SUCCESS(err);
2348
2349 VkDescriptorSetLayoutBinding dsl_binding = {};
2350 dsl_binding.binding = 0;
2351 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2352 dsl_binding.descriptorCount = 1;
2353 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2354 dsl_binding.pImmutableSamplers = NULL;
2355
2356 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2357 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2358 ds_layout_ci.pNext = NULL;
2359 ds_layout_ci.bindingCount = 1;
2360 ds_layout_ci.pBindings = &dsl_binding;
2361
2362 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002363 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002364 ASSERT_VK_SUCCESS(err);
2365
2366 VkDescriptorSet descriptorSet;
2367 VkDescriptorSetAllocateInfo alloc_info = {};
2368 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2369 alloc_info.descriptorSetCount = 1;
2370 alloc_info.descriptorPool = ds_pool_one;
2371 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002372 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002373 ASSERT_VK_SUCCESS(err);
2374
2375 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2376
2377 m_errorMonitor->VerifyFound();
2378
2379 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2380 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2381 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2382}
2383
2384TEST_F(VkLayerTest, CreateUnknownObject) {
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002385 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00788);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002386
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002387 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002388
Tony Barbour1fa09702017-03-16 12:09:08 -06002389 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002390
2391 // Pass bogus handle into GetImageMemoryRequirements
2392 VkMemoryRequirements mem_reqs;
2393 uint64_t fakeImageHandle = 0xCADECADE;
2394 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2395
2396 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2397
2398 m_errorMonitor->VerifyFound();
2399}
2400
Mike Schuchardt17838902017-02-21 09:48:06 -07002401TEST_F(VkLayerTest, UseObjectWithWrongDevice) {
2402 TEST_DESCRIPTION(
2403 "Try to destroy a render pass object using a device other than the one it was created on. "
2404 "This should generate a distinct error from the invalid handle error.");
2405 // Create first device and renderpass
Tony Barbour1fa09702017-03-16 12:09:08 -06002406 ASSERT_NO_FATAL_FAILURE(Init());
Mike Schuchardt17838902017-02-21 09:48:06 -07002407 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2408
2409 // Create second device
2410 float priorities[] = {1.0f};
2411 VkDeviceQueueCreateInfo queue_info{};
2412 queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2413 queue_info.pNext = NULL;
2414 queue_info.flags = 0;
2415 queue_info.queueFamilyIndex = 0;
2416 queue_info.queueCount = 1;
2417 queue_info.pQueuePriorities = &priorities[0];
2418
2419 VkDeviceCreateInfo device_create_info = {};
2420 auto features = m_device->phy().features();
2421 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2422 device_create_info.pNext = NULL;
2423 device_create_info.queueCreateInfoCount = 1;
2424 device_create_info.pQueueCreateInfos = &queue_info;
2425 device_create_info.enabledLayerCount = 0;
2426 device_create_info.ppEnabledLayerNames = NULL;
2427 device_create_info.pEnabledFeatures = &features;
2428
2429 VkDevice second_device;
2430 ASSERT_VK_SUCCESS(vkCreateDevice(gpu(), &device_create_info, NULL, &second_device));
2431
2432 // Try to destroy the renderpass from the first device using the second device
2433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00399);
2434 vkDestroyRenderPass(second_device, m_renderPass, NULL);
2435 m_errorMonitor->VerifyFound();
2436
2437 vkDestroyDevice(second_device, NULL);
2438}
2439
Karl Schultz6addd812016-02-02 17:17:23 -07002440TEST_F(VkLayerTest, PipelineNotBound) {
2441 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002442
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002443 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002444
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002445 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002446
Tony Barbour1fa09702017-03-16 12:09:08 -06002447 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002448 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002449
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002450 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002451 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2452 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002453
2454 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002455 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2456 ds_pool_ci.pNext = NULL;
2457 ds_pool_ci.maxSets = 1;
2458 ds_pool_ci.poolSizeCount = 1;
2459 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002460
2461 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002462 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002463 ASSERT_VK_SUCCESS(err);
2464
2465 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002466 dsl_binding.binding = 0;
2467 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2468 dsl_binding.descriptorCount = 1;
2469 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2470 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002471
2472 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002473 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2474 ds_layout_ci.pNext = NULL;
2475 ds_layout_ci.bindingCount = 1;
2476 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002477
2478 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002479 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002480 ASSERT_VK_SUCCESS(err);
2481
2482 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002483 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002484 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002485 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002486 alloc_info.descriptorPool = ds_pool;
2487 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002488 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002489 ASSERT_VK_SUCCESS(err);
2490
2491 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002492 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2493 pipeline_layout_ci.pNext = NULL;
2494 pipeline_layout_ci.setLayoutCount = 1;
2495 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002496
2497 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002498 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002499 ASSERT_VK_SUCCESS(err);
2500
Mark Youngad779052016-01-06 14:26:04 -07002501 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002502
Tony Barbour552f6c02016-12-21 14:34:07 -07002503 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002504 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002505
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002506 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002507
Chia-I Wuf7458c52015-10-26 21:10:41 +08002508 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2509 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2510 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002511}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002512
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002513TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
2514 VkResult err;
2515
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002516 TEST_DESCRIPTION(
2517 "Test validation check for an invalid memory type index "
2518 "during bind[Buffer|Image]Memory time");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002519
Tony Barbour1fa09702017-03-16 12:09:08 -06002520 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002521
2522 // Create an image, allocate memory, set a bad typeIndex and then try to
2523 // bind it
2524 VkImage image;
2525 VkDeviceMemory mem;
2526 VkMemoryRequirements mem_reqs;
2527 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2528 const int32_t tex_width = 32;
2529 const int32_t tex_height = 32;
2530
2531 VkImageCreateInfo image_create_info = {};
2532 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2533 image_create_info.pNext = NULL;
2534 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2535 image_create_info.format = tex_format;
2536 image_create_info.extent.width = tex_width;
2537 image_create_info.extent.height = tex_height;
2538 image_create_info.extent.depth = 1;
2539 image_create_info.mipLevels = 1;
2540 image_create_info.arrayLayers = 1;
2541 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2542 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2543 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2544 image_create_info.flags = 0;
2545
2546 VkMemoryAllocateInfo mem_alloc = {};
2547 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2548 mem_alloc.pNext = NULL;
2549 mem_alloc.allocationSize = 0;
2550 mem_alloc.memoryTypeIndex = 0;
2551
2552 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2553 ASSERT_VK_SUCCESS(err);
2554
2555 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
2556 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002557
2558 // Introduce Failure, select invalid TypeIndex
2559 VkPhysicalDeviceMemoryProperties memory_info;
2560
2561 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
2562 unsigned int i;
2563 for (i = 0; i < memory_info.memoryTypeCount; i++) {
2564 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
2565 mem_alloc.memoryTypeIndex = i;
2566 break;
2567 }
2568 }
2569 if (i >= memory_info.memoryTypeCount) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002570 printf(" No invalid memory type index could be found; skipped.\n");
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002571 vkDestroyImage(m_device->device(), image, NULL);
2572 return;
2573 }
2574
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002575 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002576
2577 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
2578 ASSERT_VK_SUCCESS(err);
2579
2580 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2581 (void)err;
2582
2583 m_errorMonitor->VerifyFound();
2584
2585 vkDestroyImage(m_device->device(), image, NULL);
2586 vkFreeMemory(m_device->device(), mem, NULL);
2587}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002588
Karl Schultz6addd812016-02-02 17:17:23 -07002589TEST_F(VkLayerTest, BindInvalidMemory) {
2590 VkResult err;
2591 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002592
Tony Barbour1fa09702017-03-16 12:09:08 -06002593 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002594
Cortf801b982017-01-17 18:10:21 -08002595 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
Cort Strattonde748202017-02-17 12:50:01 -08002596 const int32_t tex_width = 256;
2597 const int32_t tex_height = 256;
Tobin Ehlisec598302015-09-15 15:02:17 -06002598
2599 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002600 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2601 image_create_info.pNext = NULL;
2602 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2603 image_create_info.format = tex_format;
2604 image_create_info.extent.width = tex_width;
2605 image_create_info.extent.height = tex_height;
2606 image_create_info.extent.depth = 1;
2607 image_create_info.mipLevels = 1;
2608 image_create_info.arrayLayers = 1;
2609 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002610 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -07002611 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2612 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002613
Cortf801b982017-01-17 18:10:21 -08002614 VkBufferCreateInfo buffer_create_info = {};
2615 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2616 buffer_create_info.pNext = NULL;
2617 buffer_create_info.flags = 0;
Cort Strattonde748202017-02-17 12:50:01 -08002618 buffer_create_info.size = 4 * 1024 * 1024;
2619 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
Cortf801b982017-01-17 18:10:21 -08002620 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tobin Ehlisec598302015-09-15 15:02:17 -06002621
Cortf801b982017-01-17 18:10:21 -08002622 // Create an image/buffer, allocate memory, free it, and then try to bind it
2623 {
2624 VkImage image = VK_NULL_HANDLE;
2625 VkBuffer buffer = VK_NULL_HANDLE;
2626 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2627 ASSERT_VK_SUCCESS(err);
2628 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2629 ASSERT_VK_SUCCESS(err);
2630 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2631 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2632 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002633
Cortf801b982017-01-17 18:10:21 -08002634 VkMemoryAllocateInfo image_mem_alloc = {}, buffer_mem_alloc = {};
2635 image_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2636 image_mem_alloc.allocationSize = image_mem_reqs.size;
2637 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_mem_alloc, 0);
2638 ASSERT_TRUE(pass);
2639 buffer_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2640 buffer_mem_alloc.allocationSize = buffer_mem_reqs.size;
2641 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_mem_alloc, 0);
2642 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002643
Cortf801b982017-01-17 18:10:21 -08002644 VkDeviceMemory image_mem = VK_NULL_HANDLE, buffer_mem = VK_NULL_HANDLE;
2645 err = vkAllocateMemory(device(), &image_mem_alloc, NULL, &image_mem);
2646 ASSERT_VK_SUCCESS(err);
2647 err = vkAllocateMemory(device(), &buffer_mem_alloc, NULL, &buffer_mem);
2648 ASSERT_VK_SUCCESS(err);
Tobin Ehlisec598302015-09-15 15:02:17 -06002649
Cortf801b982017-01-17 18:10:21 -08002650 vkFreeMemory(device(), image_mem, NULL);
2651 vkFreeMemory(device(), buffer_mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002652
Cortf801b982017-01-17 18:10:21 -08002653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00809);
2654 err = vkBindImageMemory(device(), image, image_mem, 0);
2655 (void)err; // This may very well return an error.
2656 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002657
Cortf801b982017-01-17 18:10:21 -08002658 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00800);
2659 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2660 (void)err; // This may very well return an error.
2661 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002662
Cortf801b982017-01-17 18:10:21 -08002663 vkDestroyImage(m_device->device(), image, NULL);
2664 vkDestroyBuffer(m_device->device(), buffer, NULL);
2665 }
Cort Strattonc21601b2017-01-28 14:16:16 -08002666
2667 // Try to bind memory to an object that already has a memory binding
2668 {
2669 VkImage image = VK_NULL_HANDLE;
2670 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2671 ASSERT_VK_SUCCESS(err);
2672 VkBuffer buffer = VK_NULL_HANDLE;
2673 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2674 ASSERT_VK_SUCCESS(err);
2675 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2676 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2677 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2678 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2679 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2680 image_alloc_info.allocationSize = image_mem_reqs.size;
2681 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2682 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
2683 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2684 ASSERT_TRUE(pass);
2685 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2686 ASSERT_TRUE(pass);
2687 VkDeviceMemory image_mem, buffer_mem;
2688 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2689 ASSERT_VK_SUCCESS(err);
2690 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2691 ASSERT_VK_SUCCESS(err);
2692
2693 err = vkBindImageMemory(device(), image, image_mem, 0);
2694 ASSERT_VK_SUCCESS(err);
2695 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00803);
2696 err = vkBindImageMemory(device(), image, image_mem, 0);
2697 (void)err; // This may very well return an error.
2698 m_errorMonitor->VerifyFound();
2699
2700 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2701 ASSERT_VK_SUCCESS(err);
2702 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00791);
2703 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2704 (void)err; // This may very well return an error.
2705 m_errorMonitor->VerifyFound();
2706
2707 vkFreeMemory(device(), image_mem, NULL);
2708 vkFreeMemory(device(), buffer_mem, NULL);
2709 vkDestroyImage(device(), image, NULL);
2710 vkDestroyBuffer(device(), buffer, NULL);
2711 }
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002712
Cort Strattonde748202017-02-17 12:50:01 -08002713 // Try to bind memory to an object with an invalid memoryOffset
Cort6c7dff72017-01-27 18:34:50 -08002714 {
2715 VkImage image = VK_NULL_HANDLE;
2716 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2717 ASSERT_VK_SUCCESS(err);
2718 VkBuffer buffer = VK_NULL_HANDLE;
2719 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2720 ASSERT_VK_SUCCESS(err);
2721 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2722 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2723 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2724 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2725 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002726 // Leave some extra space for alignment wiggle room
2727 image_alloc_info.allocationSize = image_mem_reqs.size + image_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002728 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002729 buffer_alloc_info.allocationSize = buffer_mem_reqs.size + buffer_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002730 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2731 ASSERT_TRUE(pass);
2732 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2733 ASSERT_TRUE(pass);
2734 VkDeviceMemory image_mem, buffer_mem;
2735 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2736 ASSERT_VK_SUCCESS(err);
2737 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2738 ASSERT_VK_SUCCESS(err);
2739
Cort Strattonde748202017-02-17 12:50:01 -08002740 // Test unaligned memory offset
2741 {
2742 if (image_mem_reqs.alignment > 1) {
2743 VkDeviceSize image_offset = 1;
2744 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02178);
2745 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2746 (void)err; // This may very well return an error.
2747 m_errorMonitor->VerifyFound();
2748 }
Cort6c7dff72017-01-27 18:34:50 -08002749
Cort Strattonde748202017-02-17 12:50:01 -08002750 if (buffer_mem_reqs.alignment > 1) {
2751 VkDeviceSize buffer_offset = 1;
2752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02174);
2753 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2754 (void)err; // This may very well return an error.
2755 m_errorMonitor->VerifyFound();
2756 }
2757 }
2758
2759 // Test memory offsets outside the memory allocation
2760 {
2761 VkDeviceSize image_offset =
2762 (image_alloc_info.allocationSize + image_mem_reqs.alignment) & ~(image_mem_reqs.alignment - 1);
2763 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00805);
2764 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2765 (void)err; // This may very well return an error.
2766 m_errorMonitor->VerifyFound();
2767
2768 VkDeviceSize buffer_offset =
2769 (buffer_alloc_info.allocationSize + buffer_mem_reqs.alignment) & ~(buffer_mem_reqs.alignment - 1);
2770 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00793);
2771 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2772 (void)err; // This may very well return an error.
2773 m_errorMonitor->VerifyFound();
2774 }
2775
2776 // Test memory offsets within the memory allocation, but which leave too little memory for
2777 // the resource.
2778 {
2779 VkDeviceSize image_offset = (image_mem_reqs.size - 1) & ~(image_mem_reqs.alignment - 1);
Tony Barbour02d08552017-03-24 16:36:01 -06002780 if ((image_offset > 0) && (image_mem_reqs.size < (image_alloc_info.allocationSize - image_mem_reqs.alignment))) {
Cort Strattonde748202017-02-17 12:50:01 -08002781 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02179);
2782 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2783 (void)err; // This may very well return an error.
2784 m_errorMonitor->VerifyFound();
2785 }
2786
2787 VkDeviceSize buffer_offset = (buffer_mem_reqs.size - 1) & ~(buffer_mem_reqs.alignment - 1);
2788 if (buffer_offset > 0) {
2789 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02175);
2790 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2791 (void)err; // This may very well return an error.
2792 m_errorMonitor->VerifyFound();
2793 }
2794 }
Cort6c7dff72017-01-27 18:34:50 -08002795
2796 vkFreeMemory(device(), image_mem, NULL);
2797 vkFreeMemory(device(), buffer_mem, NULL);
2798 vkDestroyImage(device(), image, NULL);
2799 vkDestroyBuffer(device(), buffer, NULL);
2800 }
2801
Cort Stratton4c38bb52017-01-28 13:33:10 -08002802 // Try to bind memory to an object with an invalid memory type
2803 {
2804 VkImage image = VK_NULL_HANDLE;
2805 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2806 ASSERT_VK_SUCCESS(err);
2807 VkBuffer buffer = VK_NULL_HANDLE;
2808 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2809 ASSERT_VK_SUCCESS(err);
2810 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2811 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2812 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2813 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2814 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2815 image_alloc_info.allocationSize = image_mem_reqs.size;
2816 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2817 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
Cort Strattonccc90e32017-02-04 13:47:42 -08002818 // Create a mask of available memory types *not* supported by these resources,
2819 // and try to use one of them.
Cort Stratton4c38bb52017-01-28 13:33:10 -08002820 VkPhysicalDeviceMemoryProperties memory_properties = {};
2821 vkGetPhysicalDeviceMemoryProperties(m_device->phy().handle(), &memory_properties);
Cort Strattonccc90e32017-02-04 13:47:42 -08002822 VkDeviceMemory image_mem, buffer_mem;
2823
Cort Stratton4c38bb52017-01-28 13:33:10 -08002824 uint32_t image_unsupported_mem_type_bits = ((1 << memory_properties.memoryTypeCount) - 1) & ~image_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002825 if (image_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002826 pass = m_device->phy().set_memory_type(image_unsupported_mem_type_bits, &image_alloc_info, 0);
2827 ASSERT_TRUE(pass);
2828 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2829 ASSERT_VK_SUCCESS(err);
2830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00806);
2831 err = vkBindImageMemory(device(), image, image_mem, 0);
2832 (void)err; // This may very well return an error.
2833 m_errorMonitor->VerifyFound();
2834 vkFreeMemory(device(), image_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002835 }
2836
Cort Stratton4c38bb52017-01-28 13:33:10 -08002837 uint32_t buffer_unsupported_mem_type_bits =
2838 ((1 << memory_properties.memoryTypeCount) - 1) & ~buffer_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002839 if (buffer_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002840 pass = m_device->phy().set_memory_type(buffer_unsupported_mem_type_bits, &buffer_alloc_info, 0);
2841 ASSERT_TRUE(pass);
2842 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2843 ASSERT_VK_SUCCESS(err);
2844 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00797);
2845 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2846 (void)err; // This may very well return an error.
2847 m_errorMonitor->VerifyFound();
2848 vkFreeMemory(device(), buffer_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002849 }
Cort Stratton4c38bb52017-01-28 13:33:10 -08002850
Cort Stratton4c38bb52017-01-28 13:33:10 -08002851 vkDestroyImage(device(), image, NULL);
2852 vkDestroyBuffer(device(), buffer, NULL);
2853 }
2854
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002855 // Try to bind memory to an image created with sparse memory flags
2856 {
2857 VkImageCreateInfo sparse_image_create_info = image_create_info;
2858 sparse_image_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2859 VkImageFormatProperties image_format_properties = {};
2860 err = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), sparse_image_create_info.format,
2861 sparse_image_create_info.imageType, sparse_image_create_info.tiling,
2862 sparse_image_create_info.usage, sparse_image_create_info.flags,
2863 &image_format_properties);
2864 if (!m_device->phy().features().sparseResidencyImage2D || err == VK_ERROR_FORMAT_NOT_SUPPORTED) {
2865 // most likely means sparse formats aren't supported here; skip this test.
2866 } else {
2867 ASSERT_VK_SUCCESS(err);
2868 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002869 printf(" Sparse image format not supported; skipped.\n");
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002870 return;
2871 } else {
2872 VkImage sparse_image = VK_NULL_HANDLE;
2873 err = vkCreateImage(m_device->device(), &sparse_image_create_info, NULL, &sparse_image);
2874 ASSERT_VK_SUCCESS(err);
2875 VkMemoryRequirements sparse_mem_reqs = {};
2876 vkGetImageMemoryRequirements(m_device->device(), sparse_image, &sparse_mem_reqs);
2877 if (sparse_mem_reqs.memoryTypeBits != 0) {
2878 VkMemoryAllocateInfo sparse_mem_alloc = {};
2879 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2880 sparse_mem_alloc.pNext = NULL;
2881 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2882 sparse_mem_alloc.memoryTypeIndex = 0;
2883 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2884 ASSERT_TRUE(pass);
2885 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2886 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2887 ASSERT_VK_SUCCESS(err);
2888 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00804);
2889 err = vkBindImageMemory(m_device->device(), sparse_image, sparse_mem, 0);
2890 // This may very well return an error.
2891 (void)err;
2892 m_errorMonitor->VerifyFound();
2893 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2894 }
2895 vkDestroyImage(m_device->device(), sparse_image, NULL);
2896 }
2897 }
2898 }
2899
2900 // Try to bind memory to a buffer created with sparse memory flags
2901 {
2902 VkBufferCreateInfo sparse_buffer_create_info = buffer_create_info;
2903 sparse_buffer_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2904 if (!m_device->phy().features().sparseResidencyBuffer) {
2905 // most likely means sparse formats aren't supported here; skip this test.
2906 } else {
2907 VkBuffer sparse_buffer = VK_NULL_HANDLE;
2908 err = vkCreateBuffer(m_device->device(), &sparse_buffer_create_info, NULL, &sparse_buffer);
2909 ASSERT_VK_SUCCESS(err);
2910 VkMemoryRequirements sparse_mem_reqs = {};
2911 vkGetBufferMemoryRequirements(m_device->device(), sparse_buffer, &sparse_mem_reqs);
2912 if (sparse_mem_reqs.memoryTypeBits != 0) {
2913 VkMemoryAllocateInfo sparse_mem_alloc = {};
2914 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2915 sparse_mem_alloc.pNext = NULL;
2916 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2917 sparse_mem_alloc.memoryTypeIndex = 0;
2918 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2919 ASSERT_TRUE(pass);
2920 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2921 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2922 ASSERT_VK_SUCCESS(err);
2923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00792);
2924 err = vkBindBufferMemory(m_device->device(), sparse_buffer, sparse_mem, 0);
2925 // This may very well return an error.
2926 (void)err;
2927 m_errorMonitor->VerifyFound();
2928 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2929 }
2930 vkDestroyBuffer(m_device->device(), sparse_buffer, NULL);
2931 }
2932 }
Tobin Ehlisec598302015-09-15 15:02:17 -06002933}
2934
Karl Schultz6addd812016-02-02 17:17:23 -07002935TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2936 VkResult err;
2937 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002938
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002939 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002940
Tony Barbour1fa09702017-03-16 12:09:08 -06002941 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002942
Karl Schultz6addd812016-02-02 17:17:23 -07002943 // Create an image object, allocate memory, destroy the object and then try
2944 // to bind it
2945 VkImage image;
2946 VkDeviceMemory mem;
2947 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002948
Karl Schultz6addd812016-02-02 17:17:23 -07002949 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2950 const int32_t tex_width = 32;
2951 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002952
2953 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002954 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2955 image_create_info.pNext = NULL;
2956 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2957 image_create_info.format = tex_format;
2958 image_create_info.extent.width = tex_width;
2959 image_create_info.extent.height = tex_height;
2960 image_create_info.extent.depth = 1;
2961 image_create_info.mipLevels = 1;
2962 image_create_info.arrayLayers = 1;
2963 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2964 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2965 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2966 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002967
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002968 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002969 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2970 mem_alloc.pNext = NULL;
2971 mem_alloc.allocationSize = 0;
2972 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002973
Chia-I Wuf7458c52015-10-26 21:10:41 +08002974 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002975 ASSERT_VK_SUCCESS(err);
2976
Karl Schultz6addd812016-02-02 17:17:23 -07002977 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002978
2979 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002980 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002981 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002982
2983 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002984 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002985 ASSERT_VK_SUCCESS(err);
2986
2987 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002988 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002989 ASSERT_VK_SUCCESS(err);
2990
2991 // Now Try to bind memory to this destroyed object
2992 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2993 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07002994 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06002995
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002996 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002997
Chia-I Wuf7458c52015-10-26 21:10:41 +08002998 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002999}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003000
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003001TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
3002 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
3003
Tony Barbour1fa09702017-03-16 12:09:08 -06003004 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003005 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3006
3007 VkVertexInputBindingDescription input_binding;
3008 memset(&input_binding, 0, sizeof(input_binding));
3009
3010 VkVertexInputAttributeDescription input_attribs;
3011 memset(&input_attribs, 0, sizeof(input_attribs));
3012
3013 // Pick a really bad format for this purpose and make sure it should fail
3014 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
3015 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
3016 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07003017 printf(" Format unsuitable for test; skipped.\n");
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003018 return;
3019 }
3020
3021 input_attribs.location = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003022 char const *vsSource =
3023 "#version 450\n"
3024 "\n"
3025 "out gl_PerVertex {\n"
3026 " vec4 gl_Position;\n"
3027 "};\n"
3028 "void main(){\n"
3029 " gl_Position = vec4(1);\n"
3030 "}\n";
3031 char const *fsSource =
3032 "#version 450\n"
3033 "\n"
3034 "layout(location=0) out vec4 color;\n"
3035 "void main(){\n"
3036 " color = vec4(1);\n"
3037 "}\n";
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003038
3039 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
3040 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3041 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3042
3043 VkPipelineObj pipe(m_device);
3044 pipe.AddColorAttachment();
3045 pipe.AddShader(&vs);
3046 pipe.AddShader(&fs);
3047
3048 pipe.AddVertexInputBindings(&input_binding, 1);
3049 pipe.AddVertexInputAttribs(&input_attribs, 1);
3050
3051 VkDescriptorSetObj descriptorSet(m_device);
3052 descriptorSet.AppendDummy();
3053 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
3054
3055 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
3056
3057 m_errorMonitor->VerifyFound();
3058}
3059
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003060TEST_F(VkLayerTest, ImageSampleCounts) {
Jeremy Hayes0d104082017-02-21 10:24:16 -07003061 TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger validation errors.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003062 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003063
3064 VkMemoryPropertyFlags reqs = 0;
3065 VkImageCreateInfo image_create_info = {};
3066 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3067 image_create_info.pNext = NULL;
3068 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3069 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3070 image_create_info.extent.width = 256;
3071 image_create_info.extent.height = 256;
3072 image_create_info.extent.depth = 1;
3073 image_create_info.mipLevels = 1;
3074 image_create_info.arrayLayers = 1;
3075 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3076 image_create_info.flags = 0;
3077
3078 VkImageBlit blit_region = {};
3079 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3080 blit_region.srcSubresource.baseArrayLayer = 0;
3081 blit_region.srcSubresource.layerCount = 1;
3082 blit_region.srcSubresource.mipLevel = 0;
3083 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3084 blit_region.dstSubresource.baseArrayLayer = 0;
3085 blit_region.dstSubresource.layerCount = 1;
3086 blit_region.dstSubresource.mipLevel = 0;
3087
3088 // Create two images, the source with sampleCount = 2, and attempt to blit
3089 // between them
3090 {
3091 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003092 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003093 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003094 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003095 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003096 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003097 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003098 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003099 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003100 m_errorMonitor->SetDesiredFailureMsg(
3101 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3102 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003103 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3104 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003105 m_errorMonitor->VerifyFound();
3106 m_commandBuffer->EndCommandBuffer();
3107 }
3108
3109 // Create two images, the dest with sampleCount = 4, and attempt to blit
3110 // between them
3111 {
3112 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003113 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003114 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003115 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003116 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003117 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003118 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003119 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003120 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003121 m_errorMonitor->SetDesiredFailureMsg(
3122 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3123 "was created with a sample count of VK_SAMPLE_COUNT_4_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003124 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3125 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003126 m_errorMonitor->VerifyFound();
3127 m_commandBuffer->EndCommandBuffer();
3128 }
3129
3130 VkBufferImageCopy copy_region = {};
3131 copy_region.bufferRowLength = 128;
3132 copy_region.bufferImageHeight = 128;
3133 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3134 copy_region.imageSubresource.layerCount = 1;
3135 copy_region.imageExtent.height = 64;
3136 copy_region.imageExtent.width = 64;
3137 copy_region.imageExtent.depth = 1;
3138
3139 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
3140 // buffer to image
3141 {
3142 vk_testing::Buffer src_buffer;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003143 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
3144 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003145 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003146 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003147 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003148 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003149 m_errorMonitor->SetDesiredFailureMsg(
3150 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3151 "was created with a sample count of VK_SAMPLE_COUNT_8_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003152 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
3153 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003154 m_errorMonitor->VerifyFound();
3155 m_commandBuffer->EndCommandBuffer();
3156 }
3157
3158 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
3159 // image to buffer
3160 {
3161 vk_testing::Buffer dst_buffer;
3162 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
3163 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003164 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003165 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003166 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003167 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003168 m_errorMonitor->SetDesiredFailureMsg(
3169 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3170 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003171 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003172 dst_buffer.handle(), 1, &copy_region);
3173 m_errorMonitor->VerifyFound();
3174 m_commandBuffer->EndCommandBuffer();
3175 }
3176}
3177
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003178TEST_F(VkLayerTest, BlitImageFormats) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003179 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003180
3181 VkImageObj src_image(m_device);
3182 src_image.init(64, 64, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
3183 VkImageObj dst_image(m_device);
3184 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
3185 VkImageObj dst_image2(m_device);
Mike Stroyan131f3e72016-10-18 11:10:23 -06003186 dst_image2.init(64, 64, VK_FORMAT_R8G8B8A8_SINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003187
3188 VkImageBlit blitRegion = {};
3189 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3190 blitRegion.srcSubresource.baseArrayLayer = 0;
3191 blitRegion.srcSubresource.layerCount = 1;
3192 blitRegion.srcSubresource.mipLevel = 0;
3193 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3194 blitRegion.dstSubresource.baseArrayLayer = 0;
3195 blitRegion.dstSubresource.layerCount = 1;
3196 blitRegion.dstSubresource.mipLevel = 0;
3197
Dave Houlton34df4cb2016-12-01 16:43:06 -07003198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
3199
3200 // TODO: there are 9 permutations of signed, unsigned, & other for source and dest
3201 // this test is only checking 2 of them at the moment
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003202
3203 // Unsigned int vs not an int
Tony Barbour552f6c02016-12-21 14:34:07 -07003204 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003205 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image.image(), dst_image.layout(), 1,
3206 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003207
3208 m_errorMonitor->VerifyFound();
3209
Dave Houlton34df4cb2016-12-01 16:43:06 -07003210 // Test should generate 2 VU failures
3211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02190);
3212 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003213
3214 // Unsigned int vs signed int
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003215 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image2.image(), dst_image2.layout(), 1,
3216 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003217
Dave Houlton34df4cb2016-12-01 16:43:06 -07003218 // TODO: Note that this only verifies that at least one of the VU enums was found
3219 // Also, if any were not seen, they'll remain in the target list (Soln TBD, JIRA task: VL-72)
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003220 m_errorMonitor->VerifyFound();
3221
Tony Barbour552f6c02016-12-21 14:34:07 -07003222 m_commandBuffer->EndCommandBuffer();
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003223}
3224
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003225TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
3226 VkResult err;
3227 bool pass;
3228
3229 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003230 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003231
3232 // If w/d/h granularity is 1, test is not meaningful
3233 // TODO: When virtual device limits are available, create a set of limits for this test that
3234 // will always have a granularity of > 1 for w, h, and d
3235 auto index = m_device->graphics_queue_node_index_;
3236 auto queue_family_properties = m_device->phy().queue_properties();
3237
3238 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
3239 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
3240 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
3241 return;
3242 }
3243
3244 // Create two images of different types and try to copy between them
3245 VkImage srcImage;
3246 VkImage dstImage;
3247 VkDeviceMemory srcMem;
3248 VkDeviceMemory destMem;
3249 VkMemoryRequirements memReqs;
3250
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003251 VkImageCreateInfo image_create_info = {};
3252 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3253 image_create_info.pNext = NULL;
3254 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3255 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3256 image_create_info.extent.width = 32;
3257 image_create_info.extent.height = 32;
3258 image_create_info.extent.depth = 1;
3259 image_create_info.mipLevels = 1;
3260 image_create_info.arrayLayers = 4;
3261 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3262 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3263 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3264 image_create_info.flags = 0;
3265
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003266 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003267 ASSERT_VK_SUCCESS(err);
3268
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003269 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003270 ASSERT_VK_SUCCESS(err);
3271
3272 // Allocate memory
3273 VkMemoryAllocateInfo memAlloc = {};
3274 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3275 memAlloc.pNext = NULL;
3276 memAlloc.allocationSize = 0;
3277 memAlloc.memoryTypeIndex = 0;
3278
3279 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
3280 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003281 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003282 ASSERT_TRUE(pass);
3283 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
3284 ASSERT_VK_SUCCESS(err);
3285
3286 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
3287 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003288 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003289 ASSERT_VK_SUCCESS(err);
3290 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
3291 ASSERT_VK_SUCCESS(err);
3292
3293 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
3294 ASSERT_VK_SUCCESS(err);
3295 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
3296 ASSERT_VK_SUCCESS(err);
3297
Tony Barbour552f6c02016-12-21 14:34:07 -07003298 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003299 VkImageCopy copyRegion;
3300 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3301 copyRegion.srcSubresource.mipLevel = 0;
3302 copyRegion.srcSubresource.baseArrayLayer = 0;
3303 copyRegion.srcSubresource.layerCount = 1;
3304 copyRegion.srcOffset.x = 0;
3305 copyRegion.srcOffset.y = 0;
3306 copyRegion.srcOffset.z = 0;
3307 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3308 copyRegion.dstSubresource.mipLevel = 0;
3309 copyRegion.dstSubresource.baseArrayLayer = 0;
3310 copyRegion.dstSubresource.layerCount = 1;
3311 copyRegion.dstOffset.x = 0;
3312 copyRegion.dstOffset.y = 0;
3313 copyRegion.dstOffset.z = 0;
3314 copyRegion.extent.width = 1;
3315 copyRegion.extent.height = 1;
3316 copyRegion.extent.depth = 1;
3317
3318 // Introduce failure by setting srcOffset to a bad granularity value
3319 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003320 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3321 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003322 m_errorMonitor->VerifyFound();
3323
3324 // Introduce failure by setting extent to a bad granularity value
3325 copyRegion.srcOffset.y = 0;
3326 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003327 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3328 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003329 m_errorMonitor->VerifyFound();
3330
3331 // Now do some buffer/image copies
3332 vk_testing::Buffer buffer;
3333 VkMemoryPropertyFlags reqs = 0;
3334 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3335 VkBufferImageCopy region = {};
3336 region.bufferOffset = 0;
3337 region.bufferRowLength = 3;
3338 region.bufferImageHeight = 128;
3339 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3340 region.imageSubresource.layerCount = 1;
3341 region.imageExtent.height = 16;
3342 region.imageExtent.width = 16;
3343 region.imageExtent.depth = 1;
3344 region.imageOffset.x = 0;
3345 region.imageOffset.y = 0;
3346 region.imageOffset.z = 0;
3347
3348 // Introduce failure by setting bufferRowLength to a bad granularity value
3349 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003350 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3351 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3352 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003353 m_errorMonitor->VerifyFound();
3354 region.bufferRowLength = 128;
3355
3356 // Introduce failure by setting bufferOffset to a bad granularity value
3357 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003358 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3359 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3360 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003361 m_errorMonitor->VerifyFound();
3362 region.bufferOffset = 0;
3363
3364 // Introduce failure by setting bufferImageHeight to a bad granularity value
3365 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3367 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3368 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003369 m_errorMonitor->VerifyFound();
3370 region.bufferImageHeight = 128;
3371
3372 // Introduce failure by setting imageExtent to a bad granularity value
3373 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003374 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3375 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3376 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003377 m_errorMonitor->VerifyFound();
3378 region.imageExtent.width = 16;
3379
3380 // Introduce failure by setting imageOffset to a bad granularity value
3381 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003382 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3383 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3384 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003385 m_errorMonitor->VerifyFound();
3386
Tony Barbour552f6c02016-12-21 14:34:07 -07003387 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003388
3389 vkDestroyImage(m_device->device(), srcImage, NULL);
3390 vkDestroyImage(m_device->device(), dstImage, NULL);
3391 vkFreeMemory(m_device->device(), srcMem, NULL);
3392 vkFreeMemory(m_device->device(), destMem, NULL);
3393}
3394
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003395TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003396 TEST_DESCRIPTION(
3397 "Submit command buffer created using one queue family and "
3398 "attempt to submit them on a queue created in a different "
3399 "queue family.");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003400
Tony Barbour1fa09702017-03-16 12:09:08 -06003401 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07003402
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003403 // This test is meaningless unless we have multiple queue families
3404 auto queue_family_properties = m_device->phy().queue_properties();
3405 if (queue_family_properties.size() < 2) {
3406 return;
3407 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003408 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003409 // Get safe index of another queue family
3410 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
Tony Barbour1fa09702017-03-16 12:09:08 -06003411 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003412 // Create a second queue using a different queue family
3413 VkQueue other_queue;
3414 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3415
3416 // Record an empty cmd buffer
3417 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3418 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3419 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3420 vkEndCommandBuffer(m_commandBuffer->handle());
3421
3422 // And submit on the wrong queue
3423 VkSubmitInfo submit_info = {};
3424 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3425 submit_info.commandBufferCount = 1;
3426 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003427 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003428
3429 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003430}
3431
Chris Forbes4c24a922016-11-16 08:59:10 +13003432TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003433 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4c24a922016-11-16 08:59:10 +13003434
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003435 // There are no attachments, but refer to attachment 0.
3436 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13003437 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003438 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13003439 };
3440
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003441 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, subpasses, 0, nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13003442 VkRenderPass rp;
3443
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003444 // "... must be less than the total number of attachments ..."
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003445 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13003446 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3447 m_errorMonitor->VerifyFound();
3448}
3449
Chris Forbesa58c4522016-09-28 15:19:39 +13003450TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
3451 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
Tony Barbour1fa09702017-03-16 12:09:08 -06003452 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa58c4522016-09-28 15:19:39 +13003453
3454 // A renderpass with two subpasses, both writing the same attachment.
3455 VkAttachmentDescription attach[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003456 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3457 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
3458 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesa58c4522016-09-28 15:19:39 +13003459 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003460 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbesa58c4522016-09-28 15:19:39 +13003461 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003462 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
3463 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbesa58c4522016-09-28 15:19:39 +13003464 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003465 VkSubpassDependency dep = {0,
3466 1,
3467 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3468 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3469 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3470 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3471 VK_DEPENDENCY_BY_REGION_BIT};
3472 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 1, &dep};
Chris Forbesa58c4522016-09-28 15:19:39 +13003473 VkRenderPass rp;
3474 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3475 ASSERT_VK_SUCCESS(err);
3476
3477 VkImageObj image(m_device);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003478 image.init_no_layout(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Chris Forbesa58c4522016-09-28 15:19:39 +13003479 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
3480
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003481 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
Chris Forbesa58c4522016-09-28 15:19:39 +13003482 VkFramebuffer fb;
3483 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
3484 ASSERT_VK_SUCCESS(err);
3485
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003486 char const *vsSource =
3487 "#version 450\n"
3488 "void main() { gl_Position = vec4(1); }\n";
3489 char const *fsSource =
3490 "#version 450\n"
3491 "layout(location=0) out vec4 color;\n"
3492 "void main() { color = vec4(1); }\n";
Chris Forbesa58c4522016-09-28 15:19:39 +13003493
3494 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3495 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3496 VkPipelineObj pipe(m_device);
3497 pipe.AddColorAttachment();
3498 pipe.AddShader(&vs);
3499 pipe.AddShader(&fs);
3500 VkViewport view_port = {};
3501 m_viewports.push_back(view_port);
3502 pipe.SetViewport(m_viewports);
3503 VkRect2D rect = {};
3504 m_scissors.push_back(rect);
3505 pipe.SetScissor(m_scissors);
3506
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003507 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 0, nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003508 VkPipelineLayout pl;
3509 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
3510 ASSERT_VK_SUCCESS(err);
3511 pipe.CreateVKPipeline(pl, rp);
3512
Tony Barbour552f6c02016-12-21 14:34:07 -07003513 m_commandBuffer->BeginCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003514
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003515 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
3516 nullptr,
3517 rp,
3518 fb,
3519 {{
3520 0, 0,
3521 },
3522 {32, 32}},
3523 0,
3524 nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003525
3526 // subtest 1: bind in the wrong subpass
3527 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3528 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003529 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003530 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3531 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3532 m_errorMonitor->VerifyFound();
3533
3534 vkCmdEndRenderPass(m_commandBuffer->handle());
3535
3536 // subtest 2: bind in correct subpass, then transition to next subpass
3537 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3538 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3539 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003540 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003541 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3542 m_errorMonitor->VerifyFound();
3543
3544 vkCmdEndRenderPass(m_commandBuffer->handle());
3545
Tony Barbour552f6c02016-12-21 14:34:07 -07003546 m_commandBuffer->EndCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003547
3548 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3549 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3550 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3551}
3552
Tony Barbour4e919972016-08-09 13:27:40 -06003553TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003554 TEST_DESCRIPTION(
3555 "Generate INVALID_RENDER_AREA error by beginning renderpass"
3556 "with extent outside of framebuffer");
Tony Barbour1fa09702017-03-16 12:09:08 -06003557 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003558 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3559
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003560 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3561 "Cannot execute a render pass with renderArea "
3562 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003563
3564 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3565 m_renderPassBeginInfo.renderArea.extent.width = 257;
3566 m_renderPassBeginInfo.renderArea.extent.height = 257;
Tony Barbour552f6c02016-12-21 14:34:07 -07003567 m_commandBuffer->BeginCommandBuffer();
3568 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour4e919972016-08-09 13:27:40 -06003569 m_errorMonitor->VerifyFound();
3570}
3571
3572TEST_F(VkLayerTest, DisabledIndependentBlend) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003573 TEST_DESCRIPTION(
3574 "Generate INDEPENDENT_BLEND by disabling independent "
3575 "blend and then specifying different blend states for two "
3576 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003577 VkPhysicalDeviceFeatures features = {};
3578 features.independentBlend = VK_FALSE;
Tony Barbour1fa09702017-03-16 12:09:08 -06003579 ASSERT_NO_FATAL_FAILURE(Init(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003580
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003581 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3582 "Invalid Pipeline CreateInfo: If independent blend feature not "
3583 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003584
Cody Northropc31a84f2016-08-22 10:41:47 -06003585 VkDescriptorSetObj descriptorSet(m_device);
3586 descriptorSet.AppendDummy();
3587 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003588
Cody Northropc31a84f2016-08-22 10:41:47 -06003589 VkPipelineObj pipeline(m_device);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003590 // Create a renderPass with two color attachments
3591 VkAttachmentReference attachments[2] = {};
3592 attachments[0].layout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003593 attachments[1].attachment = 1;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003594 attachments[1].layout = VK_IMAGE_LAYOUT_GENERAL;
3595
3596 VkSubpassDescription subpass = {};
3597 subpass.pColorAttachments = attachments;
3598 subpass.colorAttachmentCount = 2;
3599
3600 VkRenderPassCreateInfo rpci = {};
3601 rpci.subpassCount = 1;
3602 rpci.pSubpasses = &subpass;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003603 rpci.attachmentCount = 2;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003604
Tony Barbourffd60bd2017-03-09 12:04:55 -07003605 VkAttachmentDescription attach_desc[2] = {};
3606 attach_desc[0].format = VK_FORMAT_B8G8R8A8_UNORM;
3607 attach_desc[0].samples = VK_SAMPLE_COUNT_1_BIT;
3608 attach_desc[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3609 attach_desc[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
3610 attach_desc[1].format = VK_FORMAT_B8G8R8A8_UNORM;
3611 attach_desc[1].samples = VK_SAMPLE_COUNT_1_BIT;
3612 attach_desc[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3613 attach_desc[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003614
Tony Barbourffd60bd2017-03-09 12:04:55 -07003615 rpci.pAttachments = attach_desc;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003616 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3617
3618 VkRenderPass renderpass;
3619 vkCreateRenderPass(m_device->device(), &rpci, NULL, &renderpass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003620 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003621 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003622
Cody Northropc31a84f2016-08-22 10:41:47 -06003623 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3624 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3625 att_state1.blendEnable = VK_TRUE;
3626 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3627 att_state2.blendEnable = VK_FALSE;
3628 pipeline.AddColorAttachment(0, &att_state1);
3629 pipeline.AddColorAttachment(1, &att_state2);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003630 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass);
Cody Northropc31a84f2016-08-22 10:41:47 -06003631 m_errorMonitor->VerifyFound();
Tony Barbour0ace59a2017-02-06 13:38:36 -07003632 vkDestroyRenderPass(m_device->device(), renderpass, NULL);
Tony Barbour4e919972016-08-09 13:27:40 -06003633}
3634
Mike Weiblen40b160e2017-02-06 19:21:52 -07003635// Is the Pipeline compatible with the expectations of the Renderpass/subpasses?
3636TEST_F(VkLayerTest, PipelineRenderpassCompatibility) {
3637 TEST_DESCRIPTION(
3638 "Create a graphics pipeline that is incompatible with the requirements "
3639 "of its contained Renderpass/subpasses.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003640 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen40b160e2017-02-06 19:21:52 -07003641
3642 VkDescriptorSetObj ds_obj(m_device);
3643 ds_obj.AppendDummy();
3644 ds_obj.CreateVKDescriptorSet(m_commandBuffer);
3645
3646 VkShaderObj vs_obj(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
3647
3648 VkPipelineColorBlendAttachmentState att_state1 = {};
3649 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3650 att_state1.blendEnable = VK_TRUE;
3651
3652 VkRenderpassObj rp_obj(m_device);
3653
3654 {
3655 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02116);
3656 VkPipelineObj pipeline(m_device);
3657 pipeline.AddShader(&vs_obj);
3658 pipeline.AddColorAttachment(0, &att_state1);
3659
3660 VkGraphicsPipelineCreateInfo info = {};
3661 pipeline.InitGraphicsPipelineCreateInfo(&info);
3662 info.pColorBlendState = nullptr;
3663
3664 pipeline.CreateVKPipeline(ds_obj.GetPipelineLayout(), rp_obj.handle(), &info);
3665 m_errorMonitor->VerifyFound();
3666 }
3667}
3668
Chris Forbes26ec2122016-11-29 08:58:33 +13003669#if 0
Tony Barbour4e919972016-08-09 13:27:40 -06003670TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
3671 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
3672 "depth attachments in subpass");
Tony Barbour1fa09702017-03-16 12:09:08 -06003673 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003674
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003675 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3676 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
Tony Barbour4e919972016-08-09 13:27:40 -06003677
3678 // Create a renderPass with a single color attachment
3679 VkAttachmentReference attach = {};
3680 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3681 VkSubpassDescription subpass = {};
3682 VkRenderPassCreateInfo rpci = {};
3683 rpci.subpassCount = 1;
3684 rpci.pSubpasses = &subpass;
3685 rpci.attachmentCount = 1;
3686 VkAttachmentDescription attach_desc = {};
3687 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3688 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3689 rpci.pAttachments = &attach_desc;
3690 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3691 VkRenderPass rp;
3692 subpass.pDepthStencilAttachment = &attach;
3693 subpass.pColorAttachments = NULL;
3694 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3695 m_errorMonitor->VerifyFound();
3696}
Chris Forbes26ec2122016-11-29 08:58:33 +13003697#endif
Tony Barbour4e919972016-08-09 13:27:40 -06003698
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003699TEST_F(VkLayerTest, UnusedPreserveAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003700 TEST_DESCRIPTION(
3701 "Create a framebuffer where a subpass has a preserve "
3702 "attachment reference of VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003703
Tony Barbour1fa09702017-03-16 12:09:08 -06003704 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003705 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3706
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must not be VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003708
3709 VkAttachmentReference color_attach = {};
3710 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3711 color_attach.attachment = 0;
3712 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
3713 VkSubpassDescription subpass = {};
3714 subpass.colorAttachmentCount = 1;
3715 subpass.pColorAttachments = &color_attach;
3716 subpass.preserveAttachmentCount = 1;
3717 subpass.pPreserveAttachments = &preserve_attachment;
3718
3719 VkRenderPassCreateInfo rpci = {};
3720 rpci.subpassCount = 1;
3721 rpci.pSubpasses = &subpass;
3722 rpci.attachmentCount = 1;
3723 VkAttachmentDescription attach_desc = {};
3724 attach_desc.format = VK_FORMAT_UNDEFINED;
3725 rpci.pAttachments = &attach_desc;
3726 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3727 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003728 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003729
3730 m_errorMonitor->VerifyFound();
3731
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003732 if (result == VK_SUCCESS) {
3733 vkDestroyRenderPass(m_device->device(), rp, NULL);
3734 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003735}
3736
Chris Forbesc5389742016-06-29 11:49:23 +12003737TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003738 TEST_DESCRIPTION(
3739 "Ensure that CreateRenderPass produces a validation error "
3740 "when the source of a subpass multisample resolve "
3741 "does not have multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003742
Tony Barbour1fa09702017-03-16 12:09:08 -06003743 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003744
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003745 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3746 "Subpass 0 requests multisample resolve from attachment 0 which has "
3747 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003748
3749 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003750 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3751 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3752 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3753 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3754 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3755 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003756 };
3757
3758 VkAttachmentReference color = {
3759 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3760 };
3761
3762 VkAttachmentReference resolve = {
3763 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3764 };
3765
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003766 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003767
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003768 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003769
3770 VkRenderPass rp;
3771 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3772
3773 m_errorMonitor->VerifyFound();
3774
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003775 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003776}
3777
3778TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003779 TEST_DESCRIPTION(
3780 "Ensure CreateRenderPass produces a validation error "
3781 "when a subpass multisample resolve operation is "
3782 "requested, and the destination of that resolve has "
3783 "multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003784
Tony Barbour1fa09702017-03-16 12:09:08 -06003785 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003786
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003787 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3788 "Subpass 0 requests multisample resolve into attachment 1, which "
3789 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003790
3791 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003792 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3793 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3794 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3795 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3796 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3797 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003798 };
3799
3800 VkAttachmentReference color = {
3801 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3802 };
3803
3804 VkAttachmentReference resolve = {
3805 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3806 };
3807
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003808 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003809
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003810 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003811
3812 VkRenderPass rp;
3813 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3814
3815 m_errorMonitor->VerifyFound();
3816
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003817 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003818}
3819
Chris Forbes3f128ef2016-06-29 14:58:53 +12003820TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003821 TEST_DESCRIPTION(
3822 "Ensure CreateRenderPass produces a validation error "
3823 "when the color and depth attachments used by a subpass "
3824 "have inconsistent sample counts");
Chris Forbes6655bb32016-07-01 18:27:30 +12003825
Tony Barbour1fa09702017-03-16 12:09:08 -06003826 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3f128ef2016-06-29 14:58:53 +12003827
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003828 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3829 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
Chris Forbes3f128ef2016-06-29 14:58:53 +12003830
3831 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003832 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3833 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3834 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3835 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3836 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3837 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbes3f128ef2016-06-29 14:58:53 +12003838 };
3839
3840 VkAttachmentReference color[] = {
3841 {
3842 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3843 },
3844 {
3845 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3846 },
3847 };
3848
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003849 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, color, nullptr, nullptr, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003850
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003851 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003852
3853 VkRenderPass rp;
3854 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3855
3856 m_errorMonitor->VerifyFound();
3857
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003858 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbes3f128ef2016-06-29 14:58:53 +12003859}
3860
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003861TEST_F(VkLayerTest, FramebufferCreateErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003862 TEST_DESCRIPTION(
3863 "Hit errors when attempting to create a framebuffer :\n"
3864 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
3865 " 2. Use a color image as depthStencil attachment\n"
3866 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3867 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3868 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3869 " 6. Framebuffer attachment where dimensions don't match\n"
3870 " 7. Framebuffer attachment w/o identity swizzle\n"
3871 " 8. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003872
Tony Barbour1fa09702017-03-16 12:09:08 -06003873 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003874 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3875
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003876 m_errorMonitor->SetDesiredFailureMsg(
3877 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3878 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003879
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003880 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003881 VkAttachmentReference attach = {};
3882 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3883 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003884 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003885 VkRenderPassCreateInfo rpci = {};
3886 rpci.subpassCount = 1;
3887 rpci.pSubpasses = &subpass;
3888 rpci.attachmentCount = 1;
3889 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003890 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003891 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003892 rpci.pAttachments = &attach_desc;
3893 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3894 VkRenderPass rp;
3895 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3896 ASSERT_VK_SUCCESS(err);
3897
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003898 VkImageView ivs[2];
3899 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3900 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003901 VkFramebufferCreateInfo fb_info = {};
3902 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3903 fb_info.pNext = NULL;
3904 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003905 // Set mis-matching attachmentCount
3906 fb_info.attachmentCount = 2;
3907 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003908 fb_info.width = 100;
3909 fb_info.height = 100;
3910 fb_info.layers = 1;
3911
3912 VkFramebuffer fb;
3913 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3914
3915 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003916 if (err == VK_SUCCESS) {
3917 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3918 }
3919 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003920
3921 // Create a renderPass with a depth-stencil attachment created with
3922 // IMAGE_USAGE_COLOR_ATTACHMENT
3923 // Add our color attachment to pDepthStencilAttachment
3924 subpass.pDepthStencilAttachment = &attach;
3925 subpass.pColorAttachments = NULL;
3926 VkRenderPass rp_ds;
3927 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3928 ASSERT_VK_SUCCESS(err);
3929 // Set correct attachment count, but attachment has COLOR usage bit set
3930 fb_info.attachmentCount = 1;
3931 fb_info.renderPass = rp_ds;
3932
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003933 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " conflicts with the image's IMAGE_USAGE flags ");
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003934 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3935
3936 m_errorMonitor->VerifyFound();
3937 if (err == VK_SUCCESS) {
3938 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3939 }
3940 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003941
3942 // Create new renderpass with alternate attachment format from fb
3943 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3944 subpass.pDepthStencilAttachment = NULL;
3945 subpass.pColorAttachments = &attach;
3946 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3947 ASSERT_VK_SUCCESS(err);
3948
3949 // Cause error due to mis-matched formats between rp & fb
3950 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3951 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3953 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003954 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3955
3956 m_errorMonitor->VerifyFound();
3957 if (err == VK_SUCCESS) {
3958 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3959 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003960 vkDestroyRenderPass(m_device->device(), rp, NULL);
3961
3962 // Create new renderpass with alternate sample count from fb
3963 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3964 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3965 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3966 ASSERT_VK_SUCCESS(err);
3967
3968 // Cause error due to mis-matched sample count between rp & fb
3969 fb_info.renderPass = rp;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003971 " has VK_SAMPLE_COUNT_1_BIT samples that do not match the VK_SAMPLE_COUNT_4_BIT ");
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003972 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3973
3974 m_errorMonitor->VerifyFound();
3975 if (err == VK_SUCCESS) {
3976 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3977 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003978
3979 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003980
3981 // Create a custom imageView with non-1 mip levels
3982 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003983 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003984 ASSERT_TRUE(image.initialized());
3985
3986 VkImageView view;
3987 VkImageViewCreateInfo ivci = {};
3988 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3989 ivci.image = image.handle();
3990 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3991 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3992 ivci.subresourceRange.layerCount = 1;
3993 ivci.subresourceRange.baseMipLevel = 0;
3994 // Set level count 2 (only 1 is allowed for FB attachment)
3995 ivci.subresourceRange.levelCount = 2;
3996 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3997 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3998 ASSERT_VK_SUCCESS(err);
3999 // Re-create renderpass to have matching sample count
4000 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4001 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4002 ASSERT_VK_SUCCESS(err);
4003
4004 fb_info.renderPass = rp;
4005 fb_info.pAttachments = &view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004006 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has mip levelCount of 2 but only ");
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004007 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4008
4009 m_errorMonitor->VerifyFound();
4010 if (err == VK_SUCCESS) {
4011 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4012 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004013 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004014 // Update view to original color buffer and grow FB dimensions too big
4015 fb_info.pAttachments = ivs;
4016 fb_info.height = 1024;
4017 fb_info.width = 1024;
4018 fb_info.layers = 2;
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004019 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " Attachment dimensions must be at least as large. ");
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004020 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4021
4022 m_errorMonitor->VerifyFound();
4023 if (err == VK_SUCCESS) {
4024 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4025 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004026 // Create view attachment with non-identity swizzle
4027 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4028 ivci.image = image.handle();
4029 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4030 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4031 ivci.subresourceRange.layerCount = 1;
4032 ivci.subresourceRange.baseMipLevel = 0;
4033 ivci.subresourceRange.levelCount = 1;
4034 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4035 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4036 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4037 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4038 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4039 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4040 ASSERT_VK_SUCCESS(err);
4041
4042 fb_info.pAttachments = &view;
4043 fb_info.height = 100;
4044 fb_info.width = 100;
4045 fb_info.layers = 1;
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004046 m_errorMonitor->SetDesiredFailureMsg(
4047 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4048 " has non-identy swizzle. All framebuffer attachments must have been created with the identity swizzle. ");
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004049 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4050
4051 m_errorMonitor->VerifyFound();
4052 if (err == VK_SUCCESS) {
4053 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4054 }
4055 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004056 // reset attachment to color attachment
4057 fb_info.pAttachments = ivs;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004058
4059 // Request fb that exceeds max width
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004060 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004061 fb_info.height = 100;
4062 fb_info.layers = 1;
4063 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00413);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004064 m_errorMonitor->SetDesiredFailureMsg(
4065 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004066 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4067 "Here are the respective dimensions for attachment");
4068
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004069 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4070
4071 m_errorMonitor->VerifyFound();
4072 if (err == VK_SUCCESS) {
4073 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4074 }
4075
4076 // Request fb that exceeds max height
4077 fb_info.width = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004078 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004079 fb_info.layers = 1;
4080 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00414);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004081 m_errorMonitor->SetDesiredFailureMsg(
4082 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004083 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4084 "Here are the respective dimensions for attachment");
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004085 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4086
4087 m_errorMonitor->VerifyFound();
4088 if (err == VK_SUCCESS) {
4089 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4090 }
4091
4092 // Request fb that exceeds max layers
4093 fb_info.width = 100;
4094 fb_info.height = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004095 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004096 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00415);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004097 m_errorMonitor->SetDesiredFailureMsg(
4098 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004099 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4100 "Here are the respective dimensions for attachment");
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004101 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4102
4103 m_errorMonitor->VerifyFound();
4104 if (err == VK_SUCCESS) {
4105 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4106 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004107
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004108 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004109}
4110
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004111TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004112 TEST_DESCRIPTION(
4113 "Run a simple draw calls to validate failure when Depth Bias dynamic "
4114 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004115
Tony Barbour1fa09702017-03-16 12:09:08 -06004116 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004117 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
4119 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004120 m_errorMonitor->VerifyFound();
4121}
4122
4123TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004124 TEST_DESCRIPTION(
4125 "Run a simple draw calls to validate failure when Line Width dynamic "
4126 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004127
Tony Barbour1fa09702017-03-16 12:09:08 -06004128 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004129 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
4131 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004132 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004133}
4134
4135TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004136 TEST_DESCRIPTION(
4137 "Run a simple draw calls to validate failure when Viewport dynamic "
4138 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004139
Tony Barbour1fa09702017-03-16 12:09:08 -06004140 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004141 // Dynamic viewport state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004142 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4143 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004144 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004145 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004146}
4147
4148TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004149 TEST_DESCRIPTION(
4150 "Run a simple draw calls to validate failure when Scissor dynamic "
4151 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004152
Tony Barbour1fa09702017-03-16 12:09:08 -06004153 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004154 // Dynamic scissor state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004155 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4156 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004157 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004158 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004159}
4160
Cortd713fe82016-07-27 09:51:27 -07004161TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004162 TEST_DESCRIPTION(
4163 "Run a simple draw calls to validate failure when Blend Constants "
4164 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004165
Tony Barbour1fa09702017-03-16 12:09:08 -06004166 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004167 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004168 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4169 "Dynamic blend constants state not set for this command buffer");
4170 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06004171 m_errorMonitor->VerifyFound();
4172}
4173
4174TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004175 TEST_DESCRIPTION(
4176 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
4177 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004178
Tony Barbour1fa09702017-03-16 12:09:08 -06004179 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004180 if (!m_device->phy().features().depthBounds) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07004181 printf(" Device does not support depthBounds test; skipped.\n");
Tobin Ehlis21c88352016-05-26 06:15:45 -06004182 return;
4183 }
4184 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4186 "Dynamic depth bounds state not set for this command buffer");
4187 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004188 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004189}
4190
4191TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004192 TEST_DESCRIPTION(
4193 "Run a simple draw calls to validate failure when Stencil Read dynamic "
4194 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004195
Tony Barbour1fa09702017-03-16 12:09:08 -06004196 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004197 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4199 "Dynamic stencil read mask state not set for this command buffer");
4200 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004201 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004202}
4203
4204TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004205 TEST_DESCRIPTION(
4206 "Run a simple draw calls to validate failure when Stencil Write dynamic"
4207 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004208
Tony Barbour1fa09702017-03-16 12:09:08 -06004209 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004210 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4212 "Dynamic stencil write mask state not set for this command buffer");
4213 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004214 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004215}
4216
4217TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004218 TEST_DESCRIPTION(
4219 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
4220 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004221
Tony Barbour1fa09702017-03-16 12:09:08 -06004222 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004223 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4225 "Dynamic stencil reference state not set for this command buffer");
4226 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004227 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06004228}
4229
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004230TEST_F(VkLayerTest, IndexBufferNotBound) {
4231 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004232
Tony Barbour1fa09702017-03-16 12:09:08 -06004233 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004234 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4235 "Index buffer object not bound to this command buffer when Indexed ");
4236 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004237 m_errorMonitor->VerifyFound();
4238}
4239
Karl Schultz6addd812016-02-02 17:17:23 -07004240TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4242 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
4243 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004244
Tony Barbour1fa09702017-03-16 12:09:08 -06004245 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004246 ASSERT_NO_FATAL_FAILURE(InitViewport());
4247 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4248
Karl Schultz6addd812016-02-02 17:17:23 -07004249 // We luck out b/c by default the framework creates CB w/ the
4250 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tony Barbour552f6c02016-12-21 14:34:07 -07004251 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004252 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07004253 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004254
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004255 // Bypass framework since it does the waits automatically
4256 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004257 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08004258 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4259 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004260 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004261 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07004262 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004263 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004264 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08004265 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004266 submit_info.pSignalSemaphores = NULL;
4267
Chris Forbes40028e22016-06-13 09:59:34 +12004268 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07004269 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004270 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004271
Karl Schultz6addd812016-02-02 17:17:23 -07004272 // Cause validation error by re-submitting cmd buffer that should only be
4273 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12004274 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004275 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004276
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004277 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004278}
4279
Karl Schultz6addd812016-02-02 17:17:23 -07004280TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004281 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07004282 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004283
Tony Barbour1fa09702017-03-16 12:09:08 -06004284 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004285 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004286
Karl Schultz6addd812016-02-02 17:17:23 -07004287 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
4288 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004289 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004290 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004291 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004292
4293 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004294 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4295 ds_pool_ci.pNext = NULL;
4296 ds_pool_ci.flags = 0;
4297 ds_pool_ci.maxSets = 1;
4298 ds_pool_ci.poolSizeCount = 1;
4299 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004300
4301 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004302 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004303 ASSERT_VK_SUCCESS(err);
4304
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004305 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
4306 dsl_binding_samp.binding = 0;
4307 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4308 dsl_binding_samp.descriptorCount = 1;
4309 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
4310 dsl_binding_samp.pImmutableSamplers = NULL;
4311
4312 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4313 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4314 ds_layout_ci.pNext = NULL;
4315 ds_layout_ci.bindingCount = 1;
4316 ds_layout_ci.pBindings = &dsl_binding_samp;
4317
4318 VkDescriptorSetLayout ds_layout_samp;
4319 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
4320 ASSERT_VK_SUCCESS(err);
4321
4322 // Try to allocate 2 sets when pool only has 1 set
4323 VkDescriptorSet descriptor_sets[2];
4324 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
4325 VkDescriptorSetAllocateInfo alloc_info = {};
4326 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4327 alloc_info.descriptorSetCount = 2;
4328 alloc_info.descriptorPool = ds_pool;
4329 alloc_info.pSetLayouts = set_layouts;
4330 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
4331 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
4332 m_errorMonitor->VerifyFound();
4333
4334 alloc_info.descriptorSetCount = 1;
4335 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004336 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004337 dsl_binding.binding = 0;
4338 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4339 dsl_binding.descriptorCount = 1;
4340 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4341 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004342
Karl Schultz6addd812016-02-02 17:17:23 -07004343 ds_layout_ci.bindingCount = 1;
4344 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004345
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004346 VkDescriptorSetLayout ds_layout_ub;
4347 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004348 ASSERT_VK_SUCCESS(err);
4349
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004350 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004351 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004352 alloc_info.pSetLayouts = &ds_layout_ub;
4353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
4354 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004355
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004356 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004357
Karl Schultz2825ab92016-12-02 08:23:14 -07004358 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004359 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08004360 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004361}
4362
Karl Schultz6addd812016-02-02 17:17:23 -07004363TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
4364 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06004365
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00922);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004367
Tony Barbour1fa09702017-03-16 12:09:08 -06004368 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise735c692015-10-08 13:13:50 -06004369 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06004370
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004371 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004372 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4373 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06004374
4375 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004376 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4377 ds_pool_ci.pNext = NULL;
4378 ds_pool_ci.maxSets = 1;
4379 ds_pool_ci.poolSizeCount = 1;
4380 ds_pool_ci.flags = 0;
4381 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
4382 // app can only call vkResetDescriptorPool on this pool.;
4383 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06004384
4385 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004386 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06004387 ASSERT_VK_SUCCESS(err);
4388
4389 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004390 dsl_binding.binding = 0;
4391 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4392 dsl_binding.descriptorCount = 1;
4393 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4394 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06004395
4396 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004397 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4398 ds_layout_ci.pNext = NULL;
4399 ds_layout_ci.bindingCount = 1;
4400 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06004401
4402 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004403 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06004404 ASSERT_VK_SUCCESS(err);
4405
4406 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004407 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004408 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004409 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004410 alloc_info.descriptorPool = ds_pool;
4411 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004412 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06004413 ASSERT_VK_SUCCESS(err);
4414
4415 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004416 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06004417
Chia-I Wuf7458c52015-10-26 21:10:41 +08004418 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4419 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06004420}
4421
Karl Schultz6addd812016-02-02 17:17:23 -07004422TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004423 // Attempt to clear Descriptor Pool with bad object.
4424 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06004425
Tony Barbour1fa09702017-03-16 12:09:08 -06004426 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004427 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004428 uint64_t fake_pool_handle = 0xbaad6001;
4429 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
4430 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06004431 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004432}
4433
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004434TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004435 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
4436 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004437 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06004438 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004439
4440 uint64_t fake_set_handle = 0xbaad6001;
4441 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06004442 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004443 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06004444
Tony Barbour1fa09702017-03-16 12:09:08 -06004445 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004446
4447 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
4448 layout_bindings[0].binding = 0;
4449 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4450 layout_bindings[0].descriptorCount = 1;
4451 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
4452 layout_bindings[0].pImmutableSamplers = NULL;
4453
4454 VkDescriptorSetLayout descriptor_set_layout;
4455 VkDescriptorSetLayoutCreateInfo dslci = {};
4456 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4457 dslci.pNext = NULL;
4458 dslci.bindingCount = 1;
4459 dslci.pBindings = layout_bindings;
4460 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004461 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004462
4463 VkPipelineLayout pipeline_layout;
4464 VkPipelineLayoutCreateInfo plci = {};
4465 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4466 plci.pNext = NULL;
4467 plci.setLayoutCount = 1;
4468 plci.pSetLayouts = &descriptor_set_layout;
4469 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004470 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004471
Tony Barbour552f6c02016-12-21 14:34:07 -07004472 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004473 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
4474 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06004475 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07004476 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -06004477 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
4478 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004479}
4480
Karl Schultz6addd812016-02-02 17:17:23 -07004481TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004482 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
4483 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004484 uint64_t fake_layout_handle = 0xbaad6001;
4485 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Tony Barbour1fa09702017-03-16 12:09:08 -06004487 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004488 VkPipelineLayout pipeline_layout;
4489 VkPipelineLayoutCreateInfo plci = {};
4490 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4491 plci.pNext = NULL;
4492 plci.setLayoutCount = 1;
4493 plci.pSetLayouts = &bad_layout;
4494 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
4495
4496 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004497}
4498
Mark Muellerd4914412016-06-13 17:52:06 -06004499TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004500 TEST_DESCRIPTION(
4501 "This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
4502 "1) A uniform buffer update must have a valid buffer index."
4503 "2) When using an array of descriptors in a single WriteDescriptor,"
4504 " the descriptor types and stageflags must all be the same."
4505 "3) Immutable Sampler state must match across descriptors");
Mark Muellerd4914412016-06-13 17:52:06 -06004506
Mike Weiblena6666382017-01-05 15:16:11 -07004507 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00941);
Mark Muellerd4914412016-06-13 17:52:06 -06004508
Tony Barbour1fa09702017-03-16 12:09:08 -06004509 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerd4914412016-06-13 17:52:06 -06004510 VkDescriptorPoolSize ds_type_count[4] = {};
4511 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4512 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004513 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004514 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004515 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004516 ds_type_count[2].descriptorCount = 1;
4517 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4518 ds_type_count[3].descriptorCount = 1;
4519
4520 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4521 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4522 ds_pool_ci.maxSets = 1;
4523 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
4524 ds_pool_ci.pPoolSizes = ds_type_count;
4525
4526 VkDescriptorPool ds_pool;
4527 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4528 ASSERT_VK_SUCCESS(err);
4529
Mark Muellerb9896722016-06-16 09:54:29 -06004530 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004531 layout_binding[0].binding = 0;
4532 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4533 layout_binding[0].descriptorCount = 1;
4534 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4535 layout_binding[0].pImmutableSamplers = NULL;
4536
4537 layout_binding[1].binding = 1;
4538 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4539 layout_binding[1].descriptorCount = 1;
4540 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4541 layout_binding[1].pImmutableSamplers = NULL;
4542
4543 VkSamplerCreateInfo sampler_ci = {};
4544 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4545 sampler_ci.pNext = NULL;
4546 sampler_ci.magFilter = VK_FILTER_NEAREST;
4547 sampler_ci.minFilter = VK_FILTER_NEAREST;
4548 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4549 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4550 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4551 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4552 sampler_ci.mipLodBias = 1.0;
4553 sampler_ci.anisotropyEnable = VK_FALSE;
4554 sampler_ci.maxAnisotropy = 1;
4555 sampler_ci.compareEnable = VK_FALSE;
4556 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4557 sampler_ci.minLod = 1.0;
4558 sampler_ci.maxLod = 1.0;
4559 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4560 sampler_ci.unnormalizedCoordinates = VK_FALSE;
4561 VkSampler sampler;
4562
4563 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
4564 ASSERT_VK_SUCCESS(err);
4565
4566 layout_binding[2].binding = 2;
4567 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4568 layout_binding[2].descriptorCount = 1;
4569 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4570 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
4571
Mark Muellerd4914412016-06-13 17:52:06 -06004572 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4573 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4574 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
4575 ds_layout_ci.pBindings = layout_binding;
4576 VkDescriptorSetLayout ds_layout;
4577 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4578 ASSERT_VK_SUCCESS(err);
4579
4580 VkDescriptorSetAllocateInfo alloc_info = {};
4581 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4582 alloc_info.descriptorSetCount = 1;
4583 alloc_info.descriptorPool = ds_pool;
4584 alloc_info.pSetLayouts = &ds_layout;
4585 VkDescriptorSet descriptorSet;
4586 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4587 ASSERT_VK_SUCCESS(err);
4588
4589 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4590 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4591 pipeline_layout_ci.pNext = NULL;
4592 pipeline_layout_ci.setLayoutCount = 1;
4593 pipeline_layout_ci.pSetLayouts = &ds_layout;
4594
4595 VkPipelineLayout pipeline_layout;
4596 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4597 ASSERT_VK_SUCCESS(err);
4598
Mark Mueller5c838ce2016-06-16 09:54:29 -06004599 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004600 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4601 descriptor_write.dstSet = descriptorSet;
4602 descriptor_write.dstBinding = 0;
4603 descriptor_write.descriptorCount = 1;
4604 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4605
Mark Mueller5c838ce2016-06-16 09:54:29 -06004606 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004607 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4608 m_errorMonitor->VerifyFound();
4609
4610 // Create a buffer to update the descriptor with
4611 uint32_t qfi = 0;
4612 VkBufferCreateInfo buffCI = {};
4613 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4614 buffCI.size = 1024;
4615 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4616 buffCI.queueFamilyIndexCount = 1;
4617 buffCI.pQueueFamilyIndices = &qfi;
4618
4619 VkBuffer dyub;
4620 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4621 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004622
Tony Barboure132c5f2016-12-12 11:50:20 -07004623 VkDeviceMemory mem;
4624 VkMemoryRequirements mem_reqs;
4625 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4626
4627 VkMemoryAllocateInfo mem_alloc_info = {};
4628 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4629 mem_alloc_info.allocationSize = mem_reqs.size;
4630 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4631 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4632 ASSERT_VK_SUCCESS(err);
4633
4634 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4635 ASSERT_VK_SUCCESS(err);
4636
4637 VkDescriptorBufferInfo buffInfo[2] = {};
4638 buffInfo[0].buffer = dyub;
4639 buffInfo[0].offset = 0;
4640 buffInfo[0].range = 1024;
4641 buffInfo[1].buffer = dyub;
4642 buffInfo[1].offset = 0;
4643 buffInfo[1].range = 1024;
4644 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004645 descriptor_write.descriptorCount = 2;
4646
Mark Mueller5c838ce2016-06-16 09:54:29 -06004647 // 2) The stateFlags don't match between the first and second descriptor
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004649 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4650 m_errorMonitor->VerifyFound();
4651
Mark Mueller5c838ce2016-06-16 09:54:29 -06004652 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4653 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004654 descriptor_write.dstBinding = 1;
4655 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004656
Mark Mueller5c838ce2016-06-16 09:54:29 -06004657 // Make pImageInfo index non-null to avoid complaints of it missing
4658 VkDescriptorImageInfo imageInfo = {};
4659 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4660 descriptor_write.pImageInfo = &imageInfo;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004662 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4663 m_errorMonitor->VerifyFound();
4664
Mark Muellerd4914412016-06-13 17:52:06 -06004665 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004666 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004667 vkDestroySampler(m_device->device(), sampler, NULL);
4668 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4669 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4670 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4671}
4672
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004673TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004674 TEST_DESCRIPTION(
4675 "Attempt to draw with a command buffer that is invalid "
4676 "due to a buffer dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004677 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004678
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004679 VkBuffer buffer;
4680 VkDeviceMemory mem;
4681 VkMemoryRequirements mem_reqs;
4682
4683 VkBufferCreateInfo buf_info = {};
4684 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004685 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004686 buf_info.size = 256;
4687 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4688 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4689 ASSERT_VK_SUCCESS(err);
4690
4691 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4692
4693 VkMemoryAllocateInfo alloc_info = {};
4694 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4695 alloc_info.allocationSize = 256;
4696 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004697 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004698 if (!pass) {
4699 vkDestroyBuffer(m_device->device(), buffer, NULL);
4700 return;
4701 }
4702 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4703 ASSERT_VK_SUCCESS(err);
4704
4705 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4706 ASSERT_VK_SUCCESS(err);
4707
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004708 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004709 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004710 m_commandBuffer->EndCommandBuffer();
4711
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004712 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004713 // Destroy buffer dependency prior to submit to cause ERROR
4714 vkDestroyBuffer(m_device->device(), buffer, NULL);
4715
4716 VkSubmitInfo submit_info = {};
4717 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4718 submit_info.commandBufferCount = 1;
4719 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4720 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4721
4722 m_errorMonitor->VerifyFound();
Rene Lindsayab6c5cd2016-12-20 14:05:37 -07004723 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004724 vkFreeMemory(m_device->handle(), mem, NULL);
4725}
4726
Tobin Ehlisea413442016-09-28 10:23:59 -06004727TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4728 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4729
Tony Barbour1fa09702017-03-16 12:09:08 -06004730 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisea413442016-09-28 10:23:59 -06004731 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4732
4733 VkDescriptorPoolSize ds_type_count;
4734 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4735 ds_type_count.descriptorCount = 1;
4736
4737 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4738 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4739 ds_pool_ci.maxSets = 1;
4740 ds_pool_ci.poolSizeCount = 1;
4741 ds_pool_ci.pPoolSizes = &ds_type_count;
4742
4743 VkDescriptorPool ds_pool;
4744 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4745 ASSERT_VK_SUCCESS(err);
4746
4747 VkDescriptorSetLayoutBinding layout_binding;
4748 layout_binding.binding = 0;
4749 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4750 layout_binding.descriptorCount = 1;
4751 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4752 layout_binding.pImmutableSamplers = NULL;
4753
4754 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4755 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4756 ds_layout_ci.bindingCount = 1;
4757 ds_layout_ci.pBindings = &layout_binding;
4758 VkDescriptorSetLayout ds_layout;
4759 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4760 ASSERT_VK_SUCCESS(err);
4761
4762 VkDescriptorSetAllocateInfo alloc_info = {};
4763 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4764 alloc_info.descriptorSetCount = 1;
4765 alloc_info.descriptorPool = ds_pool;
4766 alloc_info.pSetLayouts = &ds_layout;
4767 VkDescriptorSet descriptor_set;
4768 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4769 ASSERT_VK_SUCCESS(err);
4770
4771 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4772 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4773 pipeline_layout_ci.pNext = NULL;
4774 pipeline_layout_ci.setLayoutCount = 1;
4775 pipeline_layout_ci.pSetLayouts = &ds_layout;
4776
4777 VkPipelineLayout pipeline_layout;
4778 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4779 ASSERT_VK_SUCCESS(err);
4780
4781 VkBuffer buffer;
4782 uint32_t queue_family_index = 0;
4783 VkBufferCreateInfo buffer_create_info = {};
4784 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4785 buffer_create_info.size = 1024;
4786 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4787 buffer_create_info.queueFamilyIndexCount = 1;
4788 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4789
4790 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4791 ASSERT_VK_SUCCESS(err);
4792
4793 VkMemoryRequirements memory_reqs;
4794 VkDeviceMemory buffer_memory;
4795
4796 VkMemoryAllocateInfo memory_info = {};
4797 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4798 memory_info.allocationSize = 0;
4799 memory_info.memoryTypeIndex = 0;
4800
4801 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4802 memory_info.allocationSize = memory_reqs.size;
4803 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4804 ASSERT_TRUE(pass);
4805
4806 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4807 ASSERT_VK_SUCCESS(err);
4808 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4809 ASSERT_VK_SUCCESS(err);
4810
4811 VkBufferView view;
4812 VkBufferViewCreateInfo bvci = {};
4813 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4814 bvci.buffer = buffer;
4815 bvci.format = VK_FORMAT_R8_UNORM;
4816 bvci.range = VK_WHOLE_SIZE;
4817
4818 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4819 ASSERT_VK_SUCCESS(err);
4820
4821 VkWriteDescriptorSet descriptor_write = {};
4822 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4823 descriptor_write.dstSet = descriptor_set;
4824 descriptor_write.dstBinding = 0;
4825 descriptor_write.descriptorCount = 1;
4826 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4827 descriptor_write.pTexelBufferView = &view;
4828
4829 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4830
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004831 char const *vsSource =
4832 "#version 450\n"
4833 "\n"
4834 "out gl_PerVertex { \n"
4835 " vec4 gl_Position;\n"
4836 "};\n"
4837 "void main(){\n"
4838 " gl_Position = vec4(1);\n"
4839 "}\n";
4840 char const *fsSource =
4841 "#version 450\n"
4842 "\n"
4843 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4844 "layout(location=0) out vec4 x;\n"
4845 "void main(){\n"
4846 " x = imageLoad(s, 0);\n"
4847 "}\n";
Tobin Ehlisea413442016-09-28 10:23:59 -06004848 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4849 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4850 VkPipelineObj pipe(m_device);
4851 pipe.AddShader(&vs);
4852 pipe.AddShader(&fs);
4853 pipe.AddColorAttachment();
4854 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4855
Tobin Ehlisea413442016-09-28 10:23:59 -06004856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer view ");
4857
Tony Barbour552f6c02016-12-21 14:34:07 -07004858 m_commandBuffer->BeginCommandBuffer();
4859 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4860
Tobin Ehlisea413442016-09-28 10:23:59 -06004861 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4862 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4863 VkRect2D scissor = {{0, 0}, {16, 16}};
4864 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4865 // Bind pipeline to cmd buffer
4866 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4867 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4868 &descriptor_set, 0, nullptr);
4869 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07004870 m_commandBuffer->EndRenderPass();
4871 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisea413442016-09-28 10:23:59 -06004872
4873 // Delete BufferView in order to invalidate cmd buffer
4874 vkDestroyBufferView(m_device->device(), view, NULL);
4875 // Now attempt submit of cmd buffer
4876 VkSubmitInfo submit_info = {};
4877 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4878 submit_info.commandBufferCount = 1;
4879 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4880 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4881 m_errorMonitor->VerifyFound();
4882
4883 // Clean-up
4884 vkDestroyBuffer(m_device->device(), buffer, NULL);
4885 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4886 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4887 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4888 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4889}
4890
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004891TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004892 TEST_DESCRIPTION(
4893 "Attempt to draw with a command buffer that is invalid "
4894 "due to an image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004895 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004896
4897 VkImage image;
4898 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4899 VkImageCreateInfo image_create_info = {};
4900 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4901 image_create_info.pNext = NULL;
4902 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4903 image_create_info.format = tex_format;
4904 image_create_info.extent.width = 32;
4905 image_create_info.extent.height = 32;
4906 image_create_info.extent.depth = 1;
4907 image_create_info.mipLevels = 1;
4908 image_create_info.arrayLayers = 1;
4909 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4910 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004911 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004912 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004913 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004914 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004915 // Have to bind memory to image before recording cmd in cmd buffer using it
4916 VkMemoryRequirements mem_reqs;
4917 VkDeviceMemory image_mem;
4918 bool pass;
4919 VkMemoryAllocateInfo mem_alloc = {};
4920 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4921 mem_alloc.pNext = NULL;
4922 mem_alloc.memoryTypeIndex = 0;
4923 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4924 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004925 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004926 ASSERT_TRUE(pass);
4927 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4928 ASSERT_VK_SUCCESS(err);
4929 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4930 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004931
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004932 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004933 VkClearColorValue ccv;
4934 ccv.float32[0] = 1.0f;
4935 ccv.float32[1] = 1.0f;
4936 ccv.float32[2] = 1.0f;
4937 ccv.float32[3] = 1.0f;
4938 VkImageSubresourceRange isr = {};
4939 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004940 isr.baseArrayLayer = 0;
4941 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004942 isr.layerCount = 1;
4943 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004944 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004945 m_commandBuffer->EndCommandBuffer();
4946
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004948 // Destroy image dependency prior to submit to cause ERROR
4949 vkDestroyImage(m_device->device(), image, NULL);
4950
4951 VkSubmitInfo submit_info = {};
4952 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4953 submit_info.commandBufferCount = 1;
4954 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4955 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4956
4957 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004958 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004959}
4960
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004961TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004962 TEST_DESCRIPTION(
4963 "Attempt to draw with a command buffer that is invalid "
4964 "due to a framebuffer image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004965 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004966 VkFormatProperties format_properties;
4967 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004968 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4969 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004970 return;
4971 }
4972
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004973 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4974
4975 VkImageCreateInfo image_ci = {};
4976 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4977 image_ci.pNext = NULL;
4978 image_ci.imageType = VK_IMAGE_TYPE_2D;
4979 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4980 image_ci.extent.width = 32;
4981 image_ci.extent.height = 32;
4982 image_ci.extent.depth = 1;
4983 image_ci.mipLevels = 1;
4984 image_ci.arrayLayers = 1;
4985 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
4986 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004987 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004988 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4989 image_ci.flags = 0;
4990 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004991 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004992
4993 VkMemoryRequirements memory_reqs;
4994 VkDeviceMemory image_memory;
4995 bool pass;
4996 VkMemoryAllocateInfo memory_info = {};
4997 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4998 memory_info.pNext = NULL;
4999 memory_info.allocationSize = 0;
5000 memory_info.memoryTypeIndex = 0;
5001 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5002 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005003 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005004 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005005 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005006 ASSERT_VK_SUCCESS(err);
5007 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5008 ASSERT_VK_SUCCESS(err);
5009
5010 VkImageViewCreateInfo ivci = {
5011 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5012 nullptr,
5013 0,
5014 image,
5015 VK_IMAGE_VIEW_TYPE_2D,
5016 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005017 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005018 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5019 };
5020 VkImageView view;
5021 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5022 ASSERT_VK_SUCCESS(err);
5023
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005024 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005025 VkFramebuffer fb;
5026 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5027 ASSERT_VK_SUCCESS(err);
5028
5029 // Just use default renderpass with our framebuffer
5030 m_renderPassBeginInfo.framebuffer = fb;
Jeremy Hayesba817e12017-03-03 15:51:11 -07005031 m_renderPassBeginInfo.renderArea.extent.width = 32;
5032 m_renderPassBeginInfo.renderArea.extent.height = 32;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005033 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005034 m_commandBuffer->BeginCommandBuffer();
5035 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5036 m_commandBuffer->EndRenderPass();
5037 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005038 // Destroy image attached to framebuffer to invalidate cmd buffer
5039 vkDestroyImage(m_device->device(), image, NULL);
5040 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005041 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005042 QueueCommandBuffer(false);
5043 m_errorMonitor->VerifyFound();
5044
5045 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5046 vkDestroyImageView(m_device->device(), view, nullptr);
5047 vkFreeMemory(m_device->device(), image_memory, nullptr);
5048}
5049
Tobin Ehlisb329f992016-10-12 13:20:29 -06005050TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
5051 TEST_DESCRIPTION("Delete in-use framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005052 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb329f992016-10-12 13:20:29 -06005053 VkFormatProperties format_properties;
5054 VkResult err = VK_SUCCESS;
5055 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5056
Tobin Ehlisb329f992016-10-12 13:20:29 -06005057 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5058
5059 VkImageObj image(m_device);
5060 image.init(256, 256, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
5061 ASSERT_TRUE(image.initialized());
5062 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5063
5064 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5065 VkFramebuffer fb;
5066 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5067 ASSERT_VK_SUCCESS(err);
5068
5069 // Just use default renderpass with our framebuffer
5070 m_renderPassBeginInfo.framebuffer = fb;
5071 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005072 m_commandBuffer->BeginCommandBuffer();
5073 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5074 m_commandBuffer->EndRenderPass();
5075 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisb329f992016-10-12 13:20:29 -06005076 // Submit cmd buffer to put it in-flight
5077 VkSubmitInfo submit_info = {};
5078 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5079 submit_info.commandBufferCount = 1;
5080 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5081 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5082 // Destroy framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005083 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00422);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005084 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5085 m_errorMonitor->VerifyFound();
5086 // Wait for queue to complete so we can safely destroy everything
5087 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005088 m_errorMonitor->SetUnexpectedError("If framebuffer is not VK_NULL_HANDLE, framebuffer must be a valid VkFramebuffer handle");
5089 m_errorMonitor->SetUnexpectedError("Unable to remove Framebuffer obj");
Tobin Ehlisb329f992016-10-12 13:20:29 -06005090 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5091}
5092
Tobin Ehlis88becd72016-09-21 14:33:41 -06005093TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
5094 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005095 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis88becd72016-09-21 14:33:41 -06005096 VkFormatProperties format_properties;
5097 VkResult err = VK_SUCCESS;
5098 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005099
Tobin Ehlis88becd72016-09-21 14:33:41 -06005100 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5101
5102 VkImageCreateInfo image_ci = {};
5103 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5104 image_ci.pNext = NULL;
5105 image_ci.imageType = VK_IMAGE_TYPE_2D;
5106 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5107 image_ci.extent.width = 256;
5108 image_ci.extent.height = 256;
5109 image_ci.extent.depth = 1;
5110 image_ci.mipLevels = 1;
5111 image_ci.arrayLayers = 1;
5112 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5113 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06005114 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06005115 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5116 image_ci.flags = 0;
5117 VkImage image;
5118 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
5119
5120 VkMemoryRequirements memory_reqs;
5121 VkDeviceMemory image_memory;
5122 bool pass;
5123 VkMemoryAllocateInfo memory_info = {};
5124 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5125 memory_info.pNext = NULL;
5126 memory_info.allocationSize = 0;
5127 memory_info.memoryTypeIndex = 0;
5128 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5129 memory_info.allocationSize = memory_reqs.size;
5130 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5131 ASSERT_TRUE(pass);
5132 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5133 ASSERT_VK_SUCCESS(err);
5134 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5135 ASSERT_VK_SUCCESS(err);
5136
5137 VkImageViewCreateInfo ivci = {
5138 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5139 nullptr,
5140 0,
5141 image,
5142 VK_IMAGE_VIEW_TYPE_2D,
5143 VK_FORMAT_B8G8R8A8_UNORM,
5144 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
5145 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5146 };
5147 VkImageView view;
5148 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5149 ASSERT_VK_SUCCESS(err);
5150
5151 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5152 VkFramebuffer fb;
5153 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5154 ASSERT_VK_SUCCESS(err);
5155
5156 // Just use default renderpass with our framebuffer
5157 m_renderPassBeginInfo.framebuffer = fb;
5158 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005159 m_commandBuffer->BeginCommandBuffer();
5160 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5161 m_commandBuffer->EndRenderPass();
5162 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis88becd72016-09-21 14:33:41 -06005163 // Submit cmd buffer to put it (and attached imageView) in-flight
5164 VkSubmitInfo submit_info = {};
5165 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5166 submit_info.commandBufferCount = 1;
5167 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5168 // Submit cmd buffer to put framebuffer and children in-flight
5169 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5170 // Destroy image attached to framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00743);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005172 vkDestroyImage(m_device->device(), image, NULL);
5173 m_errorMonitor->VerifyFound();
5174 // Wait for queue to complete so we can safely destroy image and other objects
5175 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005176 m_errorMonitor->SetUnexpectedError("If image is not VK_NULL_HANDLE, image must be a valid VkImage handle");
5177 m_errorMonitor->SetUnexpectedError("Unable to remove Image obj");
Tobin Ehlis88becd72016-09-21 14:33:41 -06005178 vkDestroyImage(m_device->device(), image, NULL);
5179 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5180 vkDestroyImageView(m_device->device(), view, nullptr);
5181 vkFreeMemory(m_device->device(), image_memory, nullptr);
5182}
5183
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005184TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
5185 TEST_DESCRIPTION("Delete in-use renderPass.");
5186
Tony Barbour1fa09702017-03-16 12:09:08 -06005187 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005188 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5189
5190 // Create simple renderpass
5191 VkAttachmentReference attach = {};
5192 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
5193 VkSubpassDescription subpass = {};
Dave Houlton756e6742017-03-23 14:33:22 -06005194 subpass.colorAttachmentCount = 1;
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005195 subpass.pColorAttachments = &attach;
5196 VkRenderPassCreateInfo rpci = {};
5197 rpci.subpassCount = 1;
5198 rpci.pSubpasses = &subpass;
5199 rpci.attachmentCount = 1;
5200 VkAttachmentDescription attach_desc = {};
5201 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
5202 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
5203 rpci.pAttachments = &attach_desc;
5204 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5205 VkRenderPass rp;
5206 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5207 ASSERT_VK_SUCCESS(err);
5208
5209 // Create a pipeline that uses the given renderpass
5210 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5211 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5212
5213 VkPipelineLayout pipeline_layout;
5214 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5215 ASSERT_VK_SUCCESS(err);
5216
5217 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5218 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5219 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005220 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005221 vp_state_ci.pViewports = &vp;
5222 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005223 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005224 vp_state_ci.pScissors = &scissors;
5225
5226 VkPipelineShaderStageCreateInfo shaderStages[2];
5227 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5228
5229 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005230 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005231 // but add it to be able to run on more devices
5232 shaderStages[0] = vs.GetStageCreateInfo();
5233 shaderStages[1] = fs.GetStageCreateInfo();
5234
5235 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5236 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5237
5238 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5239 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5240 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5241
5242 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5243 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5244 rs_ci.rasterizerDiscardEnable = true;
5245 rs_ci.lineWidth = 1.0f;
5246
5247 VkPipelineColorBlendAttachmentState att = {};
5248 att.blendEnable = VK_FALSE;
5249 att.colorWriteMask = 0xf;
5250
5251 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5252 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5253 cb_ci.attachmentCount = 1;
5254 cb_ci.pAttachments = &att;
5255
5256 VkGraphicsPipelineCreateInfo gp_ci = {};
5257 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5258 gp_ci.stageCount = 2;
5259 gp_ci.pStages = shaderStages;
5260 gp_ci.pVertexInputState = &vi_ci;
5261 gp_ci.pInputAssemblyState = &ia_ci;
5262 gp_ci.pViewportState = &vp_state_ci;
5263 gp_ci.pRasterizationState = &rs_ci;
5264 gp_ci.pColorBlendState = &cb_ci;
5265 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5266 gp_ci.layout = pipeline_layout;
5267 gp_ci.renderPass = rp;
5268
5269 VkPipelineCacheCreateInfo pc_ci = {};
5270 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5271
Dave Houlton756e6742017-03-23 14:33:22 -06005272 m_errorMonitor->ExpectSuccess();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005273 VkPipeline pipeline;
5274 VkPipelineCache pipe_cache;
5275 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
5276 ASSERT_VK_SUCCESS(err);
5277
5278 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
5279 ASSERT_VK_SUCCESS(err);
Dave Houlton756e6742017-03-23 14:33:22 -06005280
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005281 // Bind pipeline to cmd buffer, will also bind renderpass
5282 m_commandBuffer->BeginCommandBuffer();
5283 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5284 m_commandBuffer->EndCommandBuffer();
5285
5286 VkSubmitInfo submit_info = {};
5287 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5288 submit_info.commandBufferCount = 1;
5289 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5290 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houlton756e6742017-03-23 14:33:22 -06005291 m_errorMonitor->VerifyNotFound();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005292
5293 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
5294 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5295 m_errorMonitor->VerifyFound();
5296
5297 // Wait for queue to complete so we can safely destroy everything
5298 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005299 m_errorMonitor->SetUnexpectedError("If renderPass is not VK_NULL_HANDLE, renderPass must be a valid VkRenderPass handle");
5300 m_errorMonitor->SetUnexpectedError("Unable to remove Render Pass obj");
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005301 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5302 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5303 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
5304 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
5305}
5306
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005307TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005308 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005309 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005310
5311 VkImage image;
5312 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5313 VkImageCreateInfo image_create_info = {};
5314 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5315 image_create_info.pNext = NULL;
5316 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5317 image_create_info.format = tex_format;
5318 image_create_info.extent.width = 32;
5319 image_create_info.extent.height = 32;
5320 image_create_info.extent.depth = 1;
5321 image_create_info.mipLevels = 1;
5322 image_create_info.arrayLayers = 1;
5323 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5324 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005325 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005326 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005327 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005328 ASSERT_VK_SUCCESS(err);
5329 // Have to bind memory to image before recording cmd in cmd buffer using it
5330 VkMemoryRequirements mem_reqs;
5331 VkDeviceMemory image_mem;
5332 bool pass;
5333 VkMemoryAllocateInfo mem_alloc = {};
5334 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5335 mem_alloc.pNext = NULL;
5336 mem_alloc.memoryTypeIndex = 0;
5337 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
5338 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005339 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005340 ASSERT_TRUE(pass);
5341 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
5342 ASSERT_VK_SUCCESS(err);
5343
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005344 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
5345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005346 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005347
5348 m_commandBuffer->BeginCommandBuffer();
5349 VkClearColorValue ccv;
5350 ccv.float32[0] = 1.0f;
5351 ccv.float32[1] = 1.0f;
5352 ccv.float32[2] = 1.0f;
5353 ccv.float32[3] = 1.0f;
5354 VkImageSubresourceRange isr = {};
5355 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5356 isr.baseArrayLayer = 0;
5357 isr.baseMipLevel = 0;
5358 isr.layerCount = 1;
5359 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005360 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005361 m_commandBuffer->EndCommandBuffer();
5362
5363 m_errorMonitor->VerifyFound();
5364 vkDestroyImage(m_device->device(), image, NULL);
5365 vkFreeMemory(m_device->device(), image_mem, nullptr);
5366}
5367
5368TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005369 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005370 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005371
5372 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005373 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005374 VK_IMAGE_TILING_OPTIMAL, 0);
5375 ASSERT_TRUE(image.initialized());
5376
5377 VkBuffer buffer;
5378 VkDeviceMemory mem;
5379 VkMemoryRequirements mem_reqs;
5380
5381 VkBufferCreateInfo buf_info = {};
5382 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12005383 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005384 buf_info.size = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005385 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5386 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
5387 ASSERT_VK_SUCCESS(err);
5388
5389 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
5390
5391 VkMemoryAllocateInfo alloc_info = {};
5392 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005393 alloc_info.allocationSize = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005394 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005395 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005396 if (!pass) {
5397 vkDestroyBuffer(m_device->device(), buffer, NULL);
5398 return;
5399 }
5400 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
5401 ASSERT_VK_SUCCESS(err);
5402
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005403 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5404 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005405 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005406 VkBufferImageCopy region = {};
Mark Lobodzinski80871462017-02-16 10:37:27 -07005407 region.bufferRowLength = 16;
5408 region.bufferImageHeight = 16;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005409 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5410
5411 region.imageSubresource.layerCount = 1;
5412 region.imageExtent.height = 4;
5413 region.imageExtent.width = 4;
5414 region.imageExtent.depth = 1;
5415 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005416 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5417 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005418 m_commandBuffer->EndCommandBuffer();
5419
5420 m_errorMonitor->VerifyFound();
5421
5422 vkDestroyBuffer(m_device->device(), buffer, NULL);
5423 vkFreeMemory(m_device->handle(), mem, NULL);
5424}
5425
Tobin Ehlis85940f52016-07-07 16:57:21 -06005426TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005427 TEST_DESCRIPTION(
5428 "Attempt to draw with a command buffer that is invalid "
5429 "due to an event dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005430 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85940f52016-07-07 16:57:21 -06005431
5432 VkEvent event;
5433 VkEventCreateInfo evci = {};
5434 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5435 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
5436 ASSERT_VK_SUCCESS(result);
5437
5438 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005439 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06005440 m_commandBuffer->EndCommandBuffer();
5441
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005442 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005443 // Destroy event dependency prior to submit to cause ERROR
5444 vkDestroyEvent(m_device->device(), event, NULL);
5445
5446 VkSubmitInfo submit_info = {};
5447 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5448 submit_info.commandBufferCount = 1;
5449 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5450 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5451
5452 m_errorMonitor->VerifyFound();
5453}
5454
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005455TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005456 TEST_DESCRIPTION(
5457 "Attempt to draw with a command buffer that is invalid "
5458 "due to a query pool dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005459 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005460
5461 VkQueryPool query_pool;
5462 VkQueryPoolCreateInfo qpci{};
5463 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5464 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
5465 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005466 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005467 ASSERT_VK_SUCCESS(result);
5468
5469 m_commandBuffer->BeginCommandBuffer();
5470 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
5471 m_commandBuffer->EndCommandBuffer();
5472
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005473 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound query pool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005474 // Destroy query pool dependency prior to submit to cause ERROR
5475 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
5476
5477 VkSubmitInfo submit_info = {};
5478 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5479 submit_info.commandBufferCount = 1;
5480 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5481 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5482
5483 m_errorMonitor->VerifyFound();
5484}
5485
Tobin Ehlis24130d92016-07-08 15:50:53 -06005486TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005487 TEST_DESCRIPTION(
5488 "Attempt to draw with a command buffer that is invalid "
5489 "due to a pipeline dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005490 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis24130d92016-07-08 15:50:53 -06005491 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5492
5493 VkResult err;
5494
5495 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5496 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5497
5498 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005499 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005500 ASSERT_VK_SUCCESS(err);
5501
5502 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5503 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5504 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005505 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06005506 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005507 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005508 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis24130d92016-07-08 15:50:53 -06005509 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005510
5511 VkPipelineShaderStageCreateInfo shaderStages[2];
5512 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5513
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005514 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005515 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005516 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06005517 shaderStages[0] = vs.GetStageCreateInfo();
5518 shaderStages[1] = fs.GetStageCreateInfo();
5519
5520 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5521 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5522
5523 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5524 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5525 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5526
5527 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5528 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12005529 rs_ci.rasterizerDiscardEnable = true;
5530 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005531
5532 VkPipelineColorBlendAttachmentState att = {};
5533 att.blendEnable = VK_FALSE;
5534 att.colorWriteMask = 0xf;
5535
5536 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5537 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5538 cb_ci.attachmentCount = 1;
5539 cb_ci.pAttachments = &att;
5540
5541 VkGraphicsPipelineCreateInfo gp_ci = {};
5542 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5543 gp_ci.stageCount = 2;
5544 gp_ci.pStages = shaderStages;
5545 gp_ci.pVertexInputState = &vi_ci;
5546 gp_ci.pInputAssemblyState = &ia_ci;
5547 gp_ci.pViewportState = &vp_state_ci;
5548 gp_ci.pRasterizationState = &rs_ci;
5549 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005550 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5551 gp_ci.layout = pipeline_layout;
5552 gp_ci.renderPass = renderPass();
5553
5554 VkPipelineCacheCreateInfo pc_ci = {};
5555 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5556
5557 VkPipeline pipeline;
5558 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005559 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005560 ASSERT_VK_SUCCESS(err);
5561
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005562 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005563 ASSERT_VK_SUCCESS(err);
5564
5565 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005566 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005567 m_commandBuffer->EndCommandBuffer();
5568 // Now destroy pipeline in order to cause error when submitting
5569 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5570
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005571 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005572
5573 VkSubmitInfo submit_info = {};
5574 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5575 submit_info.commandBufferCount = 1;
5576 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5577 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5578
5579 m_errorMonitor->VerifyFound();
5580 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5581 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5582}
5583
Tobin Ehlis31289162016-08-17 14:57:58 -06005584TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005585 TEST_DESCRIPTION(
5586 "Attempt to draw with a command buffer that is invalid "
5587 "due to a bound descriptor set with a buffer dependency "
5588 "being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005589 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis31289162016-08-17 14:57:58 -06005590 ASSERT_NO_FATAL_FAILURE(InitViewport());
5591 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5592
5593 VkDescriptorPoolSize ds_type_count = {};
5594 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5595 ds_type_count.descriptorCount = 1;
5596
5597 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5598 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5599 ds_pool_ci.pNext = NULL;
5600 ds_pool_ci.maxSets = 1;
5601 ds_pool_ci.poolSizeCount = 1;
5602 ds_pool_ci.pPoolSizes = &ds_type_count;
5603
5604 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005605 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06005606 ASSERT_VK_SUCCESS(err);
5607
5608 VkDescriptorSetLayoutBinding dsl_binding = {};
5609 dsl_binding.binding = 0;
5610 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5611 dsl_binding.descriptorCount = 1;
5612 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5613 dsl_binding.pImmutableSamplers = NULL;
5614
5615 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5616 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5617 ds_layout_ci.pNext = NULL;
5618 ds_layout_ci.bindingCount = 1;
5619 ds_layout_ci.pBindings = &dsl_binding;
5620 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005621 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005622 ASSERT_VK_SUCCESS(err);
5623
5624 VkDescriptorSet descriptorSet;
5625 VkDescriptorSetAllocateInfo alloc_info = {};
5626 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5627 alloc_info.descriptorSetCount = 1;
5628 alloc_info.descriptorPool = ds_pool;
5629 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005630 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005631 ASSERT_VK_SUCCESS(err);
5632
5633 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5634 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5635 pipeline_layout_ci.pNext = NULL;
5636 pipeline_layout_ci.setLayoutCount = 1;
5637 pipeline_layout_ci.pSetLayouts = &ds_layout;
5638
5639 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005640 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005641 ASSERT_VK_SUCCESS(err);
5642
5643 // Create a buffer to update the descriptor with
5644 uint32_t qfi = 0;
5645 VkBufferCreateInfo buffCI = {};
5646 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5647 buffCI.size = 1024;
5648 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5649 buffCI.queueFamilyIndexCount = 1;
5650 buffCI.pQueueFamilyIndices = &qfi;
5651
5652 VkBuffer buffer;
5653 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5654 ASSERT_VK_SUCCESS(err);
5655 // Allocate memory and bind to buffer so we can make it to the appropriate
5656 // error
5657 VkMemoryAllocateInfo mem_alloc = {};
5658 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5659 mem_alloc.pNext = NULL;
5660 mem_alloc.allocationSize = 1024;
5661 mem_alloc.memoryTypeIndex = 0;
5662
5663 VkMemoryRequirements memReqs;
5664 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005665 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005666 if (!pass) {
5667 vkDestroyBuffer(m_device->device(), buffer, NULL);
5668 return;
5669 }
5670
5671 VkDeviceMemory mem;
5672 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5673 ASSERT_VK_SUCCESS(err);
5674 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5675 ASSERT_VK_SUCCESS(err);
5676 // Correctly update descriptor to avoid "NOT_UPDATED" error
5677 VkDescriptorBufferInfo buffInfo = {};
5678 buffInfo.buffer = buffer;
5679 buffInfo.offset = 0;
5680 buffInfo.range = 1024;
5681
5682 VkWriteDescriptorSet descriptor_write;
5683 memset(&descriptor_write, 0, sizeof(descriptor_write));
5684 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5685 descriptor_write.dstSet = descriptorSet;
5686 descriptor_write.dstBinding = 0;
5687 descriptor_write.descriptorCount = 1;
5688 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5689 descriptor_write.pBufferInfo = &buffInfo;
5690
5691 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5692
5693 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005694 char const *vsSource =
5695 "#version 450\n"
5696 "\n"
5697 "out gl_PerVertex { \n"
5698 " vec4 gl_Position;\n"
5699 "};\n"
5700 "void main(){\n"
5701 " gl_Position = vec4(1);\n"
5702 "}\n";
5703 char const *fsSource =
5704 "#version 450\n"
5705 "\n"
5706 "layout(location=0) out vec4 x;\n"
5707 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5708 "void main(){\n"
5709 " x = vec4(bar.y);\n"
5710 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005711 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5712 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5713 VkPipelineObj pipe(m_device);
5714 pipe.AddShader(&vs);
5715 pipe.AddShader(&fs);
5716 pipe.AddColorAttachment();
5717 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5718
Tony Barbour552f6c02016-12-21 14:34:07 -07005719 m_commandBuffer->BeginCommandBuffer();
5720 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005721 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5722 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5723 &descriptorSet, 0, NULL);
Rene Lindsay0583ac92017-01-16 14:29:10 -07005724
5725 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
5726 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
5727
Tobin Ehlis31289162016-08-17 14:57:58 -06005728 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005729 m_commandBuffer->EndRenderPass();
5730 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005732 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5733 vkDestroyBuffer(m_device->device(), buffer, NULL);
5734 // Attempt to submit cmd buffer
5735 VkSubmitInfo submit_info = {};
5736 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5737 submit_info.commandBufferCount = 1;
5738 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5739 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5740 m_errorMonitor->VerifyFound();
5741 // Cleanup
5742 vkFreeMemory(m_device->device(), mem, NULL);
5743
5744 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5745 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5746 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5747}
5748
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005749TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005750 TEST_DESCRIPTION(
5751 "Attempt to draw with a command buffer that is invalid "
5752 "due to a bound descriptor sets with a combined image "
5753 "sampler having their image, sampler, and descriptor set "
5754 "each respectively destroyed and then attempting to "
5755 "submit associated cmd buffers. Attempt to destroy a "
5756 "DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005757 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005758 ASSERT_NO_FATAL_FAILURE(InitViewport());
5759 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5760
5761 VkDescriptorPoolSize ds_type_count = {};
5762 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5763 ds_type_count.descriptorCount = 1;
5764
5765 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5766 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5767 ds_pool_ci.pNext = NULL;
Rene Lindsayed88b732017-01-27 15:55:29 -07005768 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005769 ds_pool_ci.maxSets = 1;
5770 ds_pool_ci.poolSizeCount = 1;
5771 ds_pool_ci.pPoolSizes = &ds_type_count;
5772
5773 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005774 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005775 ASSERT_VK_SUCCESS(err);
5776
5777 VkDescriptorSetLayoutBinding dsl_binding = {};
5778 dsl_binding.binding = 0;
5779 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5780 dsl_binding.descriptorCount = 1;
5781 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5782 dsl_binding.pImmutableSamplers = NULL;
5783
5784 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5785 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5786 ds_layout_ci.pNext = NULL;
5787 ds_layout_ci.bindingCount = 1;
5788 ds_layout_ci.pBindings = &dsl_binding;
5789 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005790 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005791 ASSERT_VK_SUCCESS(err);
5792
5793 VkDescriptorSet descriptorSet;
5794 VkDescriptorSetAllocateInfo alloc_info = {};
5795 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5796 alloc_info.descriptorSetCount = 1;
5797 alloc_info.descriptorPool = ds_pool;
5798 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005799 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005800 ASSERT_VK_SUCCESS(err);
5801
5802 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5803 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5804 pipeline_layout_ci.pNext = NULL;
5805 pipeline_layout_ci.setLayoutCount = 1;
5806 pipeline_layout_ci.pSetLayouts = &ds_layout;
5807
5808 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005809 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005810 ASSERT_VK_SUCCESS(err);
5811
5812 // Create images to update the descriptor with
5813 VkImage image;
5814 VkImage image2;
5815 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5816 const int32_t tex_width = 32;
5817 const int32_t tex_height = 32;
5818 VkImageCreateInfo image_create_info = {};
5819 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5820 image_create_info.pNext = NULL;
5821 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5822 image_create_info.format = tex_format;
5823 image_create_info.extent.width = tex_width;
5824 image_create_info.extent.height = tex_height;
5825 image_create_info.extent.depth = 1;
5826 image_create_info.mipLevels = 1;
5827 image_create_info.arrayLayers = 1;
5828 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5829 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5830 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5831 image_create_info.flags = 0;
5832 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5833 ASSERT_VK_SUCCESS(err);
5834 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5835 ASSERT_VK_SUCCESS(err);
5836
5837 VkMemoryRequirements memory_reqs;
5838 VkDeviceMemory image_memory;
5839 bool pass;
5840 VkMemoryAllocateInfo memory_info = {};
5841 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5842 memory_info.pNext = NULL;
5843 memory_info.allocationSize = 0;
5844 memory_info.memoryTypeIndex = 0;
5845 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5846 // Allocate enough memory for both images
5847 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005848 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005849 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005850 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005851 ASSERT_VK_SUCCESS(err);
5852 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5853 ASSERT_VK_SUCCESS(err);
5854 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005855 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005856 ASSERT_VK_SUCCESS(err);
5857
5858 VkImageViewCreateInfo image_view_create_info = {};
5859 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5860 image_view_create_info.image = image;
5861 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5862 image_view_create_info.format = tex_format;
5863 image_view_create_info.subresourceRange.layerCount = 1;
5864 image_view_create_info.subresourceRange.baseMipLevel = 0;
5865 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005866 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005867
5868 VkImageView view;
5869 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005870 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005871 ASSERT_VK_SUCCESS(err);
5872 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005873 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005874 ASSERT_VK_SUCCESS(err);
5875 // Create Samplers
5876 VkSamplerCreateInfo sampler_ci = {};
5877 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5878 sampler_ci.pNext = NULL;
5879 sampler_ci.magFilter = VK_FILTER_NEAREST;
5880 sampler_ci.minFilter = VK_FILTER_NEAREST;
5881 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5882 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5883 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5884 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5885 sampler_ci.mipLodBias = 1.0;
5886 sampler_ci.anisotropyEnable = VK_FALSE;
5887 sampler_ci.maxAnisotropy = 1;
5888 sampler_ci.compareEnable = VK_FALSE;
5889 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5890 sampler_ci.minLod = 1.0;
5891 sampler_ci.maxLod = 1.0;
5892 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5893 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5894 VkSampler sampler;
5895 VkSampler sampler2;
5896 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5897 ASSERT_VK_SUCCESS(err);
5898 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5899 ASSERT_VK_SUCCESS(err);
5900 // Update descriptor with image and sampler
5901 VkDescriptorImageInfo img_info = {};
5902 img_info.sampler = sampler;
5903 img_info.imageView = view;
5904 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5905
5906 VkWriteDescriptorSet descriptor_write;
5907 memset(&descriptor_write, 0, sizeof(descriptor_write));
5908 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5909 descriptor_write.dstSet = descriptorSet;
5910 descriptor_write.dstBinding = 0;
5911 descriptor_write.descriptorCount = 1;
5912 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5913 descriptor_write.pImageInfo = &img_info;
5914
5915 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5916
5917 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005918 char const *vsSource =
5919 "#version 450\n"
5920 "\n"
5921 "out gl_PerVertex { \n"
5922 " vec4 gl_Position;\n"
5923 "};\n"
5924 "void main(){\n"
5925 " gl_Position = vec4(1);\n"
5926 "}\n";
5927 char const *fsSource =
5928 "#version 450\n"
5929 "\n"
5930 "layout(set=0, binding=0) uniform sampler2D s;\n"
5931 "layout(location=0) out vec4 x;\n"
5932 "void main(){\n"
5933 " x = texture(s, vec2(1));\n"
5934 "}\n";
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005935 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5936 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5937 VkPipelineObj pipe(m_device);
5938 pipe.AddShader(&vs);
5939 pipe.AddShader(&fs);
5940 pipe.AddColorAttachment();
5941 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5942
5943 // First error case is destroying sampler prior to cmd buffer submission
Jeremy Hayesb91c79d2017-02-27 15:09:03 -07005944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound sampler");
Tony Barbour552f6c02016-12-21 14:34:07 -07005945 m_commandBuffer->BeginCommandBuffer();
5946 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005947 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5948 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5949 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005950 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5951 VkRect2D scissor = {{0, 0}, {16, 16}};
5952 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5953 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005954 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005955 m_commandBuffer->EndRenderPass();
5956 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005957 // Destroy sampler invalidates the cmd buffer, causing error on submit
5958 vkDestroySampler(m_device->device(), sampler, NULL);
5959 // Attempt to submit cmd buffer
5960 VkSubmitInfo submit_info = {};
5961 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5962 submit_info.commandBufferCount = 1;
5963 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5964 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5965 m_errorMonitor->VerifyFound();
Rene Lindsaya31285f2017-01-11 16:35:53 -07005966
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005967 // Now re-update descriptor with valid sampler and delete image
5968 img_info.sampler = sampler2;
5969 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005970
5971 VkCommandBufferBeginInfo info = {};
5972 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5973 info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
5974
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005975 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Rene Lindsayed88b732017-01-27 15:55:29 -07005976 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005977 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005978 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5979 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5980 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005981 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5982 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005983 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005984 m_commandBuffer->EndRenderPass();
5985 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005986 // Destroy image invalidates the cmd buffer, causing error on submit
5987 vkDestroyImage(m_device->device(), image, NULL);
5988 // Attempt to submit cmd buffer
5989 submit_info = {};
5990 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5991 submit_info.commandBufferCount = 1;
5992 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5993 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5994 m_errorMonitor->VerifyFound();
5995 // Now update descriptor to be valid, but then free descriptor
5996 img_info.imageView = view2;
5997 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005998 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005999 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006000 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6001 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6002 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006003 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6004 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006005 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006006 m_commandBuffer->EndRenderPass();
6007 m_commandBuffer->EndCommandBuffer();
Tony Barbourc373c012017-01-26 10:53:28 -07006008 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -07006009
6010 // Immediately try to destroy the descriptor set in the active command buffer - failure expected
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006012 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06006013 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006014
6015 // Try again once the queue is idle - should succeed w/o error
Dave Houltond5507dd2017-01-24 15:29:02 -07006016 // TODO - though the particular error above doesn't re-occur, there are other 'unexpecteds' still to clean up
Dave Houltonfbf52152017-01-06 12:55:29 -07006017 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006018 m_errorMonitor->SetUnexpectedError(
6019 "pDescriptorSets must be a pointer to an array of descriptorSetCount VkDescriptorSet handles, each element of which must "
6020 "either be a valid handle or VK_NULL_HANDLE");
6021 m_errorMonitor->SetUnexpectedError("Unable to remove Descriptor Set obj");
Dave Houltonfbf52152017-01-06 12:55:29 -07006022 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
6023
6024 // Attempt to submit cmd buffer containing the freed descriptor set
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006025 submit_info = {};
6026 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6027 submit_info.commandBufferCount = 1;
6028 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07006029 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound descriptor set ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006030 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6031 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006032
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006033 // Cleanup
6034 vkFreeMemory(m_device->device(), image_memory, NULL);
6035 vkDestroySampler(m_device->device(), sampler2, NULL);
6036 vkDestroyImage(m_device->device(), image2, NULL);
6037 vkDestroyImageView(m_device->device(), view, NULL);
6038 vkDestroyImageView(m_device->device(), view2, NULL);
6039 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6040 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6041 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6042}
6043
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006044TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
6045 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006046 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006047 ASSERT_NO_FATAL_FAILURE(InitViewport());
6048 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6049
6050 VkDescriptorPoolSize ds_type_count = {};
6051 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6052 ds_type_count.descriptorCount = 1;
6053
6054 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6055 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6056 ds_pool_ci.pNext = NULL;
6057 ds_pool_ci.maxSets = 1;
6058 ds_pool_ci.poolSizeCount = 1;
6059 ds_pool_ci.pPoolSizes = &ds_type_count;
6060
6061 VkDescriptorPool ds_pool;
6062 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6063 ASSERT_VK_SUCCESS(err);
6064
6065 VkDescriptorSetLayoutBinding dsl_binding = {};
6066 dsl_binding.binding = 0;
6067 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6068 dsl_binding.descriptorCount = 1;
6069 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6070 dsl_binding.pImmutableSamplers = NULL;
6071
6072 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6073 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6074 ds_layout_ci.pNext = NULL;
6075 ds_layout_ci.bindingCount = 1;
6076 ds_layout_ci.pBindings = &dsl_binding;
6077 VkDescriptorSetLayout ds_layout;
6078 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6079 ASSERT_VK_SUCCESS(err);
6080
6081 VkDescriptorSet descriptor_set;
6082 VkDescriptorSetAllocateInfo alloc_info = {};
6083 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6084 alloc_info.descriptorSetCount = 1;
6085 alloc_info.descriptorPool = ds_pool;
6086 alloc_info.pSetLayouts = &ds_layout;
6087 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
6088 ASSERT_VK_SUCCESS(err);
6089
6090 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6091 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6092 pipeline_layout_ci.pNext = NULL;
6093 pipeline_layout_ci.setLayoutCount = 1;
6094 pipeline_layout_ci.pSetLayouts = &ds_layout;
6095
6096 VkPipelineLayout pipeline_layout;
6097 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6098 ASSERT_VK_SUCCESS(err);
6099
6100 // Create image to update the descriptor with
6101 VkImageObj image(m_device);
6102 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
6103 ASSERT_TRUE(image.initialized());
6104
6105 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
6106 // Create Sampler
6107 VkSamplerCreateInfo sampler_ci = {};
6108 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6109 sampler_ci.pNext = NULL;
6110 sampler_ci.magFilter = VK_FILTER_NEAREST;
6111 sampler_ci.minFilter = VK_FILTER_NEAREST;
6112 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6113 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6114 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6115 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6116 sampler_ci.mipLodBias = 1.0;
6117 sampler_ci.anisotropyEnable = VK_FALSE;
6118 sampler_ci.maxAnisotropy = 1;
6119 sampler_ci.compareEnable = VK_FALSE;
6120 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6121 sampler_ci.minLod = 1.0;
6122 sampler_ci.maxLod = 1.0;
6123 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6124 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6125 VkSampler sampler;
6126 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6127 ASSERT_VK_SUCCESS(err);
6128 // Update descriptor with image and sampler
6129 VkDescriptorImageInfo img_info = {};
6130 img_info.sampler = sampler;
6131 img_info.imageView = view;
6132 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6133
6134 VkWriteDescriptorSet descriptor_write;
6135 memset(&descriptor_write, 0, sizeof(descriptor_write));
6136 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6137 descriptor_write.dstSet = descriptor_set;
6138 descriptor_write.dstBinding = 0;
6139 descriptor_write.descriptorCount = 1;
6140 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6141 descriptor_write.pImageInfo = &img_info;
6142
6143 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6144
6145 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006146 char const *vsSource =
6147 "#version 450\n"
6148 "\n"
6149 "out gl_PerVertex { \n"
6150 " vec4 gl_Position;\n"
6151 "};\n"
6152 "void main(){\n"
6153 " gl_Position = vec4(1);\n"
6154 "}\n";
6155 char const *fsSource =
6156 "#version 450\n"
6157 "\n"
6158 "layout(set=0, binding=0) uniform sampler2D s;\n"
6159 "layout(location=0) out vec4 x;\n"
6160 "void main(){\n"
6161 " x = texture(s, vec2(1));\n"
6162 "}\n";
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006163 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6164 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6165 VkPipelineObj pipe(m_device);
6166 pipe.AddShader(&vs);
6167 pipe.AddShader(&fs);
6168 pipe.AddColorAttachment();
6169 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6170
Tony Barbour552f6c02016-12-21 14:34:07 -07006171 m_commandBuffer->BeginCommandBuffer();
6172 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006173 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6174 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6175 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006176
6177 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6178 VkRect2D scissor = {{0, 0}, {16, 16}};
6179 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6180 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6181
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006182 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006183 m_commandBuffer->EndRenderPass();
6184 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006185 // Submit cmd buffer to put pool in-flight
6186 VkSubmitInfo submit_info = {};
6187 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6188 submit_info.commandBufferCount = 1;
6189 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6190 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6191 // Destroy pool while in-flight, causing error
6192 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete descriptor pool ");
6193 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6194 m_errorMonitor->VerifyFound();
6195 vkQueueWaitIdle(m_device->m_queue);
6196 // Cleanup
6197 vkDestroySampler(m_device->device(), sampler, NULL);
6198 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6199 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006200 m_errorMonitor->SetUnexpectedError(
6201 "If descriptorPool is not VK_NULL_HANDLE, descriptorPool must be a valid VkDescriptorPool handle");
6202 m_errorMonitor->SetUnexpectedError("Unable to remove Descriptor Pool obj");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006203 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006204 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006205}
6206
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006207TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
6208 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006209 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006210 ASSERT_NO_FATAL_FAILURE(InitViewport());
6211 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6212
6213 VkDescriptorPoolSize ds_type_count = {};
6214 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6215 ds_type_count.descriptorCount = 1;
6216
6217 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6218 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6219 ds_pool_ci.pNext = NULL;
6220 ds_pool_ci.maxSets = 1;
6221 ds_pool_ci.poolSizeCount = 1;
6222 ds_pool_ci.pPoolSizes = &ds_type_count;
6223
6224 VkDescriptorPool ds_pool;
6225 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6226 ASSERT_VK_SUCCESS(err);
6227
6228 VkDescriptorSetLayoutBinding dsl_binding = {};
6229 dsl_binding.binding = 0;
6230 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6231 dsl_binding.descriptorCount = 1;
6232 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6233 dsl_binding.pImmutableSamplers = NULL;
6234
6235 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6236 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6237 ds_layout_ci.pNext = NULL;
6238 ds_layout_ci.bindingCount = 1;
6239 ds_layout_ci.pBindings = &dsl_binding;
6240 VkDescriptorSetLayout ds_layout;
6241 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6242 ASSERT_VK_SUCCESS(err);
6243
6244 VkDescriptorSet descriptorSet;
6245 VkDescriptorSetAllocateInfo alloc_info = {};
6246 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6247 alloc_info.descriptorSetCount = 1;
6248 alloc_info.descriptorPool = ds_pool;
6249 alloc_info.pSetLayouts = &ds_layout;
6250 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6251 ASSERT_VK_SUCCESS(err);
6252
6253 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6254 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6255 pipeline_layout_ci.pNext = NULL;
6256 pipeline_layout_ci.setLayoutCount = 1;
6257 pipeline_layout_ci.pSetLayouts = &ds_layout;
6258
6259 VkPipelineLayout pipeline_layout;
6260 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6261 ASSERT_VK_SUCCESS(err);
6262
6263 // Create images to update the descriptor with
6264 VkImage image;
6265 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6266 const int32_t tex_width = 32;
6267 const int32_t tex_height = 32;
6268 VkImageCreateInfo image_create_info = {};
6269 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6270 image_create_info.pNext = NULL;
6271 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6272 image_create_info.format = tex_format;
6273 image_create_info.extent.width = tex_width;
6274 image_create_info.extent.height = tex_height;
6275 image_create_info.extent.depth = 1;
6276 image_create_info.mipLevels = 1;
6277 image_create_info.arrayLayers = 1;
6278 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6279 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6280 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6281 image_create_info.flags = 0;
6282 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6283 ASSERT_VK_SUCCESS(err);
6284 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
6285 VkMemoryRequirements memory_reqs;
6286 VkDeviceMemory image_memory;
6287 bool pass;
6288 VkMemoryAllocateInfo memory_info = {};
6289 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6290 memory_info.pNext = NULL;
6291 memory_info.allocationSize = 0;
6292 memory_info.memoryTypeIndex = 0;
6293 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
6294 // Allocate enough memory for image
6295 memory_info.allocationSize = memory_reqs.size;
6296 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
6297 ASSERT_TRUE(pass);
6298 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
6299 ASSERT_VK_SUCCESS(err);
6300 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
6301 ASSERT_VK_SUCCESS(err);
6302
6303 VkImageViewCreateInfo image_view_create_info = {};
6304 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6305 image_view_create_info.image = image;
6306 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6307 image_view_create_info.format = tex_format;
6308 image_view_create_info.subresourceRange.layerCount = 1;
6309 image_view_create_info.subresourceRange.baseMipLevel = 0;
6310 image_view_create_info.subresourceRange.levelCount = 1;
6311 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6312
6313 VkImageView view;
6314 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6315 ASSERT_VK_SUCCESS(err);
6316 // Create Samplers
6317 VkSamplerCreateInfo sampler_ci = {};
6318 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6319 sampler_ci.pNext = NULL;
6320 sampler_ci.magFilter = VK_FILTER_NEAREST;
6321 sampler_ci.minFilter = VK_FILTER_NEAREST;
6322 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6323 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6324 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6325 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6326 sampler_ci.mipLodBias = 1.0;
6327 sampler_ci.anisotropyEnable = VK_FALSE;
6328 sampler_ci.maxAnisotropy = 1;
6329 sampler_ci.compareEnable = VK_FALSE;
6330 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6331 sampler_ci.minLod = 1.0;
6332 sampler_ci.maxLod = 1.0;
6333 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6334 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6335 VkSampler sampler;
6336 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6337 ASSERT_VK_SUCCESS(err);
6338 // Update descriptor with image and sampler
6339 VkDescriptorImageInfo img_info = {};
6340 img_info.sampler = sampler;
6341 img_info.imageView = view;
6342 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6343
6344 VkWriteDescriptorSet descriptor_write;
6345 memset(&descriptor_write, 0, sizeof(descriptor_write));
6346 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6347 descriptor_write.dstSet = descriptorSet;
6348 descriptor_write.dstBinding = 0;
6349 descriptor_write.descriptorCount = 1;
6350 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6351 descriptor_write.pImageInfo = &img_info;
6352 // Break memory binding and attempt update
6353 vkFreeMemory(m_device->device(), image_memory, nullptr);
6354 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006355 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006356 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6357 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
6358 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6359 m_errorMonitor->VerifyFound();
6360 // Cleanup
6361 vkDestroyImage(m_device->device(), image, NULL);
6362 vkDestroySampler(m_device->device(), sampler, NULL);
6363 vkDestroyImageView(m_device->device(), view, NULL);
6364 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6365 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6366 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6367}
6368
Karl Schultz6addd812016-02-02 17:17:23 -07006369TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006370 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6371 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006372 // Create a valid cmd buffer
6373 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006374 uint64_t fake_pipeline_handle = 0xbaad6001;
6375 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Tony Barbour1fa09702017-03-16 12:09:08 -06006376 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006377 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6378
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006379 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07006380 m_commandBuffer->BeginCommandBuffer();
6381 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006382 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06006383 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006384
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006385 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006386 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006387 Draw(1, 0, 0, 0);
6388 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006389
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006390 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006391 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006392 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006393 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6394 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006395}
6396
Karl Schultz6addd812016-02-02 17:17:23 -07006397TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06006398 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07006399 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006400
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006401 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006402
Tony Barbour1fa09702017-03-16 12:09:08 -06006403 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006404 ASSERT_NO_FATAL_FAILURE(InitViewport());
6405 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006406 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006407 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6408 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006409
6410 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006411 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6412 ds_pool_ci.pNext = NULL;
6413 ds_pool_ci.maxSets = 1;
6414 ds_pool_ci.poolSizeCount = 1;
6415 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006416
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006417 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006418 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006419 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006420
Tony Barboureb254902015-07-15 12:50:33 -06006421 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006422 dsl_binding.binding = 0;
6423 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6424 dsl_binding.descriptorCount = 1;
6425 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6426 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006427
Tony Barboureb254902015-07-15 12:50:33 -06006428 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006429 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6430 ds_layout_ci.pNext = NULL;
6431 ds_layout_ci.bindingCount = 1;
6432 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006433 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006434 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006435 ASSERT_VK_SUCCESS(err);
6436
6437 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006438 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006439 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006440 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006441 alloc_info.descriptorPool = ds_pool;
6442 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006443 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006444 ASSERT_VK_SUCCESS(err);
6445
Tony Barboureb254902015-07-15 12:50:33 -06006446 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006447 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6448 pipeline_layout_ci.pNext = NULL;
6449 pipeline_layout_ci.setLayoutCount = 1;
6450 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006451
6452 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006453 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006454 ASSERT_VK_SUCCESS(err);
6455
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006456 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006457 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006458 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006459 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006460
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006461 VkPipelineObj pipe(m_device);
6462 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006463 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006464 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006465 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006466
Tony Barbour552f6c02016-12-21 14:34:07 -07006467 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006468 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6469 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6470 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006471
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006472 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006473
Chia-I Wuf7458c52015-10-26 21:10:41 +08006474 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6475 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6476 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006477}
6478
Karl Schultz6addd812016-02-02 17:17:23 -07006479TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006480 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006481 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006482
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006483 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006484
Tony Barbour1fa09702017-03-16 12:09:08 -06006485 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006486 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006487 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6488 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006489
6490 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006491 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6492 ds_pool_ci.pNext = NULL;
6493 ds_pool_ci.maxSets = 1;
6494 ds_pool_ci.poolSizeCount = 1;
6495 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006496
6497 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006498 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006499 ASSERT_VK_SUCCESS(err);
6500
6501 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006502 dsl_binding.binding = 0;
6503 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6504 dsl_binding.descriptorCount = 1;
6505 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6506 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006507
6508 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006509 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6510 ds_layout_ci.pNext = NULL;
6511 ds_layout_ci.bindingCount = 1;
6512 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006513 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006514 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006515 ASSERT_VK_SUCCESS(err);
6516
6517 VkDescriptorSet descriptorSet;
6518 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006519 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006520 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006521 alloc_info.descriptorPool = ds_pool;
6522 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006523 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006524 ASSERT_VK_SUCCESS(err);
6525
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006526 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006527 VkWriteDescriptorSet descriptor_write;
6528 memset(&descriptor_write, 0, sizeof(descriptor_write));
6529 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6530 descriptor_write.dstSet = descriptorSet;
6531 descriptor_write.dstBinding = 0;
6532 descriptor_write.descriptorCount = 1;
6533 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6534 descriptor_write.pTexelBufferView = &view;
6535
6536 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6537
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006538 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006539
6540 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6541 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6542}
6543
Mark Youngd339ba32016-05-30 13:28:35 -06006544TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006545 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has no memory bound to it.");
Mark Youngd339ba32016-05-30 13:28:35 -06006546
6547 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006548 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006549 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06006550
Tony Barbour1fa09702017-03-16 12:09:08 -06006551 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -06006552
6553 // Create a buffer with no bound memory and then attempt to create
6554 // a buffer view.
6555 VkBufferCreateInfo buff_ci = {};
6556 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12006557 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06006558 buff_ci.size = 256;
6559 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6560 VkBuffer buffer;
6561 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6562 ASSERT_VK_SUCCESS(err);
6563
6564 VkBufferViewCreateInfo buff_view_ci = {};
6565 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6566 buff_view_ci.buffer = buffer;
6567 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6568 buff_view_ci.range = VK_WHOLE_SIZE;
6569 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006570 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06006571
6572 m_errorMonitor->VerifyFound();
6573 vkDestroyBuffer(m_device->device(), buffer, NULL);
6574 // If last error is success, it still created the view, so delete it.
6575 if (err == VK_SUCCESS) {
6576 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6577 }
6578}
6579
Karl Schultz6addd812016-02-02 17:17:23 -07006580TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6581 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6582 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006583 // 1. No dynamicOffset supplied
6584 // 2. Too many dynamicOffsets supplied
6585 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006586 VkResult err;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006587 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6588 " requires 1 dynamicOffsets, but only "
6589 "0 dynamicOffsets are left in "
6590 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006591
Tony Barbour1fa09702017-03-16 12:09:08 -06006592 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006593 ASSERT_NO_FATAL_FAILURE(InitViewport());
6594 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6595
6596 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006597 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6598 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006599
6600 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006601 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6602 ds_pool_ci.pNext = NULL;
6603 ds_pool_ci.maxSets = 1;
6604 ds_pool_ci.poolSizeCount = 1;
6605 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006606
6607 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006608 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006609 ASSERT_VK_SUCCESS(err);
6610
6611 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006612 dsl_binding.binding = 0;
6613 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6614 dsl_binding.descriptorCount = 1;
6615 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6616 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006617
6618 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006619 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6620 ds_layout_ci.pNext = NULL;
6621 ds_layout_ci.bindingCount = 1;
6622 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006623 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006624 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006625 ASSERT_VK_SUCCESS(err);
6626
6627 VkDescriptorSet descriptorSet;
6628 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006629 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006630 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006631 alloc_info.descriptorPool = ds_pool;
6632 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006633 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006634 ASSERT_VK_SUCCESS(err);
6635
6636 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006637 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6638 pipeline_layout_ci.pNext = NULL;
6639 pipeline_layout_ci.setLayoutCount = 1;
6640 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006641
6642 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006643 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006644 ASSERT_VK_SUCCESS(err);
6645
6646 // Create a buffer to update the descriptor with
6647 uint32_t qfi = 0;
6648 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006649 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6650 buffCI.size = 1024;
6651 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6652 buffCI.queueFamilyIndexCount = 1;
6653 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006654
6655 VkBuffer dyub;
6656 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6657 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006658 // Allocate memory and bind to buffer so we can make it to the appropriate
6659 // error
6660 VkMemoryAllocateInfo mem_alloc = {};
6661 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6662 mem_alloc.pNext = NULL;
6663 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006664 mem_alloc.memoryTypeIndex = 0;
6665
6666 VkMemoryRequirements memReqs;
6667 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006668 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006669 if (!pass) {
6670 vkDestroyBuffer(m_device->device(), dyub, NULL);
6671 return;
6672 }
6673
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006674 VkDeviceMemory mem;
6675 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6676 ASSERT_VK_SUCCESS(err);
6677 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6678 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006679 // Correctly update descriptor to avoid "NOT_UPDATED" error
6680 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006681 buffInfo.buffer = dyub;
6682 buffInfo.offset = 0;
6683 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006684
6685 VkWriteDescriptorSet descriptor_write;
6686 memset(&descriptor_write, 0, sizeof(descriptor_write));
6687 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6688 descriptor_write.dstSet = descriptorSet;
6689 descriptor_write.dstBinding = 0;
6690 descriptor_write.descriptorCount = 1;
6691 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6692 descriptor_write.pBufferInfo = &buffInfo;
6693
6694 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6695
Tony Barbour552f6c02016-12-21 14:34:07 -07006696 m_commandBuffer->BeginCommandBuffer();
6697 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006698 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6699 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006700 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006701 uint32_t pDynOff[2] = {512, 756};
6702 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006703 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6704 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6705 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6706 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006707 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006708 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006709 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6710 " dynamic offset 512 combined with "
6711 "offset 0 and range 1024 that "
6712 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006713 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006714 char const *vsSource =
6715 "#version 450\n"
6716 "\n"
6717 "out gl_PerVertex { \n"
6718 " vec4 gl_Position;\n"
6719 "};\n"
6720 "void main(){\n"
6721 " gl_Position = vec4(1);\n"
6722 "}\n";
6723 char const *fsSource =
6724 "#version 450\n"
6725 "\n"
6726 "layout(location=0) out vec4 x;\n"
6727 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6728 "void main(){\n"
6729 " x = vec4(bar.y);\n"
6730 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006731 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6732 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6733 VkPipelineObj pipe(m_device);
6734 pipe.AddShader(&vs);
6735 pipe.AddShader(&fs);
6736 pipe.AddColorAttachment();
6737 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6738
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006739 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6740 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6741 VkRect2D scissor = {{0, 0}, {16, 16}};
6742 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6743
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006744 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006745 // This update should succeed, but offset size of 512 will overstep buffer
6746 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006747 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6748 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006749 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006750 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006751
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006752 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006753 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006754
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006755 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006756 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006757 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6758}
6759
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006760TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006761 TEST_DESCRIPTION(
6762 "Attempt to update a descriptor with a non-sparse buffer "
6763 "that doesn't have memory bound");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006764 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006765 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006766 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006767 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6768 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006769
Tony Barbour1fa09702017-03-16 12:09:08 -06006770 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006771 ASSERT_NO_FATAL_FAILURE(InitViewport());
6772 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6773
6774 VkDescriptorPoolSize ds_type_count = {};
6775 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6776 ds_type_count.descriptorCount = 1;
6777
6778 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6779 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6780 ds_pool_ci.pNext = NULL;
6781 ds_pool_ci.maxSets = 1;
6782 ds_pool_ci.poolSizeCount = 1;
6783 ds_pool_ci.pPoolSizes = &ds_type_count;
6784
6785 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006786 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006787 ASSERT_VK_SUCCESS(err);
6788
6789 VkDescriptorSetLayoutBinding dsl_binding = {};
6790 dsl_binding.binding = 0;
6791 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6792 dsl_binding.descriptorCount = 1;
6793 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6794 dsl_binding.pImmutableSamplers = NULL;
6795
6796 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6797 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6798 ds_layout_ci.pNext = NULL;
6799 ds_layout_ci.bindingCount = 1;
6800 ds_layout_ci.pBindings = &dsl_binding;
6801 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006802 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006803 ASSERT_VK_SUCCESS(err);
6804
6805 VkDescriptorSet descriptorSet;
6806 VkDescriptorSetAllocateInfo alloc_info = {};
6807 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6808 alloc_info.descriptorSetCount = 1;
6809 alloc_info.descriptorPool = ds_pool;
6810 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006811 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006812 ASSERT_VK_SUCCESS(err);
6813
6814 // Create a buffer to update the descriptor with
6815 uint32_t qfi = 0;
6816 VkBufferCreateInfo buffCI = {};
6817 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6818 buffCI.size = 1024;
6819 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6820 buffCI.queueFamilyIndexCount = 1;
6821 buffCI.pQueueFamilyIndices = &qfi;
6822
6823 VkBuffer dyub;
6824 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6825 ASSERT_VK_SUCCESS(err);
6826
6827 // Attempt to update descriptor without binding memory to it
6828 VkDescriptorBufferInfo buffInfo = {};
6829 buffInfo.buffer = dyub;
6830 buffInfo.offset = 0;
6831 buffInfo.range = 1024;
6832
6833 VkWriteDescriptorSet descriptor_write;
6834 memset(&descriptor_write, 0, sizeof(descriptor_write));
6835 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6836 descriptor_write.dstSet = descriptorSet;
6837 descriptor_write.dstBinding = 0;
6838 descriptor_write.descriptorCount = 1;
6839 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6840 descriptor_write.pBufferInfo = &buffInfo;
6841
6842 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6843 m_errorMonitor->VerifyFound();
6844
6845 vkDestroyBuffer(m_device->device(), dyub, NULL);
6846 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6847 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6848}
6849
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006850TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006851 VkResult err;
Tony Barbour1fa09702017-03-16 12:09:08 -06006852 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006853 ASSERT_NO_FATAL_FAILURE(InitViewport());
6854 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6855
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006856 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006857 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006858 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6859 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6860 pipeline_layout_ci.pushConstantRangeCount = 1;
6861 pipeline_layout_ci.pPushConstantRanges = &pc_range;
6862
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006863 //
6864 // Check for invalid push constant ranges in pipeline layouts.
6865 //
6866 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006867 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006868 char const *msg;
6869 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006870
Karl Schultzc81037d2016-05-12 08:11:23 -06006871 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
6872 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
6873 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
6874 "vkCreatePipelineLayout() call has push constants index 0 with "
6875 "size 0."},
6876 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
6877 "vkCreatePipelineLayout() call has push constants index 0 with "
6878 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006879 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06006880 "vkCreatePipelineLayout() call has push constants index 0 with "
6881 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006882 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06006883 "vkCreatePipelineLayout() call has push constants index 0 with "
6884 "size 0."},
6885 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6886 "vkCreatePipelineLayout() call has push constants index 0 with "
6887 "offset 1. Offset must"},
6888 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
6889 "vkCreatePipelineLayout() call has push constants index 0 "
6890 "with offset "},
6891 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
6892 "vkCreatePipelineLayout() call has push constants "
6893 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006894 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06006895 "vkCreatePipelineLayout() call has push constants index 0 "
6896 "with offset "},
6897 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
6898 "vkCreatePipelineLayout() call has push "
6899 "constants index 0 with offset "},
6900 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
6901 "vkCreatePipelineLayout() call has push "
6902 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006903 }};
6904
6905 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06006906 for (const auto &iter : range_tests) {
6907 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006908 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6909 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006910 m_errorMonitor->VerifyFound();
6911 if (VK_SUCCESS == err) {
6912 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6913 }
6914 }
6915
6916 // Check for invalid stage flag
6917 pc_range.offset = 0;
6918 pc_range.size = 16;
6919 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006920 m_errorMonitor->SetDesiredFailureMsg(
6921 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6922 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006923 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006924 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006925 if (VK_SUCCESS == err) {
6926 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6927 }
6928
Karl Schultzc59b72d2017-02-24 15:45:05 -07006929 // Check for duplicate stage flags in a list of push constant ranges.
6930 // A shader can only have one push constant block and that block is mapped
6931 // to the push constant range that has that shader's stage flag set.
6932 // The shader's stage flag can only appear once in all the ranges, so the
6933 // implementation can find the one and only range to map it to.
Karl Schultzc81037d2016-05-12 08:11:23 -06006934 const uint32_t ranges_per_test = 5;
Karl Schultzc59b72d2017-02-24 15:45:05 -07006935 struct DuplicateStageFlagsTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006936 VkPushConstantRange const ranges[ranges_per_test];
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006937 std::vector<char const *> const msg;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006938 };
Karl Schultzc59b72d2017-02-24 15:45:05 -07006939 // Overlapping ranges are OK, but a stage flag can appear only once.
6940 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
6941 {
6942 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6943 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6944 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6945 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006946 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzc59b72d2017-02-24 15:45:05 -07006947 {
6948 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
6949 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
6950 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
6951 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
6952 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
6953 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
6954 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
6955 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
6956 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
6957 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
6958 }},
6959 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6960 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
6961 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
6962 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6963 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
6964 {
6965 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
6966 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
6967 }},
6968 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
6969 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
6970 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6971 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6972 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
6973 {
6974 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
6975 }},
6976 },
6977 };
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006978
Karl Schultzc59b72d2017-02-24 15:45:05 -07006979 for (const auto &iter : duplicate_stageFlags_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006980 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06006981 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Karl Schultzc59b72d2017-02-24 15:45:05 -07006982 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg.begin(), iter.msg.end());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006983 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006984 m_errorMonitor->VerifyFound();
6985 if (VK_SUCCESS == err) {
6986 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6987 }
6988 }
6989
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006990 //
6991 // CmdPushConstants tests
6992 //
6993
Karl Schultzc59b72d2017-02-24 15:45:05 -07006994 // Setup a pipeline layout with ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06006995 const VkPushConstantRange pc_range2[] = {
Karl Schultzc59b72d2017-02-24 15:45:05 -07006996 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006997 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006998 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006999 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007000 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007001 ASSERT_VK_SUCCESS(err);
Karl Schultzc59b72d2017-02-24 15:45:05 -07007002
7003 const uint8_t dummy_values[100] = {};
7004
7005 m_commandBuffer->BeginCommandBuffer();
7006 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007007
7008 // Check for invalid stage flag
Karl Schultzc59b72d2017-02-24 15:45:05 -07007009 // Note that VU 00996 isn't reached due to parameter validation
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007011 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007012 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007013
Karl Schultzc59b72d2017-02-24 15:45:05 -07007014 m_errorMonitor->ExpectSuccess();
7015 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16, dummy_values);
7016 m_errorMonitor->VerifyNotFound();
7017 m_errorMonitor->ExpectSuccess();
7018 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT, 64, 16, dummy_values);
7019 m_errorMonitor->VerifyNotFound();
7020 const std::array<VkPushConstantRange, 6> cmd_range_tests = {{
7021 {VK_SHADER_STAGE_FRAGMENT_BIT, 64, 16},
7022 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7023 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16},
7024 {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
7025 {VK_SHADER_STAGE_VERTEX_BIT, 24, 16},
7026 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007027 }};
Karl Schultzc59b72d2017-02-24 15:45:05 -07007028 for (const auto &iter : cmd_range_tests) {
7029 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00988);
7030 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.stageFlags, iter.offset, iter.size,
7031 dummy_values);
Karl Schultzc81037d2016-05-12 08:11:23 -06007032 m_errorMonitor->VerifyFound();
7033 }
Karl Schultzc81037d2016-05-12 08:11:23 -06007034
Tony Barbour552f6c02016-12-21 14:34:07 -07007035 m_commandBuffer->EndRenderPass();
7036 m_commandBuffer->EndCommandBuffer();
Karl Schultzc59b72d2017-02-24 15:45:05 -07007037 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007038}
7039
Karl Schultz6addd812016-02-02 17:17:23 -07007040TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007041 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007042 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007043
Tony Barbour1fa09702017-03-16 12:09:08 -06007044 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007045 ASSERT_NO_FATAL_FAILURE(InitViewport());
7046 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7047
7048 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7049 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007050 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7051 ds_type_count[0].descriptorCount = 10;
7052 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7053 ds_type_count[1].descriptorCount = 2;
7054 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7055 ds_type_count[2].descriptorCount = 2;
7056 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7057 ds_type_count[3].descriptorCount = 5;
7058 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7059 // type
7060 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7061 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7062 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007063
7064 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007065 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7066 ds_pool_ci.pNext = NULL;
7067 ds_pool_ci.maxSets = 5;
7068 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7069 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007070
7071 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007072 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007073 ASSERT_VK_SUCCESS(err);
7074
7075 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7076 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007077 dsl_binding[0].binding = 0;
7078 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7079 dsl_binding[0].descriptorCount = 5;
7080 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7081 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007082
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007083 // Create layout identical to set0 layout but w/ different stageFlags
7084 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007085 dsl_fs_stage_only.binding = 0;
7086 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7087 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007088 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7089 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07007090 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007091 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007092 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7093 ds_layout_ci.pNext = NULL;
7094 ds_layout_ci.bindingCount = 1;
7095 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007096 static const uint32_t NUM_LAYOUTS = 4;
7097 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007098 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007099 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7100 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007101 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007102 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007103 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007104 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007105 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007106 dsl_binding[0].binding = 0;
7107 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007108 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007109 dsl_binding[1].binding = 1;
7110 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7111 dsl_binding[1].descriptorCount = 2;
7112 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7113 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007114 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007115 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007116 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007117 ASSERT_VK_SUCCESS(err);
7118 dsl_binding[0].binding = 0;
7119 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007120 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007121 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007122 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007123 ASSERT_VK_SUCCESS(err);
7124 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007125 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007126 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007127 ASSERT_VK_SUCCESS(err);
7128
7129 static const uint32_t NUM_SETS = 4;
7130 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7131 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007132 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007133 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007134 alloc_info.descriptorPool = ds_pool;
7135 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007136 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007137 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007138 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007139 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007140 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007141 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007142 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007143
7144 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007145 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7146 pipeline_layout_ci.pNext = NULL;
7147 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7148 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007149
7150 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007151 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007152 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007153 // Create pipelineLayout with only one setLayout
7154 pipeline_layout_ci.setLayoutCount = 1;
7155 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007156 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007157 ASSERT_VK_SUCCESS(err);
7158 // Create pipelineLayout with 2 descriptor setLayout at index 0
7159 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7160 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007161 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007162 ASSERT_VK_SUCCESS(err);
7163 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7164 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7165 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007166 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007167 ASSERT_VK_SUCCESS(err);
7168 // Create pipelineLayout with UB type, but stageFlags for FS only
7169 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7170 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007171 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007172 ASSERT_VK_SUCCESS(err);
7173 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7174 VkDescriptorSetLayout pl_bad_s0[2] = {};
7175 pl_bad_s0[0] = ds_layout_fs_only;
7176 pl_bad_s0[1] = ds_layout[1];
7177 pipeline_layout_ci.setLayoutCount = 2;
7178 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7179 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007180 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007181 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007182
Tobin Ehlis88452832015-12-03 09:40:56 -07007183 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007184 char const *vsSource =
7185 "#version 450\n"
7186 "\n"
7187 "out gl_PerVertex {\n"
7188 " vec4 gl_Position;\n"
7189 "};\n"
7190 "void main(){\n"
7191 " gl_Position = vec4(1);\n"
7192 "}\n";
7193 char const *fsSource =
7194 "#version 450\n"
7195 "\n"
7196 "layout(location=0) out vec4 x;\n"
7197 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7198 "void main(){\n"
7199 " x = vec4(bar.y);\n"
7200 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07007201 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7202 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007203 VkPipelineObj pipe(m_device);
7204 pipe.AddShader(&vs);
7205 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007206 pipe.AddColorAttachment();
7207 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007208
Tony Barbour552f6c02016-12-21 14:34:07 -07007209 m_commandBuffer->BeginCommandBuffer();
7210 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07007211
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007212 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07007213 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7214 // of PSO
7215 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7216 // cmd_pipeline.c
7217 // due to the fact that cmd_alloc_dset_data() has not been called in
7218 // cmd_bind_graphics_pipeline()
7219 // TODO : Want to cause various binding incompatibility issues here to test
7220 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007221 // First cause various verify_layout_compatibility() fails
7222 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007223 // verify_set_layout_compatibility fail cases:
7224 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007225 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007226 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7227 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007228 m_errorMonitor->VerifyFound();
7229
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007230 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007231 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
7232 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
7233 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007234 m_errorMonitor->VerifyFound();
7235
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007236 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007237 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7238 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007239 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
7240 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
7241 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007242 m_errorMonitor->VerifyFound();
7243
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007244 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7245 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007246 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
7247 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
7248 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007249 m_errorMonitor->VerifyFound();
7250
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007251 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7252 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7254 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
7255 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7256 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007257 m_errorMonitor->VerifyFound();
7258
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007259 // Cause INFO messages due to disturbing previously bound Sets
7260 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007261 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7262 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007263 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007264 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
7265 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7266 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007267 m_errorMonitor->VerifyFound();
7268
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007269 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7270 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007271 // 2. Disturb set after last bound set
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007272 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7273 " newly bound as set #0 so set #1 and "
7274 "any subsequent sets were disturbed ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007275 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7276 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007277 m_errorMonitor->VerifyFound();
7278
Tobin Ehlis10fad692016-07-07 12:00:36 -06007279 // Now that we're done actively using the pipelineLayout that gfx pipeline
7280 // was created with, we should be able to delete it. Do that now to verify
7281 // that validation obeys pipelineLayout lifetime
7282 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7283
Tobin Ehlis88452832015-12-03 09:40:56 -07007284 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007285 // 1. Error due to not binding required set (we actually use same code as
7286 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007287 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7288 &descriptorSet[0], 0, NULL);
7289 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7290 &descriptorSet[1], 0, NULL);
7291 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " uses set #0 but that set is not bound.");
Rene Lindsay9f228e42017-01-16 13:57:45 -07007292
7293 VkViewport viewport = {0, 0, 16, 16, 0, 1};
7294 VkRect2D scissor = {{0, 0}, {16, 16}};
7295 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
7296 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
7297
Tobin Ehlis88452832015-12-03 09:40:56 -07007298 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007299 m_errorMonitor->VerifyFound();
7300
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007301 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007302 // 2. Error due to bound set not being compatible with PSO's
7303 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007304 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7305 &descriptorSet[0], 0, NULL);
7306 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007307 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007308 m_errorMonitor->VerifyFound();
7309
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007310 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007311 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007312 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7313 }
7314 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007315 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7316 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7317}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007318
Karl Schultz6addd812016-02-02 17:17:23 -07007319TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007320 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7321 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007322
Tony Barbour1fa09702017-03-16 12:09:08 -06007323 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007324 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007325 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007326 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007327
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007328 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007329}
7330
Karl Schultz6addd812016-02-02 17:17:23 -07007331TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7332 VkResult err;
7333 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007334
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007335 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007336
Tony Barbour1fa09702017-03-16 12:09:08 -06007337 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007338
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007339 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007340 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007341 cmd.pNext = NULL;
Mike Schuchardt06304c22017-03-01 17:09:09 -07007342 cmd.commandPool = m_commandPool->handle();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007343 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007344 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007345
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007346 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007347 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007348
7349 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07007350 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07007351 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7352
7353 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007354 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007355 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007356 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007357 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007358
7359 // The error should be caught by validation of the BeginCommandBuffer call
7360 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7361
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007362 m_errorMonitor->VerifyFound();
Mike Schuchardt06304c22017-03-01 17:09:09 -07007363 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007364}
7365
Karl Schultz6addd812016-02-02 17:17:23 -07007366TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007367 // Cause error due to Begin while recording CB
7368 // Then cause 2 errors for attempting to reset CB w/o having
7369 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7370 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06007371 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007372
Tony Barbour1fa09702017-03-16 12:09:08 -06007373 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007374
7375 // Calls AllocateCommandBuffers
7376 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7377
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007378 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07007379 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007380 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7381 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007382 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7383 cmd_buf_info.pNext = NULL;
7384 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007385 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007386
7387 // Begin CB to transition to recording state
7388 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7389 // Can't re-begin. This should trigger error
7390 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007391 m_errorMonitor->VerifyFound();
7392
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007393 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007394 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007395 // Reset attempt will trigger error due to incorrect CommandPool state
7396 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007397 m_errorMonitor->VerifyFound();
7398
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007399 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007400 // Transition CB to RECORDED state
7401 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7402 // Now attempting to Begin will implicitly reset, which triggers error
7403 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007404 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007405}
7406
Karl Schultz6addd812016-02-02 17:17:23 -07007407TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007408 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007409 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007410
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007411 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7412 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007413
Tony Barbour1fa09702017-03-16 12:09:08 -06007414 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007415 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007416
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007417 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007418 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7419 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007420
7421 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007422 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7423 ds_pool_ci.pNext = NULL;
7424 ds_pool_ci.maxSets = 1;
7425 ds_pool_ci.poolSizeCount = 1;
7426 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007427
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007428 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007429 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007430 ASSERT_VK_SUCCESS(err);
7431
Tony Barboureb254902015-07-15 12:50:33 -06007432 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007433 dsl_binding.binding = 0;
7434 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7435 dsl_binding.descriptorCount = 1;
7436 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7437 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007438
Tony Barboureb254902015-07-15 12:50:33 -06007439 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007440 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7441 ds_layout_ci.pNext = NULL;
7442 ds_layout_ci.bindingCount = 1;
7443 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007444
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007445 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007446 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007447 ASSERT_VK_SUCCESS(err);
7448
7449 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007450 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007451 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007452 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007453 alloc_info.descriptorPool = ds_pool;
7454 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007455 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007456 ASSERT_VK_SUCCESS(err);
7457
Tony Barboureb254902015-07-15 12:50:33 -06007458 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007459 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7460 pipeline_layout_ci.setLayoutCount = 1;
7461 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007462
7463 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007464 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007465 ASSERT_VK_SUCCESS(err);
7466
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007467 VkViewport vp = {}; // Just need dummy vp to point to
7468 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007469
7470 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007471 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7472 vp_state_ci.scissorCount = 1;
7473 vp_state_ci.pScissors = &sc;
7474 vp_state_ci.viewportCount = 1;
7475 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007476
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007477 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7478 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7479 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7480 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7481 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7482 rs_state_ci.depthClampEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007483 rs_state_ci.rasterizerDiscardEnable = VK_TRUE;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007484 rs_state_ci.depthBiasEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007485 rs_state_ci.lineWidth = 1.0f;
7486
7487 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7488 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7489 vi_ci.pNext = nullptr;
7490 vi_ci.vertexBindingDescriptionCount = 0;
7491 vi_ci.pVertexBindingDescriptions = nullptr;
7492 vi_ci.vertexAttributeDescriptionCount = 0;
7493 vi_ci.pVertexAttributeDescriptions = nullptr;
7494
7495 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7496 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7497 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7498
7499 VkPipelineShaderStageCreateInfo shaderStages[2];
7500 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7501
7502 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7503 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Dave Houlton59a20702017-02-02 17:26:23 -07007504 shaderStages[0] = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007505 shaderStages[1] = fs.GetStageCreateInfo();
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007506
Tony Barboureb254902015-07-15 12:50:33 -06007507 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007508 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7509 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007510 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007511 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7512 gp_ci.layout = pipeline_layout;
7513 gp_ci.renderPass = renderPass();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007514 gp_ci.pVertexInputState = &vi_ci;
7515 gp_ci.pInputAssemblyState = &ia_ci;
7516
7517 gp_ci.stageCount = 1;
7518 gp_ci.pStages = shaderStages;
Tony Barboureb254902015-07-15 12:50:33 -06007519
7520 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007521 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7522 pc_ci.initialDataSize = 0;
7523 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007524
7525 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007526 VkPipelineCache pipelineCache;
7527
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007528 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007529 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007530 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007531 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007532
Chia-I Wuf7458c52015-10-26 21:10:41 +08007533 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7534 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7535 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7536 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007537}
Rene Lindsayae4977b2017-01-23 14:55:54 -07007538
Tobin Ehlis912df022015-09-17 08:46:18 -06007539/*// TODO : This test should be good, but needs Tess support in compiler to run
7540TEST_F(VkLayerTest, InvalidPatchControlPoints)
7541{
7542 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007543 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007544
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007545 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007546 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7547primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007548
Tony Barbour1fa09702017-03-16 12:09:08 -06007549 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis912df022015-09-17 08:46:18 -06007550 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007551
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007552 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007553 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007554 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007555
7556 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7557 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7558 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007559 ds_pool_ci.poolSizeCount = 1;
7560 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007561
7562 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007563 err = vkCreateDescriptorPool(m_device->device(),
7564VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007565 ASSERT_VK_SUCCESS(err);
7566
7567 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007568 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007569 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007570 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007571 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7572 dsl_binding.pImmutableSamplers = NULL;
7573
7574 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007575 ds_layout_ci.sType =
7576VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007577 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007578 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007579 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007580
7581 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007582 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7583&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007584 ASSERT_VK_SUCCESS(err);
7585
7586 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007587 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7588VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007589 ASSERT_VK_SUCCESS(err);
7590
7591 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007592 pipeline_layout_ci.sType =
7593VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007594 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007595 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007596 pipeline_layout_ci.pSetLayouts = &ds_layout;
7597
7598 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007599 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7600&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007601 ASSERT_VK_SUCCESS(err);
7602
7603 VkPipelineShaderStageCreateInfo shaderStages[3];
7604 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7605
Karl Schultz6addd812016-02-02 17:17:23 -07007606 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7607this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007608 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007609 VkShaderObj
7610tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7611this);
7612 VkShaderObj
7613te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7614this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007615
Karl Schultz6addd812016-02-02 17:17:23 -07007616 shaderStages[0].sType =
7617VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007618 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007619 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007620 shaderStages[1].sType =
7621VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007622 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007623 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007624 shaderStages[2].sType =
7625VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007626 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007627 shaderStages[2].shader = te.handle();
7628
7629 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007630 iaCI.sType =
7631VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007632 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007633
7634 VkPipelineTessellationStateCreateInfo tsCI = {};
7635 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7636 tsCI.patchControlPoints = 0; // This will cause an error
7637
7638 VkGraphicsPipelineCreateInfo gp_ci = {};
7639 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7640 gp_ci.pNext = NULL;
7641 gp_ci.stageCount = 3;
7642 gp_ci.pStages = shaderStages;
7643 gp_ci.pVertexInputState = NULL;
7644 gp_ci.pInputAssemblyState = &iaCI;
7645 gp_ci.pTessellationState = &tsCI;
7646 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007647 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007648 gp_ci.pMultisampleState = NULL;
7649 gp_ci.pDepthStencilState = NULL;
7650 gp_ci.pColorBlendState = NULL;
7651 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7652 gp_ci.layout = pipeline_layout;
7653 gp_ci.renderPass = renderPass();
7654
7655 VkPipelineCacheCreateInfo pc_ci = {};
7656 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7657 pc_ci.pNext = NULL;
7658 pc_ci.initialSize = 0;
7659 pc_ci.initialData = 0;
7660 pc_ci.maxSize = 0;
7661
7662 VkPipeline pipeline;
7663 VkPipelineCache pipelineCache;
7664
Karl Schultz6addd812016-02-02 17:17:23 -07007665 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7666&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007667 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007668 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7669&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007670
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007671 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007672
Chia-I Wuf7458c52015-10-26 21:10:41 +08007673 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7674 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7675 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7676 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007677}
7678*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007679
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007680TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007681 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007682
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007683 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007684
Tony Barbour1fa09702017-03-16 12:09:08 -06007685 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007686 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007687
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007688 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007689 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7690 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007691
7692 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007693 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7694 ds_pool_ci.maxSets = 1;
7695 ds_pool_ci.poolSizeCount = 1;
7696 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007697
7698 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007699 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007700 ASSERT_VK_SUCCESS(err);
7701
7702 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007703 dsl_binding.binding = 0;
7704 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7705 dsl_binding.descriptorCount = 1;
7706 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007707
7708 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007709 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7710 ds_layout_ci.bindingCount = 1;
7711 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007712
7713 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007714 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007715 ASSERT_VK_SUCCESS(err);
7716
7717 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007718 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007719 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007720 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007721 alloc_info.descriptorPool = ds_pool;
7722 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007723 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007724 ASSERT_VK_SUCCESS(err);
7725
7726 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007727 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7728 pipeline_layout_ci.setLayoutCount = 1;
7729 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007730
7731 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007732 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007733 ASSERT_VK_SUCCESS(err);
7734
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007735 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007736 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007737 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007738 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007739 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007740 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007741
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007742 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7743 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7744 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7745 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7746 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7747 rs_state_ci.depthClampEnable = VK_FALSE;
7748 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7749 rs_state_ci.depthBiasEnable = VK_FALSE;
7750
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007751 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7752 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7753 vi_ci.pNext = nullptr;
7754 vi_ci.vertexBindingDescriptionCount = 0;
7755 vi_ci.pVertexBindingDescriptions = nullptr;
7756 vi_ci.vertexAttributeDescriptionCount = 0;
7757 vi_ci.pVertexAttributeDescriptions = nullptr;
7758
7759 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7760 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7761 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7762
7763 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7764 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7765 pipe_ms_state_ci.pNext = NULL;
7766 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7767 pipe_ms_state_ci.sampleShadingEnable = 0;
7768 pipe_ms_state_ci.minSampleShading = 1.0;
7769 pipe_ms_state_ci.pSampleMask = NULL;
7770
Cody Northropeb3a6c12015-10-05 14:44:45 -06007771 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007772 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007773
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007774 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007775 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08007776 shaderStages[0] = vs.GetStageCreateInfo();
7777 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007778
7779 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007780 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7781 gp_ci.stageCount = 2;
7782 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007783 gp_ci.pVertexInputState = &vi_ci;
7784 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007785 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007786 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007787 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007788 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7789 gp_ci.layout = pipeline_layout;
7790 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007791
7792 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007793 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007794
7795 VkPipeline pipeline;
7796 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007797 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007798 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007799
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007800 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007801 printf(" MultiViewport feature is disabled -- skipping enabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007802
7803 // Check case where multiViewport is disabled and viewport count is not 1
7804 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
7806 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
7807 vp_state_ci.scissorCount = 0;
7808 vp_state_ci.viewportCount = 0;
7809 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7810 m_errorMonitor->VerifyFound();
7811 } else {
7812 if (m_device->props.limits.maxViewports == 1) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007813 printf(" Device limit maxViewports is 1, skipping tests that require higher limits.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007814 } else {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007815 printf(" MultiViewport feature is enabled -- skipping disabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007816
7817 // Check is that viewportcount and scissorcount match
7818 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
7819 vp_state_ci.scissorCount = 1;
7820 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
7821 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7822 m_errorMonitor->VerifyFound();
7823
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007824 // Check case where multiViewport is enabled and viewport count is greater than max
7825 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7826 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
7827 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
7828 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
7829 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
7830 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7831 m_errorMonitor->VerifyFound();
7832 }
7833 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06007834
Chia-I Wuf7458c52015-10-26 21:10:41 +08007835 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7836 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7837 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7838 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007839}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007840
7841// Don't set viewport state in PSO. This is an error b/c we always need this state for the counts even if the data is going to be
7842// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07007843TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07007844 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007845
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007846 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
7847
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007848 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007849
Tony Barbour1fa09702017-03-16 12:09:08 -06007850 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007851 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007852
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007853 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007854 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7855 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007856
7857 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007858 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7859 ds_pool_ci.maxSets = 1;
7860 ds_pool_ci.poolSizeCount = 1;
7861 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007862
7863 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007864 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007865 ASSERT_VK_SUCCESS(err);
7866
7867 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007868 dsl_binding.binding = 0;
7869 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7870 dsl_binding.descriptorCount = 1;
7871 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007872
7873 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007874 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7875 ds_layout_ci.bindingCount = 1;
7876 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007877
7878 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007879 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007880 ASSERT_VK_SUCCESS(err);
7881
7882 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007883 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007884 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007885 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007886 alloc_info.descriptorPool = ds_pool;
7887 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007888 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007889 ASSERT_VK_SUCCESS(err);
7890
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007891 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7892 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7893 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7894
7895 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7896 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7897 vi_ci.pNext = nullptr;
7898 vi_ci.vertexBindingDescriptionCount = 0;
7899 vi_ci.pVertexBindingDescriptions = nullptr;
7900 vi_ci.vertexAttributeDescriptionCount = 0;
7901 vi_ci.pVertexAttributeDescriptions = nullptr;
7902
7903 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7904 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7905 pipe_ms_state_ci.pNext = NULL;
7906 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
7907 pipe_ms_state_ci.sampleShadingEnable = 0;
7908 pipe_ms_state_ci.minSampleShading = 1.0;
7909 pipe_ms_state_ci.pSampleMask = NULL;
7910
Tobin Ehlise68360f2015-10-01 11:15:13 -06007911 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007912 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7913 pipeline_layout_ci.setLayoutCount = 1;
7914 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007915
7916 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007917 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007918 ASSERT_VK_SUCCESS(err);
7919
7920 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7921 // Set scissor as dynamic to avoid second error
7922 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007923 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7924 dyn_state_ci.dynamicStateCount = 1;
7925 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007926
Cody Northropeb3a6c12015-10-05 14:44:45 -06007927 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007928 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007929
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007930 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007931 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7932 // We shouldn't need a fragment shader but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08007933 shaderStages[0] = vs.GetStageCreateInfo();
7934 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007935
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007936 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7937 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7938 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7939 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7940 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7941 rs_state_ci.depthClampEnable = VK_FALSE;
7942 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7943 rs_state_ci.depthBiasEnable = VK_FALSE;
7944
Tobin Ehlise68360f2015-10-01 11:15:13 -06007945 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007946 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7947 gp_ci.stageCount = 2;
7948 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007949 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007950 // Not setting VP state w/o dynamic vp state should cause validation error
7951 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007952 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007953 gp_ci.pVertexInputState = &vi_ci;
7954 gp_ci.pInputAssemblyState = &ia_ci;
7955 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007956 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7957 gp_ci.layout = pipeline_layout;
7958 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007959
7960 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007961 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007962
7963 VkPipeline pipeline;
7964 VkPipelineCache pipelineCache;
7965
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007966 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007967 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007968 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007969
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007970 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007971
Chia-I Wuf7458c52015-10-26 21:10:41 +08007972 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7973 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7974 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7975 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007976}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007977
7978// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
7979// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07007980TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
7981 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007982
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007984
Tony Barbour1fa09702017-03-16 12:09:08 -06007985 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007986
7987 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007988 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007989 return;
7990 }
7991
Tobin Ehlise68360f2015-10-01 11:15:13 -06007992 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007993
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007994 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007995 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7996 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007997
7998 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007999 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8000 ds_pool_ci.maxSets = 1;
8001 ds_pool_ci.poolSizeCount = 1;
8002 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008003
8004 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008005 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008006 ASSERT_VK_SUCCESS(err);
8007
8008 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008009 dsl_binding.binding = 0;
8010 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8011 dsl_binding.descriptorCount = 1;
8012 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008013
8014 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008015 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8016 ds_layout_ci.bindingCount = 1;
8017 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008018
8019 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008020 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008021 ASSERT_VK_SUCCESS(err);
8022
8023 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008024 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008025 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008026 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008027 alloc_info.descriptorPool = ds_pool;
8028 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008029 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008030 ASSERT_VK_SUCCESS(err);
8031
8032 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008033 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8034 pipeline_layout_ci.setLayoutCount = 1;
8035 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008036
8037 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008038 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008039 ASSERT_VK_SUCCESS(err);
8040
8041 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008042 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8043 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008044 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008045 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008046 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008047
8048 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8049 // Set scissor as dynamic to avoid that error
8050 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008051 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8052 dyn_state_ci.dynamicStateCount = 1;
8053 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008054
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008055 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8056 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8057 pipe_ms_state_ci.pNext = NULL;
8058 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8059 pipe_ms_state_ci.sampleShadingEnable = 0;
8060 pipe_ms_state_ci.minSampleShading = 1.0;
8061 pipe_ms_state_ci.pSampleMask = NULL;
8062
Cody Northropeb3a6c12015-10-05 14:44:45 -06008063 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008064 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008065
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008066 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008067 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8068 // We shouldn't need a fragment shader but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008069 shaderStages[0] = vs.GetStageCreateInfo();
8070 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008071
Cody Northropf6622dc2015-10-06 10:33:21 -06008072 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8073 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8074 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008075 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008076 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008077 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008078 vi_ci.pVertexAttributeDescriptions = nullptr;
8079
8080 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8081 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8082 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8083
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008084 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008085 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008086 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06008087 rs_ci.pNext = nullptr;
8088
Mark Youngc89c6312016-03-31 16:03:20 -06008089 VkPipelineColorBlendAttachmentState att = {};
8090 att.blendEnable = VK_FALSE;
8091 att.colorWriteMask = 0xf;
8092
Cody Northropf6622dc2015-10-06 10:33:21 -06008093 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8094 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8095 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008096 cb_ci.attachmentCount = 1;
8097 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008098
Tobin Ehlise68360f2015-10-01 11:15:13 -06008099 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008100 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8101 gp_ci.stageCount = 2;
8102 gp_ci.pStages = shaderStages;
8103 gp_ci.pVertexInputState = &vi_ci;
8104 gp_ci.pInputAssemblyState = &ia_ci;
8105 gp_ci.pViewportState = &vp_state_ci;
8106 gp_ci.pRasterizationState = &rs_ci;
8107 gp_ci.pColorBlendState = &cb_ci;
8108 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008109 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008110 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8111 gp_ci.layout = pipeline_layout;
8112 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008113
8114 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008115 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008116
8117 VkPipeline pipeline;
8118 VkPipelineCache pipelineCache;
8119
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008120 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008121 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008122 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008123
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008124 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008125
Tobin Ehlisd332f282015-10-02 11:00:56 -06008126 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008127 // First need to successfully create the PSO from above by setting
8128 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06008129 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic scissor(s) 0 are used by pipeline state object, ");
Karl Schultz6addd812016-02-02 17:17:23 -07008130
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008131 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008132 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008133 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008134 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008135 m_commandBuffer->BeginCommandBuffer();
8136 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008137 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008138 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07008139 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008140 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07008141 Draw(1, 0, 0, 0);
8142
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008143 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008144
8145 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8146 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8147 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8148 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008149 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008150}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008151
8152// Create PSO w/o non-zero scissorCount but no scissor data, then run second test where dynamic viewportCount doesn't match PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008153// viewportCount
8154TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8155 VkResult err;
8156
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008157 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07008158
Tony Barbour1fa09702017-03-16 12:09:08 -06008159 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008160
8161 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008162 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008163 return;
8164 }
8165
Karl Schultz6addd812016-02-02 17:17:23 -07008166 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8167
8168 VkDescriptorPoolSize ds_type_count = {};
8169 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8170 ds_type_count.descriptorCount = 1;
8171
8172 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8173 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8174 ds_pool_ci.maxSets = 1;
8175 ds_pool_ci.poolSizeCount = 1;
8176 ds_pool_ci.pPoolSizes = &ds_type_count;
8177
8178 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008179 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07008180 ASSERT_VK_SUCCESS(err);
8181
8182 VkDescriptorSetLayoutBinding dsl_binding = {};
8183 dsl_binding.binding = 0;
8184 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8185 dsl_binding.descriptorCount = 1;
8186 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8187
8188 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8189 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8190 ds_layout_ci.bindingCount = 1;
8191 ds_layout_ci.pBindings = &dsl_binding;
8192
8193 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008194 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008195 ASSERT_VK_SUCCESS(err);
8196
8197 VkDescriptorSet descriptorSet;
8198 VkDescriptorSetAllocateInfo alloc_info = {};
8199 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8200 alloc_info.descriptorSetCount = 1;
8201 alloc_info.descriptorPool = ds_pool;
8202 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008203 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07008204 ASSERT_VK_SUCCESS(err);
8205
8206 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8207 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8208 pipeline_layout_ci.setLayoutCount = 1;
8209 pipeline_layout_ci.pSetLayouts = &ds_layout;
8210
8211 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008212 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008213 ASSERT_VK_SUCCESS(err);
8214
8215 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8216 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8217 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008218 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008219 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008220 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008221
8222 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8223 // Set scissor as dynamic to avoid that error
8224 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8225 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8226 dyn_state_ci.dynamicStateCount = 1;
8227 dyn_state_ci.pDynamicStates = &vp_state;
8228
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008229 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8230 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8231 pipe_ms_state_ci.pNext = NULL;
8232 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8233 pipe_ms_state_ci.sampleShadingEnable = 0;
8234 pipe_ms_state_ci.minSampleShading = 1.0;
8235 pipe_ms_state_ci.pSampleMask = NULL;
8236
Karl Schultz6addd812016-02-02 17:17:23 -07008237 VkPipelineShaderStageCreateInfo shaderStages[2];
8238 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8239
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008240 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008241 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8242 // We shouldn't need a fragment shader but add it to be able to run on more devices
Karl Schultz6addd812016-02-02 17:17:23 -07008243 shaderStages[0] = vs.GetStageCreateInfo();
8244 shaderStages[1] = fs.GetStageCreateInfo();
8245
8246 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8247 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8248 vi_ci.pNext = nullptr;
8249 vi_ci.vertexBindingDescriptionCount = 0;
8250 vi_ci.pVertexBindingDescriptions = nullptr;
8251 vi_ci.vertexAttributeDescriptionCount = 0;
8252 vi_ci.pVertexAttributeDescriptions = nullptr;
8253
8254 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8255 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8256 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8257
8258 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8259 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008260 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07008261 rs_ci.pNext = nullptr;
8262
Mark Youngc89c6312016-03-31 16:03:20 -06008263 VkPipelineColorBlendAttachmentState att = {};
8264 att.blendEnable = VK_FALSE;
8265 att.colorWriteMask = 0xf;
8266
Karl Schultz6addd812016-02-02 17:17:23 -07008267 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8268 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8269 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008270 cb_ci.attachmentCount = 1;
8271 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008272
8273 VkGraphicsPipelineCreateInfo gp_ci = {};
8274 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8275 gp_ci.stageCount = 2;
8276 gp_ci.pStages = shaderStages;
8277 gp_ci.pVertexInputState = &vi_ci;
8278 gp_ci.pInputAssemblyState = &ia_ci;
8279 gp_ci.pViewportState = &vp_state_ci;
8280 gp_ci.pRasterizationState = &rs_ci;
8281 gp_ci.pColorBlendState = &cb_ci;
8282 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008283 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008284 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8285 gp_ci.layout = pipeline_layout;
8286 gp_ci.renderPass = renderPass();
8287
8288 VkPipelineCacheCreateInfo pc_ci = {};
8289 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8290
8291 VkPipeline pipeline;
8292 VkPipelineCache pipelineCache;
8293
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008294 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07008295 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008296 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008297
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008298 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008299
8300 // Now hit second fail case where we set scissor w/ different count than PSO
8301 // First need to successfully create the PSO from above by setting
8302 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008303 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8304 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008305
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008306 VkRect2D sc = {}; // Just need dummy vp to point to
Tobin Ehlisd332f282015-10-02 11:00:56 -06008307 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008308 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008309 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008310 m_commandBuffer->BeginCommandBuffer();
8311 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008312 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008313 VkViewport viewports[1] = {};
8314 viewports[0].width = 8;
8315 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06008316 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008317 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008318 Draw(1, 0, 0, 0);
8319
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008320 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008321
Chia-I Wuf7458c52015-10-26 21:10:41 +08008322 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8323 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8324 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8325 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008326 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008327}
8328
Mark Young7394fdd2016-03-31 14:56:43 -06008329TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8330 VkResult err;
8331
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008332 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008333
Tony Barbour1fa09702017-03-16 12:09:08 -06008334 ASSERT_NO_FATAL_FAILURE(Init());
Mark Young7394fdd2016-03-31 14:56:43 -06008335 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8336
8337 VkDescriptorPoolSize ds_type_count = {};
8338 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8339 ds_type_count.descriptorCount = 1;
8340
8341 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8342 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8343 ds_pool_ci.maxSets = 1;
8344 ds_pool_ci.poolSizeCount = 1;
8345 ds_pool_ci.pPoolSizes = &ds_type_count;
8346
8347 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008348 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06008349 ASSERT_VK_SUCCESS(err);
8350
8351 VkDescriptorSetLayoutBinding dsl_binding = {};
8352 dsl_binding.binding = 0;
8353 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8354 dsl_binding.descriptorCount = 1;
8355 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8356
8357 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8358 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8359 ds_layout_ci.bindingCount = 1;
8360 ds_layout_ci.pBindings = &dsl_binding;
8361
8362 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008363 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008364 ASSERT_VK_SUCCESS(err);
8365
8366 VkDescriptorSet descriptorSet;
8367 VkDescriptorSetAllocateInfo alloc_info = {};
8368 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8369 alloc_info.descriptorSetCount = 1;
8370 alloc_info.descriptorPool = ds_pool;
8371 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008372 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06008373 ASSERT_VK_SUCCESS(err);
8374
8375 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8376 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8377 pipeline_layout_ci.setLayoutCount = 1;
8378 pipeline_layout_ci.pSetLayouts = &ds_layout;
8379
8380 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008381 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008382 ASSERT_VK_SUCCESS(err);
8383
8384 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8385 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8386 vp_state_ci.scissorCount = 1;
8387 vp_state_ci.pScissors = NULL;
8388 vp_state_ci.viewportCount = 1;
8389 vp_state_ci.pViewports = NULL;
8390
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008391 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06008392 // Set scissor as dynamic to avoid that error
8393 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8394 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8395 dyn_state_ci.dynamicStateCount = 2;
8396 dyn_state_ci.pDynamicStates = dynamic_states;
8397
8398 VkPipelineShaderStageCreateInfo shaderStages[2];
8399 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8400
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008401 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8402 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008403 this); // TODO - We shouldn't need a fragment shader
8404 // but add it to be able to run on more devices
Mark Young7394fdd2016-03-31 14:56:43 -06008405 shaderStages[0] = vs.GetStageCreateInfo();
8406 shaderStages[1] = fs.GetStageCreateInfo();
8407
8408 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8409 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8410 vi_ci.pNext = nullptr;
8411 vi_ci.vertexBindingDescriptionCount = 0;
8412 vi_ci.pVertexBindingDescriptions = nullptr;
8413 vi_ci.vertexAttributeDescriptionCount = 0;
8414 vi_ci.pVertexAttributeDescriptions = nullptr;
8415
8416 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8417 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8418 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8419
8420 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8421 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8422 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07008423 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06008424
Mark Young47107952016-05-02 15:59:55 -06008425 // Check too low (line width of -1.0f).
8426 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008427
8428 VkPipelineColorBlendAttachmentState att = {};
8429 att.blendEnable = VK_FALSE;
8430 att.colorWriteMask = 0xf;
8431
8432 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8433 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8434 cb_ci.pNext = nullptr;
8435 cb_ci.attachmentCount = 1;
8436 cb_ci.pAttachments = &att;
8437
8438 VkGraphicsPipelineCreateInfo gp_ci = {};
8439 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8440 gp_ci.stageCount = 2;
8441 gp_ci.pStages = shaderStages;
8442 gp_ci.pVertexInputState = &vi_ci;
8443 gp_ci.pInputAssemblyState = &ia_ci;
8444 gp_ci.pViewportState = &vp_state_ci;
8445 gp_ci.pRasterizationState = &rs_ci;
8446 gp_ci.pColorBlendState = &cb_ci;
8447 gp_ci.pDynamicState = &dyn_state_ci;
8448 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8449 gp_ci.layout = pipeline_layout;
8450 gp_ci.renderPass = renderPass();
8451
8452 VkPipelineCacheCreateInfo pc_ci = {};
8453 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8454
8455 VkPipeline pipeline;
8456 VkPipelineCache pipelineCache;
8457
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008458 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008459 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008460 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008461
8462 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008463 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008464
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008465 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008466
8467 // Check too high (line width of 65536.0f).
8468 rs_ci.lineWidth = 65536.0f;
8469
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008470 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008471 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008472 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008473
8474 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008475 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008476
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008477 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008478
8479 dyn_state_ci.dynamicStateCount = 3;
8480
8481 rs_ci.lineWidth = 1.0f;
8482
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008483 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008484 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008485 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07008486 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008487 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008488
8489 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008490 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008491 m_errorMonitor->VerifyFound();
8492
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008493 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008494
8495 // Check too high with dynamic setting.
8496 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8497 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07008498 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06008499
8500 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8501 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8502 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8503 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008504 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008505}
8506
Karl Schultz6addd812016-02-02 17:17:23 -07008507TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008508 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008509 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07008510 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008511
Tony Barbour1fa09702017-03-16 12:09:08 -06008512 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008513 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008514
Tony Barbour552f6c02016-12-21 14:34:07 -07008515 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008516 // Don't care about RenderPass handle b/c error should be flagged before
8517 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008518 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008519
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008520 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008521}
8522
Karl Schultz6addd812016-02-02 17:17:23 -07008523TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008524 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008525 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8526 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008527
Tony Barbour1fa09702017-03-16 12:09:08 -06008528 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008529 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008530
Tony Barbour552f6c02016-12-21 14:34:07 -07008531 m_commandBuffer->BeginCommandBuffer();
8532 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07008533 // Just create a dummy Renderpass that's non-NULL so we can get to the
8534 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008535 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008536
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008537 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008538}
8539
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008540TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008541 TEST_DESCRIPTION(
8542 "Begin a renderPass where clearValueCount is less than"
8543 "the number of renderPass attachments that use loadOp"
8544 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008545
Tony Barbour1fa09702017-03-16 12:09:08 -06008546 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008547 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8548
8549 // Create a renderPass with a single attachment that uses loadOp CLEAR
8550 VkAttachmentReference attach = {};
8551 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8552 VkSubpassDescription subpass = {};
8553 subpass.inputAttachmentCount = 1;
8554 subpass.pInputAttachments = &attach;
8555 VkRenderPassCreateInfo rpci = {};
8556 rpci.subpassCount = 1;
8557 rpci.pSubpasses = &subpass;
8558 rpci.attachmentCount = 1;
8559 VkAttachmentDescription attach_desc = {};
Rene Lindsay4bf0e4c2017-01-31 14:20:34 -07008560 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008561 // Set loadOp to CLEAR
8562 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8563 rpci.pAttachments = &attach_desc;
8564 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8565 VkRenderPass rp;
8566 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8567
8568 VkCommandBufferInheritanceInfo hinfo = {};
8569 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
8570 hinfo.renderPass = VK_NULL_HANDLE;
8571 hinfo.subpass = 0;
8572 hinfo.framebuffer = VK_NULL_HANDLE;
8573 hinfo.occlusionQueryEnable = VK_FALSE;
8574 hinfo.queryFlags = 0;
8575 hinfo.pipelineStatistics = 0;
8576 VkCommandBufferBeginInfo info = {};
8577 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8578 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8579 info.pInheritanceInfo = &hinfo;
8580
8581 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8582 VkRenderPassBeginInfo rp_begin = {};
8583 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8584 rp_begin.pNext = NULL;
8585 rp_begin.renderPass = renderPass();
8586 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008587 rp_begin.clearValueCount = 0; // Should be 1
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008588
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07008589 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008590
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008591 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008592
8593 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06008594
8595 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008596}
8597
Slawomir Cygan0808f392016-11-28 17:53:23 +01008598TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008599 TEST_DESCRIPTION(
8600 "Begin a renderPass where clearValueCount is greater than"
8601 "the number of renderPass attachments that use loadOp"
8602 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008603
Tony Barbour1fa09702017-03-16 12:09:08 -06008604 ASSERT_NO_FATAL_FAILURE(Init());
Slawomir Cygan0808f392016-11-28 17:53:23 +01008605 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8606
8607 // Create a renderPass with a single attachment that uses loadOp CLEAR
8608 VkAttachmentReference attach = {};
8609 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8610 VkSubpassDescription subpass = {};
8611 subpass.inputAttachmentCount = 1;
8612 subpass.pInputAttachments = &attach;
8613 VkRenderPassCreateInfo rpci = {};
8614 rpci.subpassCount = 1;
8615 rpci.pSubpasses = &subpass;
8616 rpci.attachmentCount = 1;
8617 VkAttachmentDescription attach_desc = {};
8618 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
8619 // Set loadOp to CLEAR
8620 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8621 rpci.pAttachments = &attach_desc;
8622 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8623 VkRenderPass rp;
8624 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8625
8626 VkCommandBufferBeginInfo info = {};
8627 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8628 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8629
8630 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8631 VkRenderPassBeginInfo rp_begin = {};
8632 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8633 rp_begin.pNext = NULL;
8634 rp_begin.renderPass = renderPass();
8635 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008636 rp_begin.clearValueCount = 2; // Should be 1
Slawomir Cygan0808f392016-11-28 17:53:23 +01008637
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008638 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
8639 " has a clearValueCount of"
8640 " 2 but only first 1 entries in pClearValues array are used");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008641
8642 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
8643
8644 m_errorMonitor->VerifyFound();
8645
8646 vkDestroyRenderPass(m_device->device(), rp, NULL);
8647}
8648
Cody Northrop3bb4d962016-05-09 16:15:57 -06008649TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
Cody Northrop3bb4d962016-05-09 16:15:57 -06008650 TEST_DESCRIPTION("End a command buffer with an active render pass");
8651
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8653 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06008654
Tony Barbour1fa09702017-03-16 12:09:08 -06008655 ASSERT_NO_FATAL_FAILURE(Init());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008656 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8657
Tony Barbour552f6c02016-12-21 14:34:07 -07008658 m_commandBuffer->BeginCommandBuffer();
8659 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8660 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008661
8662 m_errorMonitor->VerifyFound();
8663
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008664 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
8665 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06008666}
8667
Karl Schultz6addd812016-02-02 17:17:23 -07008668TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008669 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008670 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8671 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008672
Tony Barbour1fa09702017-03-16 12:09:08 -06008673 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008674 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008675
Tony Barbour552f6c02016-12-21 14:34:07 -07008676 m_commandBuffer->BeginCommandBuffer();
8677 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008678
8679 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008680 vk_testing::Buffer dstBuffer;
8681 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008682
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008683 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008684
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008685 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008686}
8687
Karl Schultz6addd812016-02-02 17:17:23 -07008688TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008689 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008690 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8691 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008692
Tony Barbour1fa09702017-03-16 12:09:08 -06008693 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008694 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008695
Tony Barbour552f6c02016-12-21 14:34:07 -07008696 m_commandBuffer->BeginCommandBuffer();
8697 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008698
8699 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008700 vk_testing::Buffer dstBuffer;
8701 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008702
Karl Schultz6addd812016-02-02 17:17:23 -07008703 VkDeviceSize dstOffset = 0;
Rene Lindsay32d26902017-02-02 16:49:24 -07008704 uint32_t Data[] = {1, 2, 3, 4, 5, 6, 7, 8};
8705 VkDeviceSize dataSize = sizeof(Data) / sizeof(uint32_t);
8706 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, &Data);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008707
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008708 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008709}
8710
Karl Schultz6addd812016-02-02 17:17:23 -07008711TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008712 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008713 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8714 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008715
Tony Barbour1fa09702017-03-16 12:09:08 -06008716 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008717 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008718
Tony Barbour552f6c02016-12-21 14:34:07 -07008719 m_commandBuffer->BeginCommandBuffer();
8720 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008721
Michael Lentine0a369f62016-02-03 16:51:46 -06008722 VkClearColorValue clear_color;
8723 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07008724 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8725 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8726 const int32_t tex_width = 32;
8727 const int32_t tex_height = 32;
8728 VkImageCreateInfo image_create_info = {};
8729 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8730 image_create_info.pNext = NULL;
8731 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8732 image_create_info.format = tex_format;
8733 image_create_info.extent.width = tex_width;
8734 image_create_info.extent.height = tex_height;
8735 image_create_info.extent.depth = 1;
8736 image_create_info.mipLevels = 1;
8737 image_create_info.arrayLayers = 1;
8738 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8739 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
Jeremy Hayesa3d5c7b2017-03-07 16:01:52 -07008740 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008741
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008742 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008743 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008744
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008745 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008746
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008747 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008748
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008749 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008750}
8751
Karl Schultz6addd812016-02-02 17:17:23 -07008752TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008753 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008754 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8755 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008756
Tony Barbour1fa09702017-03-16 12:09:08 -06008757 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008758 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008759
Tony Barbourf887b162017-03-09 10:06:46 -07008760 auto depth_format = find_depth_stencil_format(m_device);
8761 if (!depth_format) {
8762 printf(" No Depth + Stencil format found. Skipped.\n");
8763 return;
8764 }
8765
Tony Barbour552f6c02016-12-21 14:34:07 -07008766 m_commandBuffer->BeginCommandBuffer();
8767 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008768
8769 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07008770 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008771 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
8772 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -07008773 image_create_info.format = depth_format;
Karl Schultz6addd812016-02-02 17:17:23 -07008774 image_create_info.extent.width = 64;
8775 image_create_info.extent.height = 64;
8776 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8777 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008778
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008779 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008780 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008781
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008782 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008783
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008784 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
8785 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008786
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008787 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008788}
8789
Karl Schultz6addd812016-02-02 17:17:23 -07008790TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008791 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008792 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008793
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008794 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8795 "vkCmdClearAttachments(): This call "
8796 "must be issued inside an active "
8797 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008798
Tony Barbour1fa09702017-03-16 12:09:08 -06008799 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008800 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008801
8802 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008803 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008804 ASSERT_VK_SUCCESS(err);
8805
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008806 VkClearAttachment color_attachment;
8807 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8808 color_attachment.clearValue.color.float32[0] = 0;
8809 color_attachment.clearValue.color.float32[1] = 0;
8810 color_attachment.clearValue.color.float32[2] = 0;
8811 color_attachment.clearValue.color.float32[3] = 0;
8812 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008813 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008814 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008815
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008816 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008817}
8818
Chris Forbes3b97e932016-09-07 11:29:24 +12008819TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008820 TEST_DESCRIPTION(
8821 "Test that an error is produced when CmdNextSubpass is "
8822 "called too many times in a renderpass instance");
Chris Forbes3b97e932016-09-07 11:29:24 +12008823
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008824 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8825 "vkCmdNextSubpass(): Attempted to advance "
8826 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12008827
Tony Barbour1fa09702017-03-16 12:09:08 -06008828 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3b97e932016-09-07 11:29:24 +12008829 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8830
Tony Barbour552f6c02016-12-21 14:34:07 -07008831 m_commandBuffer->BeginCommandBuffer();
8832 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12008833
8834 // error here.
8835 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
8836 m_errorMonitor->VerifyFound();
8837
Tony Barbour552f6c02016-12-21 14:34:07 -07008838 m_commandBuffer->EndRenderPass();
8839 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12008840}
8841
Chris Forbes6d624702016-09-07 13:57:05 +12008842TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008843 TEST_DESCRIPTION(
8844 "Test that an error is produced when CmdEndRenderPass is "
8845 "called before the final subpass has been reached");
Chris Forbes6d624702016-09-07 13:57:05 +12008846
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8848 "vkCmdEndRenderPass(): Called before reaching "
8849 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12008850
Tony Barbour1fa09702017-03-16 12:09:08 -06008851 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008852 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
8853 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12008854
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008855 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12008856
8857 VkRenderPass rp;
8858 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
8859 ASSERT_VK_SUCCESS(err);
8860
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008861 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12008862
8863 VkFramebuffer fb;
8864 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
8865 ASSERT_VK_SUCCESS(err);
8866
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008867 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12008868
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008869 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {16, 16}}, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12008870
8871 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
8872
8873 // Error here.
8874 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8875 m_errorMonitor->VerifyFound();
8876
8877 // Clean up.
8878 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
8879 vkDestroyRenderPass(m_device->device(), rp, nullptr);
8880}
8881
Karl Schultz9e66a292016-04-21 15:57:51 -06008882TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
8883 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008884 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8885 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06008886
Tony Barbour1fa09702017-03-16 12:09:08 -06008887 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour552f6c02016-12-21 14:34:07 -07008888 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06008889
8890 VkBufferMemoryBarrier buf_barrier = {};
8891 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8892 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8893 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8894 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8895 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8896 buf_barrier.buffer = VK_NULL_HANDLE;
8897 buf_barrier.offset = 0;
8898 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008899 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8900 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06008901
8902 m_errorMonitor->VerifyFound();
8903}
8904
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008905TEST_F(VkLayerTest, InvalidBarriers) {
8906 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
8907
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008908 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008909
Tony Barbour1fa09702017-03-16 12:09:08 -06008910 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -07008911 auto depth_format = find_depth_stencil_format(m_device);
8912 if (!depth_format) {
8913 printf(" No Depth + Stencil format found. Skipped.\n");
8914 return;
8915 }
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008916 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8917
8918 VkMemoryBarrier mem_barrier = {};
8919 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
8920 mem_barrier.pNext = NULL;
8921 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8922 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07008923 m_commandBuffer->BeginCommandBuffer();
8924 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008925 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008926 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008927 &mem_barrier, 0, nullptr, 0, nullptr);
8928 m_errorMonitor->VerifyFound();
8929
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008930 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008931 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008932 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008933 ASSERT_TRUE(image.initialized());
8934 VkImageMemoryBarrier img_barrier = {};
8935 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8936 img_barrier.pNext = NULL;
8937 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8938 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8939 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8940 // New layout can't be UNDEFINED
8941 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8942 img_barrier.image = image.handle();
8943 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8944 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8945 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8946 img_barrier.subresourceRange.baseArrayLayer = 0;
8947 img_barrier.subresourceRange.baseMipLevel = 0;
8948 img_barrier.subresourceRange.layerCount = 1;
8949 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008950 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8951 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008952 m_errorMonitor->VerifyFound();
8953 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8954
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008955 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8956 "Subresource must have the sum of the "
8957 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008958 // baseArrayLayer + layerCount must be <= image's arrayLayers
8959 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008960 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8961 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008962 m_errorMonitor->VerifyFound();
8963 img_barrier.subresourceRange.baseArrayLayer = 0;
8964
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008965 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008966 // baseMipLevel + levelCount must be <= image's mipLevels
8967 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008968 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8969 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008970 m_errorMonitor->VerifyFound();
8971 img_barrier.subresourceRange.baseMipLevel = 0;
8972
Mike Weiblen7053aa32017-01-25 15:21:10 -07008973 // levelCount must be non-zero.
8974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
8975 img_barrier.subresourceRange.levelCount = 0;
8976 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8977 nullptr, 0, nullptr, 1, &img_barrier);
8978 m_errorMonitor->VerifyFound();
8979 img_barrier.subresourceRange.levelCount = 1;
8980
8981 // layerCount must be non-zero.
8982 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
8983 img_barrier.subresourceRange.layerCount = 0;
8984 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8985 nullptr, 0, nullptr, 1, &img_barrier);
8986 m_errorMonitor->VerifyFound();
8987 img_barrier.subresourceRange.layerCount = 1;
8988
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Buffer Barriers cannot be used during a render pass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008990 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07008991 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8992 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008993 VkBufferMemoryBarrier buf_barrier = {};
8994 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8995 buf_barrier.pNext = NULL;
8996 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8997 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8998 buf_barrier.buffer = buffer.handle();
8999 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9000 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9001 buf_barrier.offset = 0;
9002 buf_barrier.size = VK_WHOLE_SIZE;
9003 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009004 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9005 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009006 m_errorMonitor->VerifyFound();
9007 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9008
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009009 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009010 buf_barrier.offset = 257;
9011 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009012 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9013 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009014 m_errorMonitor->VerifyFound();
9015 buf_barrier.offset = 0;
9016
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009017 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009018 buf_barrier.size = 257;
9019 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009020 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9021 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009022 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009023
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009024 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009025 m_errorMonitor->SetDesiredFailureMsg(
9026 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009027 "Depth/stencil image formats must have at least one of VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009028 VkDepthStencilObj ds_image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -07009029 ds_image.Init(m_device, 128, 128, depth_format);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009030 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06009031 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9032 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009033 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009034
9035 // Not having DEPTH or STENCIL set is an error
Rene Lindsay4834cba2017-02-02 17:18:56 -07009036 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009037 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9038 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009039 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07009040
9041 // Having anything other than DEPTH or STENCIL is an error
9042 m_errorMonitor->SetDesiredFailureMsg(
9043 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9044 "Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
9045 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
9046 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9047 nullptr, 0, nullptr, 1, &img_barrier);
9048 m_errorMonitor->VerifyFound();
9049
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009050 // Now test depth-only
9051 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009052 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
9053 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009054 VkDepthStencilObj d_image(m_device);
9055 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
9056 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009057 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009058 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009059 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009060
9061 // DEPTH bit must be set
9062 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9063 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009064 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009065 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9066 0, nullptr, 0, nullptr, 1, &img_barrier);
9067 m_errorMonitor->VerifyFound();
9068
9069 // No bits other than DEPTH may be set
9070 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9071 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
9072 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009073 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9074 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009075 m_errorMonitor->VerifyFound();
9076 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009077
9078 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009079 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
9080 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009081 VkDepthStencilObj s_image(m_device);
9082 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
9083 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009084 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009085 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009086 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06009087 // Use of COLOR aspect on depth image is error
Dave Houltonf3229d52017-02-21 15:59:08 -07009088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9089 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis15684a02016-07-21 14:55:26 -06009090 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009091 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9092 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009093 m_errorMonitor->VerifyFound();
9094 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009095
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009096 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009097 VkImageObj c_image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009098 c_image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009099 ASSERT_TRUE(c_image.initialized());
9100 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9101 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9102 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009103
9104 // COLOR bit must be set
9105 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9106 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009107 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009108 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9109 nullptr, 0, nullptr, 1, &img_barrier);
9110 m_errorMonitor->VerifyFound();
9111
9112 // No bits other than COLOR may be set
9113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9114 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
9115 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009116 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9117 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009118 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009119
Mike Weiblene6e01172017-03-07 22:18:40 -07009120 // A barrier's new and old VkImageLayout must be compatible with an image's VkImageUsageFlags.
9121 {
9122 VkImageObj img_color(m_device);
9123 img_color.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
9124 ASSERT_TRUE(img_color.initialized());
9125
9126 VkImageObj img_ds(m_device);
Tony Barbour9357d542017-03-24 15:42:21 -06009127 img_ds.init(128, 128, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene6e01172017-03-07 22:18:40 -07009128 ASSERT_TRUE(img_ds.initialized());
9129
9130 VkImageObj img_xfer_src(m_device);
9131 img_xfer_src.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
9132 ASSERT_TRUE(img_xfer_src.initialized());
9133
9134 VkImageObj img_xfer_dst(m_device);
9135 img_xfer_dst.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
9136 ASSERT_TRUE(img_xfer_dst.initialized());
9137
9138 VkImageObj img_sampled(m_device);
9139 img_sampled.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL);
9140 ASSERT_TRUE(img_sampled.initialized());
9141
9142 VkImageObj img_input(m_device);
9143 img_input.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
9144 ASSERT_TRUE(img_input.initialized());
9145
9146 const struct {
9147 VkImageObj &image_obj;
9148 VkImageLayout bad_layout;
9149 UNIQUE_VALIDATION_ERROR_CODE msg_code;
9150 } bad_buffer_layouts[] = {
9151 // clang-format off
9152 // images _without_ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
9153 {img_ds, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9154 {img_xfer_src, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9155 {img_xfer_dst, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9156 {img_sampled, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9157 {img_input, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9158 // images _without_ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
9159 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9160 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9161 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9162 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9163 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9164 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9165 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9166 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9167 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9168 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9169 // images _without_ VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
9170 {img_color, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9171 {img_ds, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9172 {img_xfer_src, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9173 {img_xfer_dst, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9174 // images _without_ VK_IMAGE_USAGE_TRANSFER_SRC_BIT
9175 {img_color, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9176 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9177 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9178 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9179 {img_input, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9180 // images _without_ VK_IMAGE_USAGE_TRANSFER_DST_BIT
9181 {img_color, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9182 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9183 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9184 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9185 {img_input, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9186 // clang-format on
9187 };
9188 const uint32_t layout_count = sizeof(bad_buffer_layouts) / sizeof(bad_buffer_layouts[0]);
9189
9190 for (uint32_t i = 0; i < layout_count; ++i) {
9191 img_barrier.image = bad_buffer_layouts[i].image_obj.handle();
9192 const VkImageUsageFlags usage = bad_buffer_layouts[i].image_obj.usage();
9193 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
9194 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
9195 : VK_IMAGE_ASPECT_COLOR_BIT;
9196
9197 img_barrier.oldLayout = bad_buffer_layouts[i].bad_layout;
9198 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9199 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9200 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9201 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9202 m_errorMonitor->VerifyFound();
9203
9204 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9205 img_barrier.newLayout = bad_buffer_layouts[i].bad_layout;
9206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9207 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9208 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9209 m_errorMonitor->VerifyFound();
9210 }
9211
9212 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9213 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9214 }
9215
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009216 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
9217
9218 // Create command pool with incompatible queueflags
9219 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mike Schuchardt06304c22017-03-01 17:09:09 -07009220 uint32_t queue_family_index = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_COMPUTE_BIT);
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009221 if (queue_family_index == UINT32_MAX) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009222 printf(" No non-compute queue found; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009223 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009224 }
9225 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
9226
9227 VkCommandPool command_pool;
9228 VkCommandPoolCreateInfo pool_create_info{};
9229 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
9230 pool_create_info.queueFamilyIndex = queue_family_index;
9231 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
9232 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
9233
9234 // Allocate a command buffer
9235 VkCommandBuffer bad_command_buffer;
9236 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
9237 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
9238 command_buffer_allocate_info.commandPool = command_pool;
9239 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
9240 command_buffer_allocate_info.commandBufferCount = 1;
9241 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
9242
9243 VkCommandBufferBeginInfo cbbi = {};
9244 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9245 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
9246 buf_barrier.offset = 0;
9247 buf_barrier.size = VK_WHOLE_SIZE;
9248 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9249 &buf_barrier, 0, nullptr);
9250 m_errorMonitor->VerifyFound();
9251
9252 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
9253 vkEndCommandBuffer(bad_command_buffer);
9254 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009255 printf(" The non-compute queue does not support graphics; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009256 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009257 }
9258 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
9259 VkEvent event;
9260 VkEventCreateInfo event_create_info{};
9261 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
9262 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
9263 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
9264 nullptr, 0, nullptr);
9265 m_errorMonitor->VerifyFound();
9266
9267 vkEndCommandBuffer(bad_command_buffer);
9268 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009269}
9270
Tony Barbour18ba25c2016-09-29 13:42:40 -06009271TEST_F(VkLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
9272 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ in srcAccessMask
9273
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009274 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "must have required access bit");
Tony Barbour1fa09702017-03-16 12:09:08 -06009275 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour18ba25c2016-09-29 13:42:40 -06009276 VkImageObj image(m_device);
Mike Weiblen62d08a32017-03-07 22:18:27 -07009277 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
9278 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour18ba25c2016-09-29 13:42:40 -06009279 ASSERT_TRUE(image.initialized());
9280
9281 VkImageMemoryBarrier barrier = {};
9282 VkImageSubresourceRange range;
9283 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9284 barrier.srcAccessMask = 0;
9285 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
9286 barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
9287 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9288 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9289 barrier.image = image.handle();
9290 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9291 range.baseMipLevel = 0;
9292 range.levelCount = 1;
9293 range.baseArrayLayer = 0;
9294 range.layerCount = 1;
9295 barrier.subresourceRange = range;
9296 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
9297 cmdbuf.BeginCommandBuffer();
9298 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9299 &barrier);
9300 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9301 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
9302 barrier.srcAccessMask = 0;
9303 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
9304 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9305 &barrier);
9306
9307 m_errorMonitor->VerifyFound();
9308}
9309
Karl Schultz6addd812016-02-02 17:17:23 -07009310TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009311 // Bind a BeginRenderPass within an active RenderPass
Tony Barbour1fa09702017-03-16 12:09:08 -06009312 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009313 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009314
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009315 uint32_t const indices[] = {0};
9316 VkBufferCreateInfo buf_info = {};
9317 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9318 buf_info.size = 1024;
9319 buf_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9320 buf_info.queueFamilyIndexCount = 1;
9321 buf_info.pQueueFamilyIndices = indices;
9322
9323 VkBuffer buffer;
9324 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
9325 ASSERT_VK_SUCCESS(err);
9326
9327 VkMemoryRequirements requirements;
9328 vkGetBufferMemoryRequirements(m_device->device(), buffer, &requirements);
9329
9330 VkMemoryAllocateInfo alloc_info{};
9331 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9332 alloc_info.pNext = NULL;
9333 alloc_info.memoryTypeIndex = 0;
9334 alloc_info.allocationSize = requirements.size;
9335 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
9336 ASSERT_TRUE(pass);
9337
9338 VkDeviceMemory memory;
9339 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
9340 ASSERT_VK_SUCCESS(err);
9341
9342 err = vkBindBufferMemory(m_device->device(), buffer, memory, 0);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009343 ASSERT_VK_SUCCESS(err);
9344
Tony Barbour552f6c02016-12-21 14:34:07 -07009345 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009346 ASSERT_VK_SUCCESS(err);
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009347
Karl Schultz6addd812016-02-02 17:17:23 -07009348 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9349 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009350 // Should error before calling to driver so don't care about actual data
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009351 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
9352 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), buffer, 7, VK_INDEX_TYPE_UINT16);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009353 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009354
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009355 vkFreeMemory(m_device->device(), memory, NULL);
9356 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009357}
9358
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009359TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
9360 // Create an out-of-range queueFamilyIndex
Tony Barbour1fa09702017-03-16 12:09:08 -06009361 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009362 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9363 VkBufferCreateInfo buffCI = {};
9364 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9365 buffCI.size = 1024;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009366 buffCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009367 buffCI.queueFamilyIndexCount = 2;
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009368 // Introduce failure by specifying invalid queue_family_index
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009369 uint32_t qfi[2];
9370 qfi[0] = 777;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009371 qfi[1] = 0;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009372
9373 buffCI.pQueueFamilyIndices = qfi;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009374 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009375
9376 VkBuffer ib;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009377 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9378 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one of the indices "
9379 "specified when the device was created, via the VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009380 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009381 m_errorMonitor->VerifyFound();
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009382
9383 if (m_device->queue_props.size() > 2) {
Tony Barbour75db7402017-03-09 14:51:36 -07009384 VkBuffer ib2;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009385 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which was not created allowing concurrent");
9386
9387 // Create buffer shared to queue families 1 and 2, but submitted on queue family 0
9388 buffCI.queueFamilyIndexCount = 2;
9389 qfi[0] = 1;
9390 qfi[1] = 2;
Tony Barbour75db7402017-03-09 14:51:36 -07009391 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib2);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009392 VkDeviceMemory mem;
9393 VkMemoryRequirements mem_reqs;
Tony Barbour75db7402017-03-09 14:51:36 -07009394 vkGetBufferMemoryRequirements(m_device->device(), ib2, &mem_reqs);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009395
9396 VkMemoryAllocateInfo alloc_info = {};
9397 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9398 alloc_info.allocationSize = 1024;
9399 bool pass = false;
9400 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
9401 if (!pass) {
Tony Barbour75db7402017-03-09 14:51:36 -07009402 vkDestroyBuffer(m_device->device(), ib2, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009403 return;
9404 }
9405 vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
Tony Barbour75db7402017-03-09 14:51:36 -07009406 vkBindBufferMemory(m_device->device(), ib2, mem, 0);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009407
9408 m_commandBuffer->begin();
Tony Barbour75db7402017-03-09 14:51:36 -07009409 vkCmdFillBuffer(m_commandBuffer->handle(), ib2, 0, 16, 5);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009410 m_commandBuffer->end();
9411 QueueCommandBuffer(false);
9412 m_errorMonitor->VerifyFound();
Tony Barbour75db7402017-03-09 14:51:36 -07009413 vkDestroyBuffer(m_device->device(), ib2, NULL);
9414 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009415 }
9416
Tony Barbourdf4c0042016-06-01 15:55:43 -06009417 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009418}
9419
Karl Schultz6addd812016-02-02 17:17:23 -07009420TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009421 TEST_DESCRIPTION(
9422 "Attempt vkCmdExecuteCommands with a primary command buffer"
9423 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009424
Tony Barbour1fa09702017-03-16 12:09:08 -06009425 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009426 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009427
Chris Forbesf29a84f2016-10-06 18:39:28 +13009428 // An empty primary command buffer
9429 VkCommandBufferObj cb(m_device, m_commandPool);
9430 cb.BeginCommandBuffer();
9431 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -06009432
Chris Forbesf29a84f2016-10-06 18:39:28 +13009433 m_commandBuffer->BeginCommandBuffer();
9434 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9435 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009436
Chris Forbesf29a84f2016-10-06 18:39:28 +13009437 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
9438 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009439 m_errorMonitor->VerifyFound();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07009440
9441 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be pending execution");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009442}
9443
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009444TEST_F(VkLayerTest, DSUsageBitsErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009445 TEST_DESCRIPTION(
9446 "Attempt to update descriptor sets for images and buffers "
9447 "that do not have correct usage bits sets.");
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009448 VkResult err;
9449
Tony Barbour1fa09702017-03-16 12:09:08 -06009450 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009451 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9452 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9453 ds_type_count[i].type = VkDescriptorType(i);
9454 ds_type_count[i].descriptorCount = 1;
9455 }
9456 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9457 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9458 ds_pool_ci.pNext = NULL;
9459 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9460 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9461 ds_pool_ci.pPoolSizes = ds_type_count;
9462
9463 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009464 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009465 ASSERT_VK_SUCCESS(err);
9466
9467 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009468 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009469 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9470 dsl_binding[i].binding = 0;
9471 dsl_binding[i].descriptorType = VkDescriptorType(i);
9472 dsl_binding[i].descriptorCount = 1;
9473 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
9474 dsl_binding[i].pImmutableSamplers = NULL;
9475 }
9476
9477 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9478 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9479 ds_layout_ci.pNext = NULL;
9480 ds_layout_ci.bindingCount = 1;
9481 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
9482 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9483 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009484 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009485 ASSERT_VK_SUCCESS(err);
9486 }
9487 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9488 VkDescriptorSetAllocateInfo alloc_info = {};
9489 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9490 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9491 alloc_info.descriptorPool = ds_pool;
9492 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009493 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009494 ASSERT_VK_SUCCESS(err);
9495
9496 // Create a buffer & bufferView to be used for invalid updates
9497 VkBufferCreateInfo buff_ci = {};
9498 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Tony Barbour415497c2017-01-24 10:06:09 -07009499 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009500 buff_ci.size = 256;
9501 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tony Barbour415497c2017-01-24 10:06:09 -07009502 VkBuffer buffer, storage_texel_buffer;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009503 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9504 ASSERT_VK_SUCCESS(err);
Tony Barbour415497c2017-01-24 10:06:09 -07009505
9506 // Create another buffer to use in testing the UNIFORM_TEXEL_BUFFER case
9507 buff_ci.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
9508 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &storage_texel_buffer);
9509 ASSERT_VK_SUCCESS(err);
9510
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009511 VkMemoryRequirements mem_reqs;
9512 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
9513 VkMemoryAllocateInfo mem_alloc_info = {};
9514 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9515 mem_alloc_info.pNext = NULL;
9516 mem_alloc_info.memoryTypeIndex = 0;
9517 mem_alloc_info.allocationSize = mem_reqs.size;
9518 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9519 if (!pass) {
9520 vkDestroyBuffer(m_device->device(), buffer, NULL);
9521 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9522 return;
9523 }
9524 VkDeviceMemory mem;
9525 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
9526 ASSERT_VK_SUCCESS(err);
9527 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9528 ASSERT_VK_SUCCESS(err);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009529
9530 VkBufferViewCreateInfo buff_view_ci = {};
9531 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9532 buff_view_ci.buffer = buffer;
9533 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9534 buff_view_ci.range = VK_WHOLE_SIZE;
9535 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009536 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009537 ASSERT_VK_SUCCESS(err);
9538
Tony Barbour415497c2017-01-24 10:06:09 -07009539 // Now get resources / view for storage_texel_buffer
9540 vkGetBufferMemoryRequirements(m_device->device(), storage_texel_buffer, &mem_reqs);
9541 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9542 if (!pass) {
9543 vkDestroyBuffer(m_device->device(), buffer, NULL);
9544 vkDestroyBufferView(m_device->device(), buff_view, NULL);
9545 vkFreeMemory(m_device->device(), mem, NULL);
9546 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
9547 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9548 return;
9549 }
9550 VkDeviceMemory storage_texel_buffer_mem;
9551 VkBufferView storage_texel_buffer_view;
9552 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &storage_texel_buffer_mem);
9553 ASSERT_VK_SUCCESS(err);
9554 err = vkBindBufferMemory(m_device->device(), storage_texel_buffer, storage_texel_buffer_mem, 0);
9555 ASSERT_VK_SUCCESS(err);
9556 buff_view_ci.buffer = storage_texel_buffer;
9557 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &storage_texel_buffer_view);
9558 ASSERT_VK_SUCCESS(err);
9559
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009560 // Create an image to be used for invalid updates
Tony Barbour4b4a4222017-01-24 11:46:34 -07009561 // Find a format / tiling for COLOR_ATTACHMENT
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009562 VkImageCreateInfo image_ci = {};
Tony Barbour4b4a4222017-01-24 11:46:34 -07009563 image_ci.format = VK_FORMAT_UNDEFINED;
9564 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
9565 VkFormat format = static_cast<VkFormat>(f);
9566 VkFormatProperties fProps = m_device->format_properties(format);
9567 if (fProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9568 image_ci.format = format;
9569 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9570 break;
9571 } else if (fProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9572 image_ci.format = format;
9573 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
9574 break;
9575 }
9576 }
9577 if (image_ci.format == VK_FORMAT_UNDEFINED) {
9578 return;
9579 }
9580
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009581 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9582 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009583 image_ci.extent.width = 64;
9584 image_ci.extent.height = 64;
9585 image_ci.extent.depth = 1;
9586 image_ci.mipLevels = 1;
9587 image_ci.arrayLayers = 1;
9588 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009589 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009590 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009591 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9592 VkImage image;
9593 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9594 ASSERT_VK_SUCCESS(err);
9595 // Bind memory to image
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009596 VkDeviceMemory image_mem;
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009597
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009598 VkMemoryAllocateInfo mem_alloc = {};
9599 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9600 mem_alloc.pNext = NULL;
9601 mem_alloc.allocationSize = 0;
9602 mem_alloc.memoryTypeIndex = 0;
9603 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9604 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009605 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009606 ASSERT_TRUE(pass);
9607 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9608 ASSERT_VK_SUCCESS(err);
9609 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9610 ASSERT_VK_SUCCESS(err);
9611 // Now create view for image
9612 VkImageViewCreateInfo image_view_ci = {};
9613 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9614 image_view_ci.image = image;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009615 image_view_ci.format = image_ci.format;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009616 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9617 image_view_ci.subresourceRange.layerCount = 1;
9618 image_view_ci.subresourceRange.baseArrayLayer = 0;
9619 image_view_ci.subresourceRange.levelCount = 1;
9620 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9621 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009622 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009623 ASSERT_VK_SUCCESS(err);
9624
9625 VkDescriptorBufferInfo buff_info = {};
9626 buff_info.buffer = buffer;
9627 VkDescriptorImageInfo img_info = {};
9628 img_info.imageView = image_view;
9629 VkWriteDescriptorSet descriptor_write = {};
9630 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9631 descriptor_write.dstBinding = 0;
9632 descriptor_write.descriptorCount = 1;
9633 descriptor_write.pTexelBufferView = &buff_view;
9634 descriptor_write.pBufferInfo = &buff_info;
9635 descriptor_write.pImageInfo = &img_info;
9636
9637 // These error messages align with VkDescriptorType struct
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009638 UNIQUE_VALIDATION_ERROR_CODE error_codes[] = {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009639 VALIDATION_ERROR_00943, // placeholder, no error for SAMPLER descriptor
9640 VALIDATION_ERROR_00943, // COMBINED_IMAGE_SAMPLER
9641 VALIDATION_ERROR_00943, // SAMPLED_IMAGE
9642 VALIDATION_ERROR_00943, // STORAGE_IMAGE
9643 VALIDATION_ERROR_00950, // UNIFORM_TEXEL_BUFFER
9644 VALIDATION_ERROR_00951, // STORAGE_TEXEL_BUFFER
9645 VALIDATION_ERROR_00946, // UNIFORM_BUFFER
9646 VALIDATION_ERROR_00947, // STORAGE_BUFFER
9647 VALIDATION_ERROR_00946, // UNIFORM_BUFFER_DYNAMIC
9648 VALIDATION_ERROR_00947, // STORAGE_BUFFER_DYNAMIC
9649 VALIDATION_ERROR_00943 // INPUT_ATTACHMENT
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009650 };
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009651 // Start loop at 1 as SAMPLER desc type has no usage bit error
9652 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
Tony Barbour415497c2017-01-24 10:06:09 -07009653 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9654 // Now check for UNIFORM_TEXEL_BUFFER using storage_texel_buffer_view
9655 descriptor_write.pTexelBufferView = &storage_texel_buffer_view;
9656 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009657 descriptor_write.descriptorType = VkDescriptorType(i);
9658 descriptor_write.dstSet = descriptor_sets[i];
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009659 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_codes[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009660
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009661 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009662
9663 m_errorMonitor->VerifyFound();
9664 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009665 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9666 descriptor_write.pTexelBufferView = &buff_view;
9667 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009668 }
Tony Barbour415497c2017-01-24 10:06:09 -07009669
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009670 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
9671 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009672 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009673 vkDestroyImageView(m_device->device(), image_view, NULL);
9674 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009675 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009676 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009677 vkDestroyBufferView(m_device->device(), storage_texel_buffer_view, NULL);
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009678 vkFreeMemory(m_device->device(), mem, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009679 vkFreeMemory(m_device->device(), storage_texel_buffer_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009680 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9681}
9682
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009683TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009684 TEST_DESCRIPTION(
9685 "Attempt to update buffer descriptor set that has incorrect "
9686 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009687 "1. offset value greater than or equal to buffer size\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009688 "2. range value of 0\n"
9689 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009690 VkResult err;
9691
Tony Barbour1fa09702017-03-16 12:09:08 -06009692 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009693 VkDescriptorPoolSize ds_type_count = {};
9694 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9695 ds_type_count.descriptorCount = 1;
9696
9697 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9698 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9699 ds_pool_ci.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009700 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009701 ds_pool_ci.maxSets = 1;
9702 ds_pool_ci.poolSizeCount = 1;
9703 ds_pool_ci.pPoolSizes = &ds_type_count;
9704
9705 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009706 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009707 ASSERT_VK_SUCCESS(err);
9708
9709 // Create layout with single uniform buffer descriptor
9710 VkDescriptorSetLayoutBinding dsl_binding = {};
9711 dsl_binding.binding = 0;
9712 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9713 dsl_binding.descriptorCount = 1;
9714 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9715 dsl_binding.pImmutableSamplers = NULL;
9716
9717 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9718 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9719 ds_layout_ci.pNext = NULL;
9720 ds_layout_ci.bindingCount = 1;
9721 ds_layout_ci.pBindings = &dsl_binding;
9722 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009723 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009724 ASSERT_VK_SUCCESS(err);
9725
9726 VkDescriptorSet descriptor_set = {};
9727 VkDescriptorSetAllocateInfo alloc_info = {};
9728 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9729 alloc_info.descriptorSetCount = 1;
9730 alloc_info.descriptorPool = ds_pool;
9731 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009732 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009733 ASSERT_VK_SUCCESS(err);
9734
9735 // Create a buffer to be used for invalid updates
9736 VkBufferCreateInfo buff_ci = {};
9737 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9738 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009739 buff_ci.size = m_device->props.limits.minUniformBufferOffsetAlignment;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009740 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9741 VkBuffer buffer;
9742 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9743 ASSERT_VK_SUCCESS(err);
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009744
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009745 // Have to bind memory to buffer before descriptor update
9746 VkMemoryAllocateInfo mem_alloc = {};
9747 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9748 mem_alloc.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009749 mem_alloc.allocationSize = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009750 mem_alloc.memoryTypeIndex = 0;
9751
9752 VkMemoryRequirements mem_reqs;
9753 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009754 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009755 if (!pass) {
9756 vkDestroyBuffer(m_device->device(), buffer, NULL);
9757 return;
9758 }
9759
9760 VkDeviceMemory mem;
9761 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
9762 ASSERT_VK_SUCCESS(err);
9763 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9764 ASSERT_VK_SUCCESS(err);
9765
9766 VkDescriptorBufferInfo buff_info = {};
9767 buff_info.buffer = buffer;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009768 // Cause error due to offset out of range
9769 buff_info.offset = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009770 buff_info.range = VK_WHOLE_SIZE;
9771 VkWriteDescriptorSet descriptor_write = {};
9772 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9773 descriptor_write.dstBinding = 0;
9774 descriptor_write.descriptorCount = 1;
9775 descriptor_write.pTexelBufferView = nullptr;
9776 descriptor_write.pBufferInfo = &buff_info;
9777 descriptor_write.pImageInfo = nullptr;
9778
9779 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9780 descriptor_write.dstSet = descriptor_set;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009781 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00959);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009782
9783 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9784
9785 m_errorMonitor->VerifyFound();
9786 // Now cause error due to range of 0
9787 buff_info.offset = 0;
9788 buff_info.range = 0;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009789 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00960);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009790
9791 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9792
9793 m_errorMonitor->VerifyFound();
9794 // Now cause error due to range exceeding buffer size - offset
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009795 buff_info.offset = 0;
9796 buff_info.range = buff_ci.size + 1;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009797 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00961);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009798
9799 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9800
9801 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -06009802 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009803 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9804 vkDestroyBuffer(m_device->device(), buffer, NULL);
9805 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9806 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9807}
9808
Tobin Ehlis845887e2017-02-02 19:01:44 -07009809TEST_F(VkLayerTest, DSBufferLimitErrors) {
9810 TEST_DESCRIPTION(
9811 "Attempt to update buffer descriptor set that has VkDescriptorBufferInfo values that violate device limits.\n"
9812 "Test cases include:\n"
9813 "1. range of uniform buffer update exceeds maxUniformBufferRange\n"
9814 "2. offset of uniform buffer update is not multiple of minUniformBufferOffsetAlignment\n"
9815 "3. range of storage buffer update exceeds maxStorageBufferRange\n"
9816 "4. offset of storage buffer update is not multiple of minStorageBufferOffsetAlignment");
9817 VkResult err;
9818
Tony Barbour1fa09702017-03-16 12:09:08 -06009819 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis845887e2017-02-02 19:01:44 -07009820 VkDescriptorPoolSize ds_type_count[2] = {};
9821 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9822 ds_type_count[0].descriptorCount = 1;
9823 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9824 ds_type_count[1].descriptorCount = 1;
9825
9826 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9827 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9828 ds_pool_ci.pNext = NULL;
9829 ds_pool_ci.maxSets = 1;
9830 ds_pool_ci.poolSizeCount = 2;
9831 ds_pool_ci.pPoolSizes = ds_type_count;
9832
9833 VkDescriptorPool ds_pool;
9834 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9835 ASSERT_VK_SUCCESS(err);
9836
9837 // Create layout with single uniform buffer & single storage buffer descriptor
9838 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
9839 dsl_binding[0].binding = 0;
9840 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9841 dsl_binding[0].descriptorCount = 1;
9842 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
9843 dsl_binding[0].pImmutableSamplers = NULL;
9844 dsl_binding[1].binding = 1;
9845 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9846 dsl_binding[1].descriptorCount = 1;
9847 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
9848 dsl_binding[1].pImmutableSamplers = NULL;
9849
9850 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9851 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9852 ds_layout_ci.pNext = NULL;
9853 ds_layout_ci.bindingCount = 2;
9854 ds_layout_ci.pBindings = dsl_binding;
9855 VkDescriptorSetLayout ds_layout;
9856 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
9857 ASSERT_VK_SUCCESS(err);
9858
9859 VkDescriptorSet descriptor_set = {};
9860 VkDescriptorSetAllocateInfo alloc_info = {};
9861 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9862 alloc_info.descriptorSetCount = 1;
9863 alloc_info.descriptorPool = ds_pool;
9864 alloc_info.pSetLayouts = &ds_layout;
9865 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
9866 ASSERT_VK_SUCCESS(err);
9867
9868 // Create a buffer to be used for invalid updates
9869 auto max_ub_range = m_device->props.limits.maxUniformBufferRange;
9870 auto min_ub_align = m_device->props.limits.minUniformBufferOffsetAlignment;
9871 auto max_sb_range = m_device->props.limits.maxStorageBufferRange;
9872 auto min_sb_align = m_device->props.limits.minStorageBufferOffsetAlignment;
9873 VkBufferCreateInfo ub_ci = {};
9874 ub_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9875 ub_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
9876 ub_ci.size = max_ub_range + 128; // Make buffer bigger than range limit
9877 ub_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9878 VkBuffer uniform_buffer;
9879 err = vkCreateBuffer(m_device->device(), &ub_ci, NULL, &uniform_buffer);
9880 ASSERT_VK_SUCCESS(err);
9881 VkBufferCreateInfo sb_ci = {};
9882 sb_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9883 sb_ci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
9884 sb_ci.size = max_sb_range + 128; // Make buffer bigger than range limit
9885 sb_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9886 VkBuffer storage_buffer;
9887 err = vkCreateBuffer(m_device->device(), &sb_ci, NULL, &storage_buffer);
9888 ASSERT_VK_SUCCESS(err);
9889 // Have to bind memory to buffer before descriptor update
9890 VkMemoryAllocateInfo mem_alloc = {};
9891 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9892 mem_alloc.pNext = NULL;
9893 mem_alloc.allocationSize = ub_ci.size + sb_ci.size + 1024; // additional buffer for offset
9894 mem_alloc.memoryTypeIndex = 0;
9895
Cort Stratton77a0d592017-02-17 13:14:13 -08009896 VkMemoryRequirements ub_mem_reqs, sb_mem_reqs;
9897 vkGetBufferMemoryRequirements(m_device->device(), uniform_buffer, &ub_mem_reqs);
9898 bool pass = m_device->phy().set_memory_type(ub_mem_reqs.memoryTypeBits, &mem_alloc, 0);
9899 vkGetBufferMemoryRequirements(m_device->device(), storage_buffer, &sb_mem_reqs);
9900 pass &= m_device->phy().set_memory_type(sb_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009901 if (!pass) {
Tobin Ehlis15c83792017-02-07 10:09:33 -07009902 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009903 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009904 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9905 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009906 return;
9907 }
9908
9909 VkDeviceMemory mem;
9910 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009911 if (VK_SUCCESS != err) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009912 printf(" Failed to allocate memory in DSBufferLimitErrors; skipped.\n");
Tobin Ehlis15c83792017-02-07 10:09:33 -07009913 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9914 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9915 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9916 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9917 return;
9918 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009919 ASSERT_VK_SUCCESS(err);
9920 err = vkBindBufferMemory(m_device->device(), uniform_buffer, mem, 0);
9921 ASSERT_VK_SUCCESS(err);
Cort Stratton77a0d592017-02-17 13:14:13 -08009922 auto sb_offset = (ub_ci.size + sb_mem_reqs.alignment - 1) & ~(sb_mem_reqs.alignment - 1);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009923 err = vkBindBufferMemory(m_device->device(), storage_buffer, mem, sb_offset);
9924 ASSERT_VK_SUCCESS(err);
9925
9926 VkDescriptorBufferInfo buff_info = {};
9927 buff_info.buffer = uniform_buffer;
9928 buff_info.range = ub_ci.size; // This will exceed limit
9929 VkWriteDescriptorSet descriptor_write = {};
9930 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9931 descriptor_write.dstBinding = 0;
9932 descriptor_write.descriptorCount = 1;
9933 descriptor_write.pTexelBufferView = nullptr;
9934 descriptor_write.pBufferInfo = &buff_info;
9935 descriptor_write.pImageInfo = nullptr;
9936
9937 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9938 descriptor_write.dstSet = descriptor_set;
Tony Barbour02d08552017-03-24 16:36:01 -06009939 if (max_ub_range != UINT32_MAX) {
9940 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
9941 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9942 m_errorMonitor->VerifyFound();
9943 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009944 // Reduce size of range to acceptable limit & cause offset error
9945 buff_info.range = max_ub_range;
9946 buff_info.offset = min_ub_align - 1;
9947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
9948 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9949 m_errorMonitor->VerifyFound();
9950
9951 // Now break storage updates
9952 buff_info.buffer = storage_buffer;
9953 buff_info.range = sb_ci.size; // This will exceed limit
9954 buff_info.offset = 0; // Reset offset for this update
9955
9956 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9957 descriptor_write.dstBinding = 1;
Tony Barbour02d08552017-03-24 16:36:01 -06009958 if (max_ub_range != UINT32_MAX) {
9959 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
9960 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9961 m_errorMonitor->VerifyFound();
9962 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009963
9964 // Reduce size of range to acceptable limit & cause offset error
9965 buff_info.range = max_sb_range;
9966 buff_info.offset = min_sb_align - 1;
9967 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
9968 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9969 m_errorMonitor->VerifyFound();
9970
9971 vkFreeMemory(m_device->device(), mem, NULL);
9972 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9973 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9974 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9975 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9976}
9977
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009978TEST_F(VkLayerTest, DSAspectBitsErrors) {
9979 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
9980 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009981 TEST_DESCRIPTION(
9982 "Attempt to update descriptor sets for images "
9983 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009984 VkResult err;
9985
Tony Barbour1fa09702017-03-16 12:09:08 -06009986 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -07009987 auto depth_format = find_depth_stencil_format(m_device);
9988 if (!depth_format) {
9989 printf(" No Depth + Stencil format found. Skipped.\n");
9990 return;
9991 }
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009992 VkDescriptorPoolSize ds_type_count = {};
9993 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9994 ds_type_count.descriptorCount = 1;
9995
9996 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9997 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9998 ds_pool_ci.pNext = NULL;
Jeremy Hayes293c7ed2017-03-09 14:47:07 -07009999 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010000 ds_pool_ci.maxSets = 5;
10001 ds_pool_ci.poolSizeCount = 1;
10002 ds_pool_ci.pPoolSizes = &ds_type_count;
10003
10004 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010005 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010006 ASSERT_VK_SUCCESS(err);
10007
10008 VkDescriptorSetLayoutBinding dsl_binding = {};
10009 dsl_binding.binding = 0;
10010 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10011 dsl_binding.descriptorCount = 1;
10012 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10013 dsl_binding.pImmutableSamplers = NULL;
10014
10015 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10016 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10017 ds_layout_ci.pNext = NULL;
10018 ds_layout_ci.bindingCount = 1;
10019 ds_layout_ci.pBindings = &dsl_binding;
10020 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010021 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010022 ASSERT_VK_SUCCESS(err);
10023
10024 VkDescriptorSet descriptor_set = {};
10025 VkDescriptorSetAllocateInfo alloc_info = {};
10026 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10027 alloc_info.descriptorSetCount = 1;
10028 alloc_info.descriptorPool = ds_pool;
10029 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010030 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010031 ASSERT_VK_SUCCESS(err);
10032
10033 // Create an image to be used for invalid updates
10034 VkImageCreateInfo image_ci = {};
10035 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10036 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070010037 image_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010038 image_ci.extent.width = 64;
10039 image_ci.extent.height = 64;
10040 image_ci.extent.depth = 1;
10041 image_ci.mipLevels = 1;
10042 image_ci.arrayLayers = 1;
10043 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Young2d1fa302017-03-02 10:13:09 -070010044 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010045 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10046 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10047 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10048 VkImage image;
10049 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10050 ASSERT_VK_SUCCESS(err);
10051 // Bind memory to image
10052 VkMemoryRequirements mem_reqs;
10053 VkDeviceMemory image_mem;
10054 bool pass;
10055 VkMemoryAllocateInfo mem_alloc = {};
10056 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10057 mem_alloc.pNext = NULL;
10058 mem_alloc.allocationSize = 0;
10059 mem_alloc.memoryTypeIndex = 0;
10060 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10061 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010062 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010063 ASSERT_TRUE(pass);
10064 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10065 ASSERT_VK_SUCCESS(err);
10066 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10067 ASSERT_VK_SUCCESS(err);
10068 // Now create view for image
10069 VkImageViewCreateInfo image_view_ci = {};
10070 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10071 image_view_ci.image = image;
Tony Barbourf887b162017-03-09 10:06:46 -070010072 image_view_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010073 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10074 image_view_ci.subresourceRange.layerCount = 1;
10075 image_view_ci.subresourceRange.baseArrayLayer = 0;
10076 image_view_ci.subresourceRange.levelCount = 1;
10077 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010078 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010079
10080 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010081 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010082 ASSERT_VK_SUCCESS(err);
10083
10084 VkDescriptorImageInfo img_info = {};
10085 img_info.imageView = image_view;
10086 VkWriteDescriptorSet descriptor_write = {};
10087 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10088 descriptor_write.dstBinding = 0;
10089 descriptor_write.descriptorCount = 1;
10090 descriptor_write.pTexelBufferView = NULL;
10091 descriptor_write.pBufferInfo = NULL;
10092 descriptor_write.pImageInfo = &img_info;
10093 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10094 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010095 const char *error_msg =
10096 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10097 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010098 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010099
10100 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10101
10102 m_errorMonitor->VerifyFound();
10103 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10104 vkDestroyImage(m_device->device(), image, NULL);
10105 vkFreeMemory(m_device->device(), image_mem, NULL);
10106 vkDestroyImageView(m_device->device(), image_view, NULL);
10107 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10108 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10109}
10110
Karl Schultz6addd812016-02-02 17:17:23 -070010111TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010112 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010113 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010114
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010115 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10116 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10117 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010118
Tony Barbour1fa09702017-03-16 12:09:08 -060010119 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010120 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010121 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010122 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10123 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010124
10125 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010126 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10127 ds_pool_ci.pNext = NULL;
10128 ds_pool_ci.maxSets = 1;
10129 ds_pool_ci.poolSizeCount = 1;
10130 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010131
Tobin Ehlis3b780662015-05-28 12:11:26 -060010132 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010133 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010134 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010135 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010136 dsl_binding.binding = 0;
10137 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10138 dsl_binding.descriptorCount = 1;
10139 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10140 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010141
Tony Barboureb254902015-07-15 12:50:33 -060010142 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010143 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10144 ds_layout_ci.pNext = NULL;
10145 ds_layout_ci.bindingCount = 1;
10146 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010147
Tobin Ehlis3b780662015-05-28 12:11:26 -060010148 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010149 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010150 ASSERT_VK_SUCCESS(err);
10151
10152 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010153 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010154 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010155 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010156 alloc_info.descriptorPool = ds_pool;
10157 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010158 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010159 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010160
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010161 VkSamplerCreateInfo sampler_ci = {};
10162 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10163 sampler_ci.pNext = NULL;
10164 sampler_ci.magFilter = VK_FILTER_NEAREST;
10165 sampler_ci.minFilter = VK_FILTER_NEAREST;
10166 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10167 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10168 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10169 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10170 sampler_ci.mipLodBias = 1.0;
10171 sampler_ci.anisotropyEnable = VK_FALSE;
10172 sampler_ci.maxAnisotropy = 1;
10173 sampler_ci.compareEnable = VK_FALSE;
10174 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10175 sampler_ci.minLod = 1.0;
10176 sampler_ci.maxLod = 1.0;
10177 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10178 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10179 VkSampler sampler;
10180 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10181 ASSERT_VK_SUCCESS(err);
10182
10183 VkDescriptorImageInfo info = {};
10184 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010185
10186 VkWriteDescriptorSet descriptor_write;
10187 memset(&descriptor_write, 0, sizeof(descriptor_write));
10188 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010189 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010190 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010191 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010192 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010193 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010194
10195 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10196
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010197 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010198
Chia-I Wuf7458c52015-10-26 21:10:41 +080010199 vkDestroySampler(m_device->device(), sampler, NULL);
10200 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10201 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010202}
10203
Karl Schultz6addd812016-02-02 17:17:23 -070010204TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010205 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010206 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010207
Tobin Ehlisf922ef82016-11-30 10:19:14 -070010208 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010209
Tony Barbour1fa09702017-03-16 12:09:08 -060010210 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010211 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010212 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010213 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10214 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010215
10216 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010217 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10218 ds_pool_ci.pNext = NULL;
10219 ds_pool_ci.maxSets = 1;
10220 ds_pool_ci.poolSizeCount = 1;
10221 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010222
Tobin Ehlis3b780662015-05-28 12:11:26 -060010223 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010224 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010225 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010226
Tony Barboureb254902015-07-15 12:50:33 -060010227 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010228 dsl_binding.binding = 0;
10229 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10230 dsl_binding.descriptorCount = 1;
10231 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10232 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010233
10234 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010235 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10236 ds_layout_ci.pNext = NULL;
10237 ds_layout_ci.bindingCount = 1;
10238 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010239
Tobin Ehlis3b780662015-05-28 12:11:26 -060010240 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010241 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010242 ASSERT_VK_SUCCESS(err);
10243
10244 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010245 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010246 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010247 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010248 alloc_info.descriptorPool = ds_pool;
10249 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010250 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010251 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010252
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010253 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
10254
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010255 // Correctly update descriptor to avoid "NOT_UPDATED" error
10256 VkDescriptorBufferInfo buff_info = {};
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010257 buff_info.buffer = buffer_test.GetBuffer();
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010258 buff_info.offset = 0;
10259 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010260
10261 VkWriteDescriptorSet descriptor_write;
10262 memset(&descriptor_write, 0, sizeof(descriptor_write));
10263 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010264 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010265 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010266 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010267 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10268 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010269
10270 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10271
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010272 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010273
Chia-I Wuf7458c52015-10-26 21:10:41 +080010274 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10275 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010276}
10277
Karl Schultz6addd812016-02-02 17:17:23 -070010278TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010279 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -070010280 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010281
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010282 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010283
Tony Barbour1fa09702017-03-16 12:09:08 -060010284 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010285 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010286 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010287 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10288 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010289
10290 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010291 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10292 ds_pool_ci.pNext = NULL;
10293 ds_pool_ci.maxSets = 1;
10294 ds_pool_ci.poolSizeCount = 1;
10295 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010296
Tobin Ehlis3b780662015-05-28 12:11:26 -060010297 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010298 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010299 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010300
Tony Barboureb254902015-07-15 12:50:33 -060010301 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010302 dsl_binding.binding = 0;
10303 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10304 dsl_binding.descriptorCount = 1;
10305 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10306 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010307
10308 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010309 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10310 ds_layout_ci.pNext = NULL;
10311 ds_layout_ci.bindingCount = 1;
10312 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010313 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010314 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010315 ASSERT_VK_SUCCESS(err);
10316
10317 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010318 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010319 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010320 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010321 alloc_info.descriptorPool = ds_pool;
10322 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010323 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010324 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010325
Tony Barboureb254902015-07-15 12:50:33 -060010326 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010327 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10328 sampler_ci.pNext = NULL;
10329 sampler_ci.magFilter = VK_FILTER_NEAREST;
10330 sampler_ci.minFilter = VK_FILTER_NEAREST;
10331 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10332 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10333 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10334 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10335 sampler_ci.mipLodBias = 1.0;
10336 sampler_ci.anisotropyEnable = VK_FALSE;
10337 sampler_ci.maxAnisotropy = 1;
10338 sampler_ci.compareEnable = VK_FALSE;
10339 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10340 sampler_ci.minLod = 1.0;
10341 sampler_ci.maxLod = 1.0;
10342 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10343 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010344
Tobin Ehlis3b780662015-05-28 12:11:26 -060010345 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010346 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010347 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010348
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010349 VkDescriptorImageInfo info = {};
10350 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010351
10352 VkWriteDescriptorSet descriptor_write;
10353 memset(&descriptor_write, 0, sizeof(descriptor_write));
10354 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010355 descriptor_write.dstSet = descriptorSet;
10356 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010357 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010358 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010359 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010360 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010361
10362 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10363
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010364 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010365
Chia-I Wuf7458c52015-10-26 21:10:41 +080010366 vkDestroySampler(m_device->device(), sampler, NULL);
10367 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10368 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010369}
10370
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010371TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
10372 // Create layout w/ empty binding and attempt to update it
10373 VkResult err;
10374
Tony Barbour1fa09702017-03-16 12:09:08 -060010375 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010376
10377 VkDescriptorPoolSize ds_type_count = {};
10378 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10379 ds_type_count.descriptorCount = 1;
10380
10381 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10382 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10383 ds_pool_ci.pNext = NULL;
10384 ds_pool_ci.maxSets = 1;
10385 ds_pool_ci.poolSizeCount = 1;
10386 ds_pool_ci.pPoolSizes = &ds_type_count;
10387
10388 VkDescriptorPool ds_pool;
10389 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10390 ASSERT_VK_SUCCESS(err);
10391
10392 VkDescriptorSetLayoutBinding dsl_binding = {};
10393 dsl_binding.binding = 0;
10394 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10395 dsl_binding.descriptorCount = 0;
10396 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10397 dsl_binding.pImmutableSamplers = NULL;
10398
10399 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10400 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10401 ds_layout_ci.pNext = NULL;
10402 ds_layout_ci.bindingCount = 1;
10403 ds_layout_ci.pBindings = &dsl_binding;
10404 VkDescriptorSetLayout ds_layout;
10405 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10406 ASSERT_VK_SUCCESS(err);
10407
10408 VkDescriptorSet descriptor_set;
10409 VkDescriptorSetAllocateInfo alloc_info = {};
10410 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10411 alloc_info.descriptorSetCount = 1;
10412 alloc_info.descriptorPool = ds_pool;
10413 alloc_info.pSetLayouts = &ds_layout;
10414 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10415 ASSERT_VK_SUCCESS(err);
10416
10417 VkSamplerCreateInfo sampler_ci = {};
10418 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10419 sampler_ci.magFilter = VK_FILTER_NEAREST;
10420 sampler_ci.minFilter = VK_FILTER_NEAREST;
10421 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10422 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10423 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10424 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10425 sampler_ci.mipLodBias = 1.0;
10426 sampler_ci.maxAnisotropy = 1;
10427 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10428 sampler_ci.minLod = 1.0;
10429 sampler_ci.maxLod = 1.0;
10430 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10431
10432 VkSampler sampler;
10433 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10434 ASSERT_VK_SUCCESS(err);
10435
10436 VkDescriptorImageInfo info = {};
10437 info.sampler = sampler;
10438
10439 VkWriteDescriptorSet descriptor_write;
10440 memset(&descriptor_write, 0, sizeof(descriptor_write));
10441 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10442 descriptor_write.dstSet = descriptor_set;
10443 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010444 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010445 // This is the wrong type, but empty binding error will be flagged first
10446 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10447 descriptor_write.pImageInfo = &info;
10448
10449 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
10450 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10451 m_errorMonitor->VerifyFound();
10452
10453 vkDestroySampler(m_device->device(), sampler, NULL);
10454 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10455 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10456}
10457
Karl Schultz6addd812016-02-02 17:17:23 -070010458TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10459 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10460 // types
10461 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010462
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010463 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, ".sType must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010464
Tony Barbour1fa09702017-03-16 12:09:08 -060010465 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010466
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010467 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010468 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10469 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010470
10471 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010472 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10473 ds_pool_ci.pNext = NULL;
10474 ds_pool_ci.maxSets = 1;
10475 ds_pool_ci.poolSizeCount = 1;
10476 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010477
Tobin Ehlis3b780662015-05-28 12:11:26 -060010478 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010479 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010480 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010481 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010482 dsl_binding.binding = 0;
10483 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10484 dsl_binding.descriptorCount = 1;
10485 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10486 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010487
Tony Barboureb254902015-07-15 12:50:33 -060010488 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010489 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10490 ds_layout_ci.pNext = NULL;
10491 ds_layout_ci.bindingCount = 1;
10492 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010493
Tobin Ehlis3b780662015-05-28 12:11:26 -060010494 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010495 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010496 ASSERT_VK_SUCCESS(err);
10497
10498 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010499 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010500 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010501 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010502 alloc_info.descriptorPool = ds_pool;
10503 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010504 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010505 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010506
Tony Barboureb254902015-07-15 12:50:33 -060010507 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010508 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10509 sampler_ci.pNext = NULL;
10510 sampler_ci.magFilter = VK_FILTER_NEAREST;
10511 sampler_ci.minFilter = VK_FILTER_NEAREST;
10512 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10513 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10514 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10515 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10516 sampler_ci.mipLodBias = 1.0;
10517 sampler_ci.anisotropyEnable = VK_FALSE;
10518 sampler_ci.maxAnisotropy = 1;
10519 sampler_ci.compareEnable = VK_FALSE;
10520 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10521 sampler_ci.minLod = 1.0;
10522 sampler_ci.maxLod = 1.0;
10523 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10524 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010525 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010526 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010527 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010528
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010529 VkDescriptorImageInfo info = {};
10530 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010531
10532 VkWriteDescriptorSet descriptor_write;
10533 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010534 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010535 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010536 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010537 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010538 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010539 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010540
10541 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10542
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010543 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010544
Chia-I Wuf7458c52015-10-26 21:10:41 +080010545 vkDestroySampler(m_device->device(), sampler, NULL);
10546 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10547 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010548}
10549
Karl Schultz6addd812016-02-02 17:17:23 -070010550TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010551 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010552 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010553
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010554 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010555
Tony Barbour1fa09702017-03-16 12:09:08 -060010556 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010557 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10558 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010559 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010560 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10561 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010562
10563 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010564 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10565 ds_pool_ci.pNext = NULL;
10566 ds_pool_ci.maxSets = 1;
10567 ds_pool_ci.poolSizeCount = 1;
10568 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010569
10570 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010571 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010572 ASSERT_VK_SUCCESS(err);
10573
10574 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010575 dsl_binding.binding = 0;
10576 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10577 dsl_binding.descriptorCount = 1;
10578 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10579 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010580
10581 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010582 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10583 ds_layout_ci.pNext = NULL;
10584 ds_layout_ci.bindingCount = 1;
10585 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010586 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010587 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010588 ASSERT_VK_SUCCESS(err);
10589
10590 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010591 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010592 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010593 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010594 alloc_info.descriptorPool = ds_pool;
10595 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010596 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010597 ASSERT_VK_SUCCESS(err);
10598
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010599 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010600
10601 VkDescriptorImageInfo descriptor_info;
10602 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10603 descriptor_info.sampler = sampler;
10604
10605 VkWriteDescriptorSet descriptor_write;
10606 memset(&descriptor_write, 0, sizeof(descriptor_write));
10607 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010608 descriptor_write.dstSet = descriptorSet;
10609 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010610 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010611 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10612 descriptor_write.pImageInfo = &descriptor_info;
10613
10614 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10615
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010616 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010617
Chia-I Wuf7458c52015-10-26 21:10:41 +080010618 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10619 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010620}
10621
Karl Schultz6addd812016-02-02 17:17:23 -070010622TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10623 // Create a single combined Image/Sampler descriptor and send it an invalid
10624 // imageView
10625 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010626
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010627 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010628
Tony Barbour1fa09702017-03-16 12:09:08 -060010629 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010630 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010631 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10632 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010633
10634 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010635 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10636 ds_pool_ci.pNext = NULL;
10637 ds_pool_ci.maxSets = 1;
10638 ds_pool_ci.poolSizeCount = 1;
10639 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010640
10641 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010642 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010643 ASSERT_VK_SUCCESS(err);
10644
10645 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010646 dsl_binding.binding = 0;
10647 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10648 dsl_binding.descriptorCount = 1;
10649 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10650 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010651
10652 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010653 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10654 ds_layout_ci.pNext = NULL;
10655 ds_layout_ci.bindingCount = 1;
10656 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010657 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010658 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010659 ASSERT_VK_SUCCESS(err);
10660
10661 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010662 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010663 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010664 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010665 alloc_info.descriptorPool = ds_pool;
10666 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010667 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010668 ASSERT_VK_SUCCESS(err);
10669
10670 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010671 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10672 sampler_ci.pNext = NULL;
10673 sampler_ci.magFilter = VK_FILTER_NEAREST;
10674 sampler_ci.minFilter = VK_FILTER_NEAREST;
10675 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10676 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10677 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10678 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10679 sampler_ci.mipLodBias = 1.0;
10680 sampler_ci.anisotropyEnable = VK_FALSE;
10681 sampler_ci.maxAnisotropy = 1;
10682 sampler_ci.compareEnable = VK_FALSE;
10683 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10684 sampler_ci.minLod = 1.0;
10685 sampler_ci.maxLod = 1.0;
10686 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10687 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010688
10689 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010690 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010691 ASSERT_VK_SUCCESS(err);
10692
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010693 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010694
10695 VkDescriptorImageInfo descriptor_info;
10696 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10697 descriptor_info.sampler = sampler;
10698 descriptor_info.imageView = view;
10699
10700 VkWriteDescriptorSet descriptor_write;
10701 memset(&descriptor_write, 0, sizeof(descriptor_write));
10702 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010703 descriptor_write.dstSet = descriptorSet;
10704 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010705 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010706 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10707 descriptor_write.pImageInfo = &descriptor_info;
10708
10709 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10710
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010711 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010712
Chia-I Wuf7458c52015-10-26 21:10:41 +080010713 vkDestroySampler(m_device->device(), sampler, NULL);
10714 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10715 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010716}
10717
Karl Schultz6addd812016-02-02 17:17:23 -070010718TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10719 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10720 // into the other
10721 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010722
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10724 " binding #1 with type "
10725 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10726 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010727
Tony Barbour1fa09702017-03-16 12:09:08 -060010728 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010729 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010730 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010731 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10732 ds_type_count[0].descriptorCount = 1;
10733 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10734 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010735
10736 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010737 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10738 ds_pool_ci.pNext = NULL;
10739 ds_pool_ci.maxSets = 1;
10740 ds_pool_ci.poolSizeCount = 2;
10741 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010742
10743 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010744 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010745 ASSERT_VK_SUCCESS(err);
10746 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010747 dsl_binding[0].binding = 0;
10748 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10749 dsl_binding[0].descriptorCount = 1;
10750 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10751 dsl_binding[0].pImmutableSamplers = NULL;
10752 dsl_binding[1].binding = 1;
10753 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10754 dsl_binding[1].descriptorCount = 1;
10755 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10756 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010757
10758 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010759 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10760 ds_layout_ci.pNext = NULL;
10761 ds_layout_ci.bindingCount = 2;
10762 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010763
10764 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010765 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010766 ASSERT_VK_SUCCESS(err);
10767
10768 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010769 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010770 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010771 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010772 alloc_info.descriptorPool = ds_pool;
10773 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010774 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010775 ASSERT_VK_SUCCESS(err);
10776
10777 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010778 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10779 sampler_ci.pNext = NULL;
10780 sampler_ci.magFilter = VK_FILTER_NEAREST;
10781 sampler_ci.minFilter = VK_FILTER_NEAREST;
10782 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10783 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10784 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10785 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10786 sampler_ci.mipLodBias = 1.0;
10787 sampler_ci.anisotropyEnable = VK_FALSE;
10788 sampler_ci.maxAnisotropy = 1;
10789 sampler_ci.compareEnable = VK_FALSE;
10790 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10791 sampler_ci.minLod = 1.0;
10792 sampler_ci.maxLod = 1.0;
10793 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10794 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010795
10796 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010797 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010798 ASSERT_VK_SUCCESS(err);
10799
10800 VkDescriptorImageInfo info = {};
10801 info.sampler = sampler;
10802
10803 VkWriteDescriptorSet descriptor_write;
10804 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
10805 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010806 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010807 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080010808 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010809 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10810 descriptor_write.pImageInfo = &info;
10811 // This write update should succeed
10812 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10813 // Now perform a copy update that fails due to type mismatch
10814 VkCopyDescriptorSet copy_ds_update;
10815 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10816 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10817 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010818 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010819 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010820 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
10821 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010822 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10823
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010824 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010825 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010826 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -060010827 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10828 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10829 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010830 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010831 copy_ds_update.dstSet = descriptorSet;
10832 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010833 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010834 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10835
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010836 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010837
Tobin Ehlis04356f92015-10-27 16:35:27 -060010838 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010839 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10840 " binding#1 with offset index of 1 plus "
10841 "update array offset of 0 and update of "
10842 "5 descriptors oversteps total number "
10843 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010844
Tobin Ehlis04356f92015-10-27 16:35:27 -060010845 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10846 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10847 copy_ds_update.srcSet = descriptorSet;
10848 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010849 copy_ds_update.dstSet = descriptorSet;
10850 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010851 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060010852 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10853
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010854 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010855
Chia-I Wuf7458c52015-10-26 21:10:41 +080010856 vkDestroySampler(m_device->device(), sampler, NULL);
10857 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10858 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010859}
10860
Karl Schultz6addd812016-02-02 17:17:23 -070010861TEST_F(VkLayerTest, NumSamplesMismatch) {
10862 // Create CommandBuffer where MSAA samples doesn't match RenderPass
10863 // sampleCount
10864 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010865
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010866 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010867
Tony Barbour1fa09702017-03-16 12:09:08 -060010868 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010869 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010870 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060010871 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010872 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010873
10874 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010875 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10876 ds_pool_ci.pNext = NULL;
10877 ds_pool_ci.maxSets = 1;
10878 ds_pool_ci.poolSizeCount = 1;
10879 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010880
Tobin Ehlis3b780662015-05-28 12:11:26 -060010881 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010882 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010883 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010884
Tony Barboureb254902015-07-15 12:50:33 -060010885 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080010886 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060010887 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080010888 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010889 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10890 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010891
Tony Barboureb254902015-07-15 12:50:33 -060010892 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10893 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10894 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010895 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070010896 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010897
Tobin Ehlis3b780662015-05-28 12:11:26 -060010898 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010899 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010900 ASSERT_VK_SUCCESS(err);
10901
10902 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010903 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010904 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010905 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010906 alloc_info.descriptorPool = ds_pool;
10907 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010908 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010909 ASSERT_VK_SUCCESS(err);
10910
Tony Barboureb254902015-07-15 12:50:33 -060010911 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010912 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010913 pipe_ms_state_ci.pNext = NULL;
10914 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10915 pipe_ms_state_ci.sampleShadingEnable = 0;
10916 pipe_ms_state_ci.minSampleShading = 1.0;
10917 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010918
Tony Barboureb254902015-07-15 12:50:33 -060010919 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010920 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10921 pipeline_layout_ci.pNext = NULL;
10922 pipeline_layout_ci.setLayoutCount = 1;
10923 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010924
10925 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010926 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010927 ASSERT_VK_SUCCESS(err);
10928
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010929 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010930 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010931 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010932 VkPipelineObj pipe(m_device);
10933 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010934 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010935 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010936 pipe.SetMSAA(&pipe_ms_state_ci);
10937 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010938
Tony Barbour552f6c02016-12-21 14:34:07 -070010939 m_commandBuffer->BeginCommandBuffer();
10940 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010941 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010942
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070010943 VkViewport viewport = {0, 0, 16, 16, 0, 1};
10944 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
10945 VkRect2D scissor = {{0, 0}, {16, 16}};
10946 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
10947
Mark Young29927482016-05-04 14:38:51 -060010948 // Render triangle (the error should trigger on the attempt to draw).
10949 Draw(3, 1, 0, 0);
10950
10951 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070010952 m_commandBuffer->EndRenderPass();
10953 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060010954
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010955 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010956
Chia-I Wuf7458c52015-10-26 21:10:41 +080010957 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10958 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10959 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010960}
Mark Young29927482016-05-04 14:38:51 -060010961
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010962TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010963 TEST_DESCRIPTION(
10964 "Hit RenderPass incompatible cases. "
10965 "Initial case is drawing with an active renderpass that's "
10966 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010967 VkResult err;
10968
Tony Barbour1fa09702017-03-16 12:09:08 -060010969 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010970 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10971
10972 VkDescriptorSetLayoutBinding dsl_binding = {};
10973 dsl_binding.binding = 0;
10974 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10975 dsl_binding.descriptorCount = 1;
10976 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10977 dsl_binding.pImmutableSamplers = NULL;
10978
10979 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10980 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10981 ds_layout_ci.pNext = NULL;
10982 ds_layout_ci.bindingCount = 1;
10983 ds_layout_ci.pBindings = &dsl_binding;
10984
10985 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010986 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010987 ASSERT_VK_SUCCESS(err);
10988
10989 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10990 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10991 pipeline_layout_ci.pNext = NULL;
10992 pipeline_layout_ci.setLayoutCount = 1;
10993 pipeline_layout_ci.pSetLayouts = &ds_layout;
10994
10995 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010996 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010997 ASSERT_VK_SUCCESS(err);
10998
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010999 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011000 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011001 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011002 // Create a renderpass that will be incompatible with default renderpass
11003 VkAttachmentReference attach = {};
11004 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11005 VkAttachmentReference color_att = {};
11006 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11007 VkSubpassDescription subpass = {};
11008 subpass.inputAttachmentCount = 1;
11009 subpass.pInputAttachments = &attach;
11010 subpass.colorAttachmentCount = 1;
11011 subpass.pColorAttachments = &color_att;
11012 VkRenderPassCreateInfo rpci = {};
11013 rpci.subpassCount = 1;
11014 rpci.pSubpasses = &subpass;
11015 rpci.attachmentCount = 1;
11016 VkAttachmentDescription attach_desc = {};
11017 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011018 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11019 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011020 rpci.pAttachments = &attach_desc;
11021 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11022 VkRenderPass rp;
11023 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11024 VkPipelineObj pipe(m_device);
11025 pipe.AddShader(&vs);
11026 pipe.AddShader(&fs);
11027 pipe.AddColorAttachment();
11028 VkViewport view_port = {};
11029 m_viewports.push_back(view_port);
11030 pipe.SetViewport(m_viewports);
11031 VkRect2D rect = {};
11032 m_scissors.push_back(rect);
11033 pipe.SetScissor(m_scissors);
11034 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11035
11036 VkCommandBufferInheritanceInfo cbii = {};
11037 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11038 cbii.renderPass = rp;
11039 cbii.subpass = 0;
11040 VkCommandBufferBeginInfo cbbi = {};
11041 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11042 cbbi.pInheritanceInfo = &cbii;
11043 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11044 VkRenderPassBeginInfo rpbi = {};
11045 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11046 rpbi.framebuffer = m_framebuffer;
11047 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011048 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
11049 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011050
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011051 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011052 // Render triangle (the error should trigger on the attempt to draw).
11053 Draw(3, 1, 0, 0);
11054
11055 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011056 m_commandBuffer->EndRenderPass();
11057 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011058
11059 m_errorMonitor->VerifyFound();
11060
11061 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11062 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11063 vkDestroyRenderPass(m_device->device(), rp, NULL);
11064}
11065
Mark Youngc89c6312016-03-31 16:03:20 -060011066TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11067 // Create Pipeline where the number of blend attachments doesn't match the
11068 // number of color attachments. In this case, we don't add any color
11069 // blend attachments even though we have a color attachment.
11070 VkResult err;
11071
Tobin Ehlis974c0d92017-02-01 13:31:22 -070011072 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060011073
Tony Barbour1fa09702017-03-16 12:09:08 -060011074 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc89c6312016-03-31 16:03:20 -060011075 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11076 VkDescriptorPoolSize ds_type_count = {};
11077 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11078 ds_type_count.descriptorCount = 1;
11079
11080 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11081 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11082 ds_pool_ci.pNext = NULL;
11083 ds_pool_ci.maxSets = 1;
11084 ds_pool_ci.poolSizeCount = 1;
11085 ds_pool_ci.pPoolSizes = &ds_type_count;
11086
11087 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011088 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060011089 ASSERT_VK_SUCCESS(err);
11090
11091 VkDescriptorSetLayoutBinding dsl_binding = {};
11092 dsl_binding.binding = 0;
11093 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11094 dsl_binding.descriptorCount = 1;
11095 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11096 dsl_binding.pImmutableSamplers = NULL;
11097
11098 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11099 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11100 ds_layout_ci.pNext = NULL;
11101 ds_layout_ci.bindingCount = 1;
11102 ds_layout_ci.pBindings = &dsl_binding;
11103
11104 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011105 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011106 ASSERT_VK_SUCCESS(err);
11107
11108 VkDescriptorSet descriptorSet;
11109 VkDescriptorSetAllocateInfo alloc_info = {};
11110 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11111 alloc_info.descriptorSetCount = 1;
11112 alloc_info.descriptorPool = ds_pool;
11113 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011114 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060011115 ASSERT_VK_SUCCESS(err);
11116
11117 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011118 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060011119 pipe_ms_state_ci.pNext = NULL;
11120 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11121 pipe_ms_state_ci.sampleShadingEnable = 0;
11122 pipe_ms_state_ci.minSampleShading = 1.0;
11123 pipe_ms_state_ci.pSampleMask = NULL;
11124
11125 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11126 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11127 pipeline_layout_ci.pNext = NULL;
11128 pipeline_layout_ci.setLayoutCount = 1;
11129 pipeline_layout_ci.pSetLayouts = &ds_layout;
11130
11131 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011132 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011133 ASSERT_VK_SUCCESS(err);
11134
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011135 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011136 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011137 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060011138 VkPipelineObj pipe(m_device);
11139 pipe.AddShader(&vs);
11140 pipe.AddShader(&fs);
11141 pipe.SetMSAA(&pipe_ms_state_ci);
11142 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011143 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011144
11145 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11146 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11147 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11148}
Mark Young29927482016-05-04 14:38:51 -060011149
Mark Muellerd4914412016-06-13 17:52:06 -060011150TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011151 TEST_DESCRIPTION(
11152 "Points to a wrong colorAttachment index in a VkClearAttachment "
11153 "structure passed to vkCmdClearAttachments");
Tony Barbour1fa09702017-03-16 12:09:08 -060011154 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011155 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060011156
11157 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11158 m_errorMonitor->VerifyFound();
11159}
11160
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011161TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011162 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
11163 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011164
Tony Barbour1fa09702017-03-16 12:09:08 -060011165 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011166 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011167
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011168 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011169 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11170 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011171
11172 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011173 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11174 ds_pool_ci.pNext = NULL;
11175 ds_pool_ci.maxSets = 1;
11176 ds_pool_ci.poolSizeCount = 1;
11177 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011178
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011179 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011180 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011181 ASSERT_VK_SUCCESS(err);
11182
Tony Barboureb254902015-07-15 12:50:33 -060011183 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011184 dsl_binding.binding = 0;
11185 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11186 dsl_binding.descriptorCount = 1;
11187 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11188 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011189
Tony Barboureb254902015-07-15 12:50:33 -060011190 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011191 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11192 ds_layout_ci.pNext = NULL;
11193 ds_layout_ci.bindingCount = 1;
11194 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011195
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011196 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011197 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011198 ASSERT_VK_SUCCESS(err);
11199
11200 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011201 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011202 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011203 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011204 alloc_info.descriptorPool = ds_pool;
11205 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011206 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011207 ASSERT_VK_SUCCESS(err);
11208
Tony Barboureb254902015-07-15 12:50:33 -060011209 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011210 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011211 pipe_ms_state_ci.pNext = NULL;
11212 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11213 pipe_ms_state_ci.sampleShadingEnable = 0;
11214 pipe_ms_state_ci.minSampleShading = 1.0;
11215 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011216
Tony Barboureb254902015-07-15 12:50:33 -060011217 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011218 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11219 pipeline_layout_ci.pNext = NULL;
11220 pipeline_layout_ci.setLayoutCount = 1;
11221 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011222
11223 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011224 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011225 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011226
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011227 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011228 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011229 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011230 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011231
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011232 VkPipelineObj pipe(m_device);
11233 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011234 pipe.AddShader(&fs);
Jeremy Hayes7332f342017-03-09 15:54:12 -070011235 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011236 pipe.SetMSAA(&pipe_ms_state_ci);
11237 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011238
Tony Barbour552f6c02016-12-21 14:34:07 -070011239 m_commandBuffer->BeginCommandBuffer();
11240 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011241
Karl Schultz6addd812016-02-02 17:17:23 -070011242 // Main thing we care about for this test is that the VkImage obj we're
11243 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011244 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011245 VkClearAttachment color_attachment;
11246 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11247 color_attachment.clearValue.color.float32[0] = 1.0;
11248 color_attachment.clearValue.color.float32[1] = 1.0;
11249 color_attachment.clearValue.color.float32[2] = 1.0;
11250 color_attachment.clearValue.color.float32[3] = 1.0;
11251 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011252 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011253
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011254 // Call for full-sized FB Color attachment prior to issuing a Draw
11255 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070011256 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011257 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011258 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011259
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011260 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
11261 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
11262 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
11263 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
11264 m_errorMonitor->VerifyFound();
11265
11266 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
11267 clear_rect.layerCount = 2;
11268 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
11269 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011270 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011271
Chia-I Wuf7458c52015-10-26 21:10:41 +080011272 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11273 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11274 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011275}
11276
Karl Schultz6addd812016-02-02 17:17:23 -070011277TEST_F(VkLayerTest, VtxBufferBadIndex) {
11278 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011279
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011280 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11281 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011282
Tony Barbour1fa09702017-03-16 12:09:08 -060011283 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011284 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011285 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011286
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011287 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011288 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11289 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011290
11291 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011292 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11293 ds_pool_ci.pNext = NULL;
11294 ds_pool_ci.maxSets = 1;
11295 ds_pool_ci.poolSizeCount = 1;
11296 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011297
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011298 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011299 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011300 ASSERT_VK_SUCCESS(err);
11301
Tony Barboureb254902015-07-15 12:50:33 -060011302 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011303 dsl_binding.binding = 0;
11304 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11305 dsl_binding.descriptorCount = 1;
11306 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11307 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011308
Tony Barboureb254902015-07-15 12:50:33 -060011309 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011310 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11311 ds_layout_ci.pNext = NULL;
11312 ds_layout_ci.bindingCount = 1;
11313 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011314
Tobin Ehlis502480b2015-06-24 15:53:07 -060011315 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011316 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011317 ASSERT_VK_SUCCESS(err);
11318
11319 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011320 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011321 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011322 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011323 alloc_info.descriptorPool = ds_pool;
11324 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011325 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011326 ASSERT_VK_SUCCESS(err);
11327
Tony Barboureb254902015-07-15 12:50:33 -060011328 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011329 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011330 pipe_ms_state_ci.pNext = NULL;
11331 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11332 pipe_ms_state_ci.sampleShadingEnable = 0;
11333 pipe_ms_state_ci.minSampleShading = 1.0;
11334 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011335
Tony Barboureb254902015-07-15 12:50:33 -060011336 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011337 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11338 pipeline_layout_ci.pNext = NULL;
11339 pipeline_layout_ci.setLayoutCount = 1;
11340 pipeline_layout_ci.pSetLayouts = &ds_layout;
11341 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011342
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011343 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011344 ASSERT_VK_SUCCESS(err);
11345
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011346 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011347 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011348 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011349 VkPipelineObj pipe(m_device);
11350 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011351 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011352 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011353 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011354 pipe.SetViewport(m_viewports);
11355 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011356 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011357
Tony Barbour552f6c02016-12-21 14:34:07 -070011358 m_commandBuffer->BeginCommandBuffer();
11359 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011360 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011361 // Don't care about actual data, just need to get to draw to flag error
11362 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011363 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011364 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011365 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011366
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011367 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011368
Chia-I Wuf7458c52015-10-26 21:10:41 +080011369 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11370 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11371 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011372}
Mark Muellerdfe37552016-07-07 14:47:42 -060011373
Mark Mueller2ee294f2016-08-04 12:59:48 -060011374TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011375 TEST_DESCRIPTION(
11376 "Use an invalid count in a vkEnumeratePhysicalDevices call."
11377 "Use invalid Queue Family Index in vkCreateDevice");
Tony Barbour1fa09702017-03-16 12:09:08 -060011378 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011379
Mark Mueller880fce52016-08-17 15:23:23 -060011380 // The following test fails with recent NVidia drivers.
11381 // By the time core_validation is reached, the NVidia
11382 // driver has sanitized the invalid condition and core_validation
11383 // is not introduced to the failure condition. This is not the case
11384 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011385 // uint32_t count = static_cast<uint32_t>(~0);
11386 // VkPhysicalDevice physical_device;
11387 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
11388 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011389
Mark Mueller2ee294f2016-08-04 12:59:48 -060011390 float queue_priority = 0.0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011391 VkDeviceQueueCreateInfo queue_create_info = {};
11392 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11393 queue_create_info.queueCount = 1;
11394 queue_create_info.pQueuePriorities = &queue_priority;
11395 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
11396
11397 VkPhysicalDeviceFeatures features = m_device->phy().features();
11398 VkDevice testDevice;
11399 VkDeviceCreateInfo device_create_info = {};
11400 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11401 device_create_info.queueCreateInfoCount = 1;
11402 device_create_info.pQueueCreateInfos = &queue_create_info;
11403 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011404
11405 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11406 "Invalid queue create request in vkCreateDevice(). Invalid queueFamilyIndex ");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011407 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms that do
11408 // not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11409 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011410 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11411 m_errorMonitor->VerifyFound();
11412
11413 queue_create_info.queueFamilyIndex = 1;
11414
11415 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
11416 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
11417 for (unsigned i = 0; i < feature_count; i++) {
11418 if (VK_FALSE == feature_array[i]) {
11419 feature_array[i] = VK_TRUE;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011420 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011421 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11422 "While calling vkCreateDevice(), requesting feature #");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011423 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms
11424 // that do not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11425 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11427 "You requested features that are unavailable on this device. You should first "
11428 "query feature availability by calling vkGetPhysicalDeviceFeatures().");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011429 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11430 m_errorMonitor->VerifyFound();
11431 break;
11432 }
11433 }
11434}
11435
Tobin Ehlis16edf082016-11-21 12:33:49 -070011436TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
11437 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
11438
Tony Barbour1fa09702017-03-16 12:09:08 -060011439 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis16edf082016-11-21 12:33:49 -070011440
11441 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
11442 std::vector<VkDeviceQueueCreateInfo> queue_info;
11443 queue_info.reserve(queue_props.size());
11444 std::vector<std::vector<float>> queue_priorities;
11445 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
11446 VkDeviceQueueCreateInfo qi{};
11447 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11448 qi.queueFamilyIndex = i;
11449 qi.queueCount = queue_props[i].queueCount;
11450 queue_priorities.emplace_back(qi.queueCount, 0.0f);
11451 qi.pQueuePriorities = queue_priorities[i].data();
11452 queue_info.push_back(qi);
11453 }
11454
11455 std::vector<const char *> device_extension_names;
11456
11457 VkDevice local_device;
11458 VkDeviceCreateInfo device_create_info = {};
11459 auto features = m_device->phy().features();
11460 // Intentionally disable pipeline stats
11461 features.pipelineStatisticsQuery = VK_FALSE;
11462 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11463 device_create_info.pNext = NULL;
11464 device_create_info.queueCreateInfoCount = queue_info.size();
11465 device_create_info.pQueueCreateInfos = queue_info.data();
11466 device_create_info.enabledLayerCount = 0;
11467 device_create_info.ppEnabledLayerNames = NULL;
11468 device_create_info.pEnabledFeatures = &features;
11469 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
11470 ASSERT_VK_SUCCESS(err);
11471
11472 VkQueryPoolCreateInfo qpci{};
11473 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11474 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
11475 qpci.queryCount = 1;
11476 VkQueryPool query_pool;
11477
11478 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
11479 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
11480 m_errorMonitor->VerifyFound();
11481
11482 vkDestroyDevice(local_device, nullptr);
11483}
11484
Mark Mueller2ee294f2016-08-04 12:59:48 -060011485TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011486 TEST_DESCRIPTION(
11487 "Use an invalid queue index in a vkCmdWaitEvents call."
11488 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011489
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011490 const char *invalid_queue_index =
11491 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
11492 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
11493 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011494
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011495 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011496
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011497 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011498
Tony Barbour1fa09702017-03-16 12:09:08 -060011499 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011500
11501 VkEvent event;
11502 VkEventCreateInfo event_create_info{};
11503 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11504 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11505
Mark Mueller2ee294f2016-08-04 12:59:48 -060011506 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011507 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011508
Tony Barbour552f6c02016-12-21 14:34:07 -070011509 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011510
11511 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011512 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011513 ASSERT_TRUE(image.initialized());
11514 VkImageMemoryBarrier img_barrier = {};
11515 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11516 img_barrier.pNext = NULL;
11517 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
11518 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
11519 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11520 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11521 img_barrier.image = image.handle();
11522 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060011523
11524 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
11525 // that layer validation catches the case when it is not.
11526 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011527 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11528 img_barrier.subresourceRange.baseArrayLayer = 0;
11529 img_barrier.subresourceRange.baseMipLevel = 0;
11530 img_barrier.subresourceRange.layerCount = 1;
11531 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011532 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
11533 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011534 m_errorMonitor->VerifyFound();
11535
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011536 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011537
11538 VkQueryPool query_pool;
11539 VkQueryPoolCreateInfo query_pool_create_info = {};
11540 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11541 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
11542 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011543 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011544
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011545 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011546 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
11547
11548 vkEndCommandBuffer(m_commandBuffer->handle());
11549 m_errorMonitor->VerifyFound();
11550
11551 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
11552 vkDestroyEvent(m_device->device(), event, nullptr);
11553}
11554
Mark Muellerdfe37552016-07-07 14:47:42 -060011555TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011556 TEST_DESCRIPTION(
11557 "Submit a command buffer using deleted vertex buffer, "
11558 "delete a buffer twice, use an invalid offset for each "
11559 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060011560
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011561 const char *deleted_buffer_in_command_buffer =
11562 "Cannot submit cmd buffer "
11563 "using deleted buffer ";
11564 const char *invalid_offset_message =
11565 "vkBindBufferMemory(): "
11566 "memoryOffset is 0x";
11567 const char *invalid_storage_buffer_offset_message =
11568 "vkBindBufferMemory(): "
11569 "storage memoryOffset "
11570 "is 0x";
11571 const char *invalid_texel_buffer_offset_message =
11572 "vkBindBufferMemory(): "
11573 "texel memoryOffset "
11574 "is 0x";
11575 const char *invalid_uniform_buffer_offset_message =
11576 "vkBindBufferMemory(): "
11577 "uniform memoryOffset "
11578 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060011579
Tony Barbour1fa09702017-03-16 12:09:08 -060011580 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerdfe37552016-07-07 14:47:42 -060011581 ASSERT_NO_FATAL_FAILURE(InitViewport());
11582 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11583
11584 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011585 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060011586 pipe_ms_state_ci.pNext = NULL;
11587 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11588 pipe_ms_state_ci.sampleShadingEnable = 0;
11589 pipe_ms_state_ci.minSampleShading = 1.0;
11590 pipe_ms_state_ci.pSampleMask = nullptr;
11591
11592 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11593 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11594 VkPipelineLayout pipeline_layout;
11595
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011596 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060011597 ASSERT_VK_SUCCESS(err);
11598
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011599 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11600 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060011601 VkPipelineObj pipe(m_device);
11602 pipe.AddShader(&vs);
11603 pipe.AddShader(&fs);
11604 pipe.AddColorAttachment();
11605 pipe.SetMSAA(&pipe_ms_state_ci);
11606 pipe.SetViewport(m_viewports);
11607 pipe.SetScissor(m_scissors);
11608 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11609
Tony Barbour552f6c02016-12-21 14:34:07 -070011610 m_commandBuffer->BeginCommandBuffer();
11611 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011612 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060011613
11614 {
11615 // Create and bind a vertex buffer in a reduced scope, which will cause
11616 // it to be deleted upon leaving this scope
11617 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011618 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060011619 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11620 draw_verticies.AddVertexInputToPipe(pipe);
11621 }
11622
11623 Draw(1, 0, 0, 0);
11624
Tony Barbour552f6c02016-12-21 14:34:07 -070011625 m_commandBuffer->EndRenderPass();
11626 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060011627
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011628 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060011629 QueueCommandBuffer(false);
11630 m_errorMonitor->VerifyFound();
11631
11632 {
11633 // Create and bind a vertex buffer in a reduced scope, and delete it
11634 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011635 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011636 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060011637 buffer_test.TestDoubleDestroy();
11638 }
11639 m_errorMonitor->VerifyFound();
11640
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011641 m_errorMonitor->SetUnexpectedError("value of pCreateInfo->usage must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011642 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011643 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011644 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011645 m_errorMonitor->SetUnexpectedError(
11646 "If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, "
11647 "memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011648 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
11649 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011650 m_errorMonitor->VerifyFound();
11651 }
11652
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011653 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
11654 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011655 // Create and bind a memory buffer with an invalid offset again,
11656 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011657 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011658 m_errorMonitor->SetUnexpectedError(
11659 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11660 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011661 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11662 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011663 m_errorMonitor->VerifyFound();
11664 }
11665
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011666 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011667 // Create and bind a memory buffer with an invalid offset again, but
11668 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011669 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011670 m_errorMonitor->SetUnexpectedError(
11671 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11672 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011673 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11674 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011675 m_errorMonitor->VerifyFound();
11676 }
11677
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011678 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011679 // Create and bind a memory buffer with an invalid offset again, but
11680 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011681 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011682 m_errorMonitor->SetUnexpectedError(
11683 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11684 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011685 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11686 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011687 m_errorMonitor->VerifyFound();
11688 }
11689
11690 {
11691 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011692 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011693 m_errorMonitor->SetUnexpectedError("required parameter memory specified as VK_NULL_HANDLE");
11694 m_errorMonitor->SetUnexpectedError("memory must be a valid VkDeviceMemory handle");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011695 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
11696 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011697 m_errorMonitor->VerifyFound();
11698 }
11699
11700 {
11701 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011702 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011703 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
11704 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011705 }
11706 m_errorMonitor->VerifyFound();
11707
11708 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11709}
11710
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011711// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11712TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011713 TEST_DESCRIPTION(
11714 "Hit all possible validation checks associated with the "
11715 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11716 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011717 // 3 in ValidateCmdBufImageLayouts
11718 // * -1 Attempt to submit cmd buf w/ deleted image
11719 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11720 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011721
Tony Barbour1fa09702017-03-16 12:09:08 -060011722 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070011723 auto depth_format = find_depth_stencil_format(m_device);
11724 if (!depth_format) {
11725 printf(" No Depth + Stencil format found. Skipped.\n");
11726 return;
11727 }
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011728 // Create src & dst images to use for copy operations
11729 VkImage src_image;
11730 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080011731 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011732
11733 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11734 const int32_t tex_width = 32;
11735 const int32_t tex_height = 32;
11736
11737 VkImageCreateInfo image_create_info = {};
11738 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11739 image_create_info.pNext = NULL;
11740 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11741 image_create_info.format = tex_format;
11742 image_create_info.extent.width = tex_width;
11743 image_create_info.extent.height = tex_height;
11744 image_create_info.extent.depth = 1;
11745 image_create_info.mipLevels = 1;
11746 image_create_info.arrayLayers = 4;
11747 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11748 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11749 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080011750 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011751 image_create_info.flags = 0;
11752
11753 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11754 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011755 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011756 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11757 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011758 image_create_info.format = VK_FORMAT_D32_SFLOAT;
11759 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
11760 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
11761 ASSERT_VK_SUCCESS(err);
11762
11763 // Allocate memory
11764 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080011765 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080011766 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080011767 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11768 mem_alloc.pNext = NULL;
11769 mem_alloc.allocationSize = 0;
11770 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080011771
11772 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011773 mem_alloc.allocationSize = img_mem_reqs.size;
11774 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011775 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080011776 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080011777 ASSERT_VK_SUCCESS(err);
11778
11779 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011780 mem_alloc.allocationSize = img_mem_reqs.size;
11781 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011782 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011783 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080011784 ASSERT_VK_SUCCESS(err);
11785
11786 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011787 mem_alloc.allocationSize = img_mem_reqs.size;
11788 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011789 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011790 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080011791 ASSERT_VK_SUCCESS(err);
11792
11793 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
11794 ASSERT_VK_SUCCESS(err);
11795 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
11796 ASSERT_VK_SUCCESS(err);
11797 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
11798 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011799
Tony Barbour552f6c02016-12-21 14:34:07 -070011800 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080011801 VkImageCopy copy_region;
11802 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11803 copy_region.srcSubresource.mipLevel = 0;
11804 copy_region.srcSubresource.baseArrayLayer = 0;
11805 copy_region.srcSubresource.layerCount = 1;
11806 copy_region.srcOffset.x = 0;
11807 copy_region.srcOffset.y = 0;
11808 copy_region.srcOffset.z = 0;
11809 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11810 copy_region.dstSubresource.mipLevel = 0;
11811 copy_region.dstSubresource.baseArrayLayer = 0;
11812 copy_region.dstSubresource.layerCount = 1;
11813 copy_region.dstOffset.x = 0;
11814 copy_region.dstOffset.y = 0;
11815 copy_region.dstOffset.z = 0;
11816 copy_region.extent.width = 1;
11817 copy_region.extent.height = 1;
11818 copy_region.extent.depth = 1;
11819
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011820 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11821 "layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11822 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011823
Cort530cf382016-12-08 09:59:47 -080011824 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011825 m_errorMonitor->VerifyFound();
Tobin Ehlise35b66a2017-03-15 12:18:31 -060011826 // The first call hits the expected WARNING and skips the call down the chain, so call a second time to call down chain and
11827 // update layer state
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011828 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11829 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlise35b66a2017-03-15 12:18:31 -060011830 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011831 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011832 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011833 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that "
11834 "doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011835 m_errorMonitor->SetUnexpectedError(
11836 "srcImageLayout must be either of VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL");
Cort530cf382016-12-08 09:59:47 -080011837 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011838 m_errorMonitor->VerifyFound();
11839 // Final src error is due to bad layout type
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011840 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011841 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011842 "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011843 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011844 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011845 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011846 m_errorMonitor->VerifyFound();
11847 // Now verify same checks for dst
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011848 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11849 "layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
11850 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011851 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011852 m_errorMonitor->VerifyFound();
11853 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011854 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011855 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011856 "the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011857 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011858 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011859 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011860 m_errorMonitor->VerifyFound();
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011861 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011862 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL "
11863 "or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011864 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011865 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011866 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011867 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011868
Cort3b021012016-12-07 12:00:57 -080011869 // Convert dst and depth images to TRANSFER_DST for subsequent tests
11870 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
11871 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11872 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
11873 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
11874 transfer_dst_image_barrier[0].srcAccessMask = 0;
11875 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
11876 transfer_dst_image_barrier[0].image = dst_image;
11877 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11878 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
11879 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11880 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11881 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11882 transfer_dst_image_barrier[0].image = depth_image;
11883 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
11884 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11885 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11886
11887 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080011888 VkClearColorValue color_clear_value = {};
11889 VkImageSubresourceRange clear_range;
11890 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11891 clear_range.baseMipLevel = 0;
11892 clear_range.baseArrayLayer = 0;
11893 clear_range.layerCount = 1;
11894 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011895
Cort3b021012016-12-07 12:00:57 -080011896 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
11897 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11898 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
11899 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011900 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011901 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011902 // Fail due to provided layout not matching actual current layout for color clear.
11903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011904 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011905 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011906
Cort530cf382016-12-08 09:59:47 -080011907 VkClearDepthStencilValue depth_clear_value = {};
11908 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080011909
11910 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
11911 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11912 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
11913 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011914 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011915 m_errorMonitor->VerifyFound();
11916 // Fail due to provided layout not matching actual current layout for depth clear.
11917 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011918 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011919 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011920
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011921 // Now cause error due to bad image layout transition in PipelineBarrier
11922 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080011923 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011924 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080011925 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011926 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080011927 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11928 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011929 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011930 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011931 "you cannot transition the layout of aspect 1 from "
11932 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is "
11933 "VK_IMAGE_LAYOUT_GENERAL.");
Mike Weiblen62d08a32017-03-07 22:18:27 -070011934 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00305);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011935 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11936 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011937 m_errorMonitor->VerifyFound();
11938
11939 // Finally some layout errors at RenderPass create time
11940 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
11941 VkAttachmentReference attach = {};
11942 // perf warning for GENERAL layout w/ non-DS input attachment
11943 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11944 VkSubpassDescription subpass = {};
11945 subpass.inputAttachmentCount = 1;
11946 subpass.pInputAttachments = &attach;
11947 VkRenderPassCreateInfo rpci = {};
11948 rpci.subpassCount = 1;
11949 rpci.pSubpasses = &subpass;
11950 rpci.attachmentCount = 1;
11951 VkAttachmentDescription attach_desc = {};
11952 attach_desc.format = VK_FORMAT_UNDEFINED;
11953 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060011954 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011955 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011956 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11957 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011958 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11959 m_errorMonitor->VerifyFound();
11960 // error w/ non-general layout
11961 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11962
11963 m_errorMonitor->SetDesiredFailureMsg(
11964 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11965 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
11966 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11967 m_errorMonitor->VerifyFound();
11968 subpass.inputAttachmentCount = 0;
11969 subpass.colorAttachmentCount = 1;
11970 subpass.pColorAttachments = &attach;
11971 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11972 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011973 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11974 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011975 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11976 m_errorMonitor->VerifyFound();
11977 // error w/ non-color opt or GENERAL layout for color attachment
11978 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11979 m_errorMonitor->SetDesiredFailureMsg(
11980 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11981 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
11982 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11983 m_errorMonitor->VerifyFound();
11984 subpass.colorAttachmentCount = 0;
11985 subpass.pDepthStencilAttachment = &attach;
11986 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11987 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011988 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11989 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011990 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11991 m_errorMonitor->VerifyFound();
11992 // error w/ non-ds opt or GENERAL layout for color attachment
11993 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011994 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11995 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
11996 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011997 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11998 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060011999 // For this error we need a valid renderpass so create default one
12000 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12001 attach.attachment = 0;
Tony Barbourf887b162017-03-09 10:06:46 -070012002 attach_desc.format = depth_format;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012003 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12004 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12005 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12006 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12007 // Can't do a CLEAR load on READ_ONLY initialLayout
12008 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12009 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12010 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012012 "with invalid first layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060012013 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12014 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012015
Cort3b021012016-12-07 12:00:57 -080012016 vkFreeMemory(m_device->device(), src_image_mem, NULL);
12017 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
12018 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012019 vkDestroyImage(m_device->device(), src_image, NULL);
12020 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080012021 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012022}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012023
Tobin Ehlise0936662016-10-11 08:10:51 -060012024TEST_F(VkLayerTest, InvalidStorageImageLayout) {
12025 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
12026 VkResult err;
12027
Tony Barbour1fa09702017-03-16 12:09:08 -060012028 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise0936662016-10-11 08:10:51 -060012029
12030 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
12031 VkImageTiling tiling;
12032 VkFormatProperties format_properties;
12033 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
12034 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12035 tiling = VK_IMAGE_TILING_LINEAR;
12036 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12037 tiling = VK_IMAGE_TILING_OPTIMAL;
12038 } else {
Dave Houlton584d51e2017-02-16 12:52:54 -070012039 printf(" Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060012040 return;
12041 }
12042
12043 VkDescriptorPoolSize ds_type = {};
12044 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12045 ds_type.descriptorCount = 1;
12046
12047 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12048 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12049 ds_pool_ci.maxSets = 1;
12050 ds_pool_ci.poolSizeCount = 1;
12051 ds_pool_ci.pPoolSizes = &ds_type;
12052 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12053
12054 VkDescriptorPool ds_pool;
12055 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12056 ASSERT_VK_SUCCESS(err);
12057
12058 VkDescriptorSetLayoutBinding dsl_binding = {};
12059 dsl_binding.binding = 0;
12060 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12061 dsl_binding.descriptorCount = 1;
12062 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12063 dsl_binding.pImmutableSamplers = NULL;
12064
12065 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12066 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12067 ds_layout_ci.pNext = NULL;
12068 ds_layout_ci.bindingCount = 1;
12069 ds_layout_ci.pBindings = &dsl_binding;
12070
12071 VkDescriptorSetLayout ds_layout;
12072 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12073 ASSERT_VK_SUCCESS(err);
12074
12075 VkDescriptorSetAllocateInfo alloc_info = {};
12076 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12077 alloc_info.descriptorSetCount = 1;
12078 alloc_info.descriptorPool = ds_pool;
12079 alloc_info.pSetLayouts = &ds_layout;
12080 VkDescriptorSet descriptor_set;
12081 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12082 ASSERT_VK_SUCCESS(err);
12083
12084 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12085 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12086 pipeline_layout_ci.pNext = NULL;
12087 pipeline_layout_ci.setLayoutCount = 1;
12088 pipeline_layout_ci.pSetLayouts = &ds_layout;
12089 VkPipelineLayout pipeline_layout;
12090 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12091 ASSERT_VK_SUCCESS(err);
12092
12093 VkImageObj image(m_device);
12094 image.init(32, 32, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
12095 ASSERT_TRUE(image.initialized());
12096 VkImageView view = image.targetView(tex_format);
12097
12098 VkDescriptorImageInfo image_info = {};
12099 image_info.imageView = view;
12100 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12101
12102 VkWriteDescriptorSet descriptor_write = {};
12103 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12104 descriptor_write.dstSet = descriptor_set;
12105 descriptor_write.dstBinding = 0;
12106 descriptor_write.descriptorCount = 1;
12107 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12108 descriptor_write.pImageInfo = &image_info;
12109
12110 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12111 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
12112 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
12113 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12114 m_errorMonitor->VerifyFound();
12115
12116 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12117 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12118 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
12119 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12120}
12121
Mark Mueller93b938f2016-08-18 10:27:40 -060012122TEST_F(VkLayerTest, SimultaneousUse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012123 TEST_DESCRIPTION(
12124 "Use vkCmdExecuteCommands with invalid state "
12125 "in primary and secondary command buffers.");
Mark Mueller93b938f2016-08-18 10:27:40 -060012126
Tony Barbour1fa09702017-03-16 12:09:08 -060012127 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller93b938f2016-08-18 10:27:40 -060012128 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12129
Mike Weiblen95dd0f92016-10-19 12:28:27 -060012130 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012131 const char *simultaneous_use_message2 =
12132 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
12133 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060012134
12135 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012136 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012137 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012138 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12139 command_buffer_allocate_info.commandBufferCount = 1;
12140
12141 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012142 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060012143 VkCommandBufferBeginInfo command_buffer_begin_info = {};
12144 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012145 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060012146 command_buffer_inheritance_info.renderPass = m_renderPass;
12147 command_buffer_inheritance_info.framebuffer = m_framebuffer;
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012148
Mark Mueller93b938f2016-08-18 10:27:40 -060012149 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012150 command_buffer_begin_info.flags =
12151 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060012152 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
12153
12154 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
12155 vkEndCommandBuffer(secondary_command_buffer);
12156
Mark Mueller93b938f2016-08-18 10:27:40 -060012157 VkSubmitInfo submit_info = {};
12158 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12159 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012160 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012161
Mark Mueller4042b652016-09-05 22:52:21 -060012162 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012163 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
12164 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
12165 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012166 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012167 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012168 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12169 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060012170
Dave Houltonfbf52152017-01-06 12:55:29 -070012171 m_errorMonitor->ExpectSuccess(0);
Mark Mueller93b938f2016-08-18 10:27:40 -060012172 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070012173 m_errorMonitor->VerifyNotFound();
Mark Mueller93b938f2016-08-18 10:27:40 -060012174
Mark Mueller4042b652016-09-05 22:52:21 -060012175 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012176 m_errorMonitor->SetUnexpectedError("commandBuffer must not currently be pending execution");
12177 m_errorMonitor->SetUnexpectedError(
12178 "If commandBuffer was allocated from a VkCommandPool which did not have the "
12179 "VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT flag set, commandBuffer must be in the initial state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012180 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012181 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060012182
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012183 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
12184 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012185 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012186 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12187 vkEndCommandBuffer(m_commandBuffer->handle());
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012188
12189 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012190
12191 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be pending execution");
Mark Mueller93b938f2016-08-18 10:27:40 -060012192}
12193
Tony Barbour626994c2017-02-08 15:29:37 -070012194TEST_F(VkLayerTest, SimultaneousUseOneShot) {
12195 TEST_DESCRIPTION(
12196 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
12197 "errors");
12198 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
12199 const char *one_shot_message = "VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted";
Tony Barbour1fa09702017-03-16 12:09:08 -060012200 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070012201
12202 VkCommandBuffer cmd_bufs[2];
12203 VkCommandBufferAllocateInfo alloc_info;
12204 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12205 alloc_info.pNext = NULL;
12206 alloc_info.commandBufferCount = 2;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012207 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070012208 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12209 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
12210
12211 VkCommandBufferBeginInfo cb_binfo;
12212 cb_binfo.pNext = NULL;
12213 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12214 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
12215 cb_binfo.flags = 0;
12216 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
12217 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12218 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
12219 vkEndCommandBuffer(cmd_bufs[0]);
12220 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
12221
12222 VkSubmitInfo submit_info = {};
12223 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12224 submit_info.commandBufferCount = 2;
12225 submit_info.pCommandBuffers = duplicates;
12226 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
12227 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12228 m_errorMonitor->VerifyFound();
12229 vkQueueWaitIdle(m_device->m_queue);
12230
12231 // Set one time use and now look for one time submit
12232 duplicates[0] = duplicates[1] = cmd_bufs[1];
12233 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
12234 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
12235 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
12236 vkEndCommandBuffer(cmd_bufs[1]);
12237 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
12238 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12239 m_errorMonitor->VerifyFound();
12240 vkQueueWaitIdle(m_device->m_queue);
12241}
12242
Tobin Ehlisb093da82017-01-19 12:05:27 -070012243TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012244 TEST_DESCRIPTION(
12245 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
12246 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070012247
Tony Barbour1fa09702017-03-16 12:09:08 -060012248 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb093da82017-01-19 12:05:27 -070012249 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12250
12251 std::vector<const char *> device_extension_names;
12252 auto features = m_device->phy().features();
12253 // Make sure gs & ts are disabled
12254 features.geometryShader = false;
12255 features.tessellationShader = false;
12256 // The sacrificial device object
12257 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
12258
12259 VkCommandPoolCreateInfo pool_create_info{};
12260 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
12261 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
12262
12263 VkCommandPool command_pool;
12264 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
12265
12266 VkCommandBufferAllocateInfo cmd = {};
12267 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12268 cmd.pNext = NULL;
12269 cmd.commandPool = command_pool;
12270 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12271 cmd.commandBufferCount = 1;
12272
12273 VkCommandBuffer cmd_buffer;
12274 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
12275 ASSERT_VK_SUCCESS(err);
12276
12277 VkEvent event;
12278 VkEventCreateInfo evci = {};
12279 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12280 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
12281 ASSERT_VK_SUCCESS(result);
12282
12283 VkCommandBufferBeginInfo cbbi = {};
12284 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12285 vkBeginCommandBuffer(cmd_buffer, &cbbi);
12286 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
12287 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
12288 m_errorMonitor->VerifyFound();
12289
12290 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
12291 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
12292 m_errorMonitor->VerifyFound();
12293
12294 vkDestroyEvent(test_device.handle(), event, NULL);
12295 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
12296}
12297
Mark Mueller917f6bc2016-08-30 10:57:19 -060012298TEST_F(VkLayerTest, InUseDestroyedSignaled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012299 TEST_DESCRIPTION(
12300 "Use vkCmdExecuteCommands with invalid state "
12301 "in primary and secondary command buffers. "
12302 "Delete objects that are inuse. Call VkQueueSubmit "
12303 "with an event that has been deleted.");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012304
Tony Barbour1fa09702017-03-16 12:09:08 -060012305 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller917f6bc2016-08-30 10:57:19 -060012306 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12307
Tony Barbour552f6c02016-12-21 14:34:07 -070012308 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012309
12310 VkEvent event;
12311 VkEventCreateInfo event_create_info = {};
12312 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12313 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012314 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012315
Tony Barbour552f6c02016-12-21 14:34:07 -070012316 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060012317 vkDestroyEvent(m_device->device(), event, nullptr);
12318
12319 VkSubmitInfo submit_info = {};
12320 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12321 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012322 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskife4be302017-02-14 13:08:15 -070012323 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound");
Mark Muellerc8d441e2016-08-23 17:36:00 -060012324 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12325 m_errorMonitor->VerifyFound();
12326
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012327 m_errorMonitor->ExpectSuccess(0); // disable all log message processing with flags==0
Mark Muellerc8d441e2016-08-23 17:36:00 -060012328 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
12329
12330 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12331
Mark Mueller917f6bc2016-08-30 10:57:19 -060012332 VkSemaphoreCreateInfo semaphore_create_info = {};
12333 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
12334 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012335 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012336 VkFenceCreateInfo fence_create_info = {};
12337 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
12338 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012339 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012340
12341 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012342 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012343 descriptor_pool_type_count.descriptorCount = 1;
12344
12345 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12346 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12347 descriptor_pool_create_info.maxSets = 1;
12348 descriptor_pool_create_info.poolSizeCount = 1;
12349 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012350 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012351
12352 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012353 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012354
12355 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012356 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012357 descriptorset_layout_binding.descriptorCount = 1;
12358 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
12359
12360 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012361 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012362 descriptorset_layout_create_info.bindingCount = 1;
12363 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12364
12365 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012366 ASSERT_VK_SUCCESS(
12367 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012368
12369 VkDescriptorSet descriptorset;
12370 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012371 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012372 descriptorset_allocate_info.descriptorSetCount = 1;
12373 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12374 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012375 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012376
Mark Mueller4042b652016-09-05 22:52:21 -060012377 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
12378
12379 VkDescriptorBufferInfo buffer_info = {};
12380 buffer_info.buffer = buffer_test.GetBuffer();
12381 buffer_info.offset = 0;
12382 buffer_info.range = 1024;
12383
12384 VkWriteDescriptorSet write_descriptor_set = {};
12385 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12386 write_descriptor_set.dstSet = descriptorset;
12387 write_descriptor_set.descriptorCount = 1;
12388 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12389 write_descriptor_set.pBufferInfo = &buffer_info;
12390
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012391 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060012392
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012393 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12394 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012395
12396 VkPipelineObj pipe(m_device);
12397 pipe.AddColorAttachment();
12398 pipe.AddShader(&vs);
12399 pipe.AddShader(&fs);
12400
12401 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012402 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012403 pipeline_layout_create_info.setLayoutCount = 1;
12404 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12405
12406 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012407 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012408
12409 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
12410
Tony Barbour552f6c02016-12-21 14:34:07 -070012411 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012412 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060012413
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012414 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12415 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12416 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012417
Tony Barbour552f6c02016-12-21 14:34:07 -070012418 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012419
Mark Mueller917f6bc2016-08-30 10:57:19 -060012420 submit_info.signalSemaphoreCount = 1;
12421 submit_info.pSignalSemaphores = &semaphore;
12422 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012423 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060012424
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012425 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012426 vkDestroyEvent(m_device->device(), event, nullptr);
12427 m_errorMonitor->VerifyFound();
12428
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012429 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012430 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
12431 m_errorMonitor->VerifyFound();
12432
Jeremy Hayes08369882017-02-02 10:31:06 -070012433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012434 vkDestroyFence(m_device->device(), fence, nullptr);
12435 m_errorMonitor->VerifyFound();
12436
Tobin Ehlis122207b2016-09-01 08:50:06 -070012437 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012438 m_errorMonitor->SetUnexpectedError("If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle");
12439 m_errorMonitor->SetUnexpectedError("Unable to remove Semaphore obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012440 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012441 m_errorMonitor->SetUnexpectedError("If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle");
12442 m_errorMonitor->SetUnexpectedError("Unable to remove Fence obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012443 vkDestroyFence(m_device->device(), fence, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012444 m_errorMonitor->SetUnexpectedError("If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle");
12445 m_errorMonitor->SetUnexpectedError("Unable to remove Event obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012446 vkDestroyEvent(m_device->device(), event, nullptr);
12447 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012448 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012449 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12450}
12451
Tobin Ehlis2adda372016-09-01 08:51:06 -070012452TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
12453 TEST_DESCRIPTION("Delete in-use query pool.");
12454
Tony Barbour1fa09702017-03-16 12:09:08 -060012455 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis2adda372016-09-01 08:51:06 -070012456 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12457
12458 VkQueryPool query_pool;
12459 VkQueryPoolCreateInfo query_pool_ci{};
12460 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12461 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
12462 query_pool_ci.queryCount = 1;
12463 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070012464 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012465 // Reset query pool to create binding with cmd buffer
12466 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
12467
Tony Barbour552f6c02016-12-21 14:34:07 -070012468 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012469
12470 VkSubmitInfo submit_info = {};
12471 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12472 submit_info.commandBufferCount = 1;
12473 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12474 // Submit cmd buffer and then destroy query pool while in-flight
12475 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12476
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012477 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070012478 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12479 m_errorMonitor->VerifyFound();
12480
12481 vkQueueWaitIdle(m_device->m_queue);
12482 // Now that cmd buffer done we can safely destroy query_pool
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012483 m_errorMonitor->SetUnexpectedError("If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle");
12484 m_errorMonitor->SetUnexpectedError("Unable to remove Query Pool obj");
Tobin Ehlis2adda372016-09-01 08:51:06 -070012485 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12486}
12487
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012488TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
12489 TEST_DESCRIPTION("Delete in-use pipeline.");
12490
Tony Barbour1fa09702017-03-16 12:09:08 -060012491 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012492 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12493
12494 // Empty pipeline layout used for binding PSO
12495 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12496 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12497 pipeline_layout_ci.setLayoutCount = 0;
12498 pipeline_layout_ci.pSetLayouts = NULL;
12499
12500 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012501 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012502 ASSERT_VK_SUCCESS(err);
12503
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012504 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012505 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012506 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12507 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012508 // Store pipeline handle so we can actually delete it before test finishes
12509 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012510 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012511 VkPipelineObj pipe(m_device);
12512 pipe.AddShader(&vs);
12513 pipe.AddShader(&fs);
12514 pipe.AddColorAttachment();
12515 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12516 delete_this_pipeline = pipe.handle();
12517
Tony Barbour552f6c02016-12-21 14:34:07 -070012518 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012519 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012520 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012521
Tony Barbour552f6c02016-12-21 14:34:07 -070012522 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012523
12524 VkSubmitInfo submit_info = {};
12525 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12526 submit_info.commandBufferCount = 1;
12527 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12528 // Submit cmd buffer and then pipeline destroyed while in-flight
12529 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012530 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012531 m_errorMonitor->VerifyFound();
12532 // Make sure queue finished and then actually delete pipeline
12533 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012534 m_errorMonitor->SetUnexpectedError("If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle");
12535 m_errorMonitor->SetUnexpectedError("Unable to remove Pipeline obj");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012536 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
12537 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
12538}
12539
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012540TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
12541 TEST_DESCRIPTION("Delete in-use imageView.");
12542
Tony Barbour1fa09702017-03-16 12:09:08 -060012543 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012544 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12545
12546 VkDescriptorPoolSize ds_type_count;
12547 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12548 ds_type_count.descriptorCount = 1;
12549
12550 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12551 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12552 ds_pool_ci.maxSets = 1;
12553 ds_pool_ci.poolSizeCount = 1;
12554 ds_pool_ci.pPoolSizes = &ds_type_count;
12555
12556 VkDescriptorPool ds_pool;
12557 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12558 ASSERT_VK_SUCCESS(err);
12559
12560 VkSamplerCreateInfo sampler_ci = {};
12561 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12562 sampler_ci.pNext = NULL;
12563 sampler_ci.magFilter = VK_FILTER_NEAREST;
12564 sampler_ci.minFilter = VK_FILTER_NEAREST;
12565 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12566 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12567 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12568 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12569 sampler_ci.mipLodBias = 1.0;
12570 sampler_ci.anisotropyEnable = VK_FALSE;
12571 sampler_ci.maxAnisotropy = 1;
12572 sampler_ci.compareEnable = VK_FALSE;
12573 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12574 sampler_ci.minLod = 1.0;
12575 sampler_ci.maxLod = 1.0;
12576 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12577 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12578 VkSampler sampler;
12579
12580 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12581 ASSERT_VK_SUCCESS(err);
12582
12583 VkDescriptorSetLayoutBinding layout_binding;
12584 layout_binding.binding = 0;
12585 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12586 layout_binding.descriptorCount = 1;
12587 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12588 layout_binding.pImmutableSamplers = NULL;
12589
12590 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12591 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12592 ds_layout_ci.bindingCount = 1;
12593 ds_layout_ci.pBindings = &layout_binding;
12594 VkDescriptorSetLayout ds_layout;
12595 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12596 ASSERT_VK_SUCCESS(err);
12597
12598 VkDescriptorSetAllocateInfo alloc_info = {};
12599 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12600 alloc_info.descriptorSetCount = 1;
12601 alloc_info.descriptorPool = ds_pool;
12602 alloc_info.pSetLayouts = &ds_layout;
12603 VkDescriptorSet descriptor_set;
12604 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12605 ASSERT_VK_SUCCESS(err);
12606
12607 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12608 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12609 pipeline_layout_ci.pNext = NULL;
12610 pipeline_layout_ci.setLayoutCount = 1;
12611 pipeline_layout_ci.pSetLayouts = &ds_layout;
12612
12613 VkPipelineLayout pipeline_layout;
12614 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12615 ASSERT_VK_SUCCESS(err);
12616
12617 VkImageObj image(m_device);
12618 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
12619 ASSERT_TRUE(image.initialized());
12620
12621 VkImageView view;
12622 VkImageViewCreateInfo ivci = {};
12623 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12624 ivci.image = image.handle();
12625 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12626 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12627 ivci.subresourceRange.layerCount = 1;
12628 ivci.subresourceRange.baseMipLevel = 0;
12629 ivci.subresourceRange.levelCount = 1;
12630 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12631
12632 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12633 ASSERT_VK_SUCCESS(err);
12634
12635 VkDescriptorImageInfo image_info{};
12636 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12637 image_info.imageView = view;
12638 image_info.sampler = sampler;
12639
12640 VkWriteDescriptorSet descriptor_write = {};
12641 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12642 descriptor_write.dstSet = descriptor_set;
12643 descriptor_write.dstBinding = 0;
12644 descriptor_write.descriptorCount = 1;
12645 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12646 descriptor_write.pImageInfo = &image_info;
12647
12648 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12649
12650 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012651 char const *vsSource =
12652 "#version 450\n"
12653 "\n"
12654 "out gl_PerVertex { \n"
12655 " vec4 gl_Position;\n"
12656 "};\n"
12657 "void main(){\n"
12658 " gl_Position = vec4(1);\n"
12659 "}\n";
12660 char const *fsSource =
12661 "#version 450\n"
12662 "\n"
12663 "layout(set=0, binding=0) uniform sampler2D s;\n"
12664 "layout(location=0) out vec4 x;\n"
12665 "void main(){\n"
12666 " x = texture(s, vec2(1));\n"
12667 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012668 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12669 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12670 VkPipelineObj pipe(m_device);
12671 pipe.AddShader(&vs);
12672 pipe.AddShader(&fs);
12673 pipe.AddColorAttachment();
12674 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12675
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012676 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012677
Tony Barbour552f6c02016-12-21 14:34:07 -070012678 m_commandBuffer->BeginCommandBuffer();
12679 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012680 // Bind pipeline to cmd buffer
12681 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12682 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12683 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070012684
12685 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12686 VkRect2D scissor = {{0, 0}, {16, 16}};
12687 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12688 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12689
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012690 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012691 m_commandBuffer->EndRenderPass();
12692 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012693 // Submit cmd buffer then destroy sampler
12694 VkSubmitInfo submit_info = {};
12695 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12696 submit_info.commandBufferCount = 1;
12697 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12698 // Submit cmd buffer and then destroy imageView while in-flight
12699 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12700
12701 vkDestroyImageView(m_device->device(), view, nullptr);
12702 m_errorMonitor->VerifyFound();
12703 vkQueueWaitIdle(m_device->m_queue);
12704 // Now we can actually destroy imageView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012705 m_errorMonitor->SetUnexpectedError("If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle");
12706 m_errorMonitor->SetUnexpectedError("Unable to remove Image View obj");
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012707 vkDestroyImageView(m_device->device(), view, NULL);
12708 vkDestroySampler(m_device->device(), sampler, nullptr);
12709 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12710 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12711 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12712}
12713
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012714TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
12715 TEST_DESCRIPTION("Delete in-use bufferView.");
12716
Tony Barbour1fa09702017-03-16 12:09:08 -060012717 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012718 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12719
12720 VkDescriptorPoolSize ds_type_count;
12721 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12722 ds_type_count.descriptorCount = 1;
12723
12724 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12725 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12726 ds_pool_ci.maxSets = 1;
12727 ds_pool_ci.poolSizeCount = 1;
12728 ds_pool_ci.pPoolSizes = &ds_type_count;
12729
12730 VkDescriptorPool ds_pool;
12731 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12732 ASSERT_VK_SUCCESS(err);
12733
12734 VkDescriptorSetLayoutBinding layout_binding;
12735 layout_binding.binding = 0;
12736 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12737 layout_binding.descriptorCount = 1;
12738 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12739 layout_binding.pImmutableSamplers = NULL;
12740
12741 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12742 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12743 ds_layout_ci.bindingCount = 1;
12744 ds_layout_ci.pBindings = &layout_binding;
12745 VkDescriptorSetLayout ds_layout;
12746 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12747 ASSERT_VK_SUCCESS(err);
12748
12749 VkDescriptorSetAllocateInfo alloc_info = {};
12750 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12751 alloc_info.descriptorSetCount = 1;
12752 alloc_info.descriptorPool = ds_pool;
12753 alloc_info.pSetLayouts = &ds_layout;
12754 VkDescriptorSet descriptor_set;
12755 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12756 ASSERT_VK_SUCCESS(err);
12757
12758 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12759 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12760 pipeline_layout_ci.pNext = NULL;
12761 pipeline_layout_ci.setLayoutCount = 1;
12762 pipeline_layout_ci.pSetLayouts = &ds_layout;
12763
12764 VkPipelineLayout pipeline_layout;
12765 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12766 ASSERT_VK_SUCCESS(err);
12767
12768 VkBuffer buffer;
12769 uint32_t queue_family_index = 0;
12770 VkBufferCreateInfo buffer_create_info = {};
12771 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
12772 buffer_create_info.size = 1024;
12773 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
12774 buffer_create_info.queueFamilyIndexCount = 1;
12775 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
12776
12777 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
12778 ASSERT_VK_SUCCESS(err);
12779
12780 VkMemoryRequirements memory_reqs;
12781 VkDeviceMemory buffer_memory;
12782
12783 VkMemoryAllocateInfo memory_info = {};
12784 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
12785 memory_info.allocationSize = 0;
12786 memory_info.memoryTypeIndex = 0;
12787
12788 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
12789 memory_info.allocationSize = memory_reqs.size;
12790 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
12791 ASSERT_TRUE(pass);
12792
12793 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
12794 ASSERT_VK_SUCCESS(err);
12795 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
12796 ASSERT_VK_SUCCESS(err);
12797
12798 VkBufferView view;
12799 VkBufferViewCreateInfo bvci = {};
12800 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
12801 bvci.buffer = buffer;
12802 bvci.format = VK_FORMAT_R8_UNORM;
12803 bvci.range = VK_WHOLE_SIZE;
12804
12805 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
12806 ASSERT_VK_SUCCESS(err);
12807
12808 VkWriteDescriptorSet descriptor_write = {};
12809 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12810 descriptor_write.dstSet = descriptor_set;
12811 descriptor_write.dstBinding = 0;
12812 descriptor_write.descriptorCount = 1;
12813 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12814 descriptor_write.pTexelBufferView = &view;
12815
12816 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12817
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012818 char const *vsSource =
12819 "#version 450\n"
12820 "\n"
12821 "out gl_PerVertex { \n"
12822 " vec4 gl_Position;\n"
12823 "};\n"
12824 "void main(){\n"
12825 " gl_Position = vec4(1);\n"
12826 "}\n";
12827 char const *fsSource =
12828 "#version 450\n"
12829 "\n"
12830 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
12831 "layout(location=0) out vec4 x;\n"
12832 "void main(){\n"
12833 " x = imageLoad(s, 0);\n"
12834 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012835 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12836 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12837 VkPipelineObj pipe(m_device);
12838 pipe.AddShader(&vs);
12839 pipe.AddShader(&fs);
12840 pipe.AddColorAttachment();
12841 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12842
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012843 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012844
Tony Barbour552f6c02016-12-21 14:34:07 -070012845 m_commandBuffer->BeginCommandBuffer();
12846 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012847 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12848 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12849 VkRect2D scissor = {{0, 0}, {16, 16}};
12850 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12851 // Bind pipeline to cmd buffer
12852 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12853 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12854 &descriptor_set, 0, nullptr);
12855 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012856 m_commandBuffer->EndRenderPass();
12857 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012858
12859 VkSubmitInfo submit_info = {};
12860 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12861 submit_info.commandBufferCount = 1;
12862 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12863 // Submit cmd buffer and then destroy bufferView while in-flight
12864 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12865
12866 vkDestroyBufferView(m_device->device(), view, nullptr);
12867 m_errorMonitor->VerifyFound();
12868 vkQueueWaitIdle(m_device->m_queue);
12869 // Now we can actually destroy bufferView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012870 m_errorMonitor->SetUnexpectedError("If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle");
12871 m_errorMonitor->SetUnexpectedError("Unable to remove Buffer View obj");
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012872 vkDestroyBufferView(m_device->device(), view, NULL);
12873 vkDestroyBuffer(m_device->device(), buffer, NULL);
12874 vkFreeMemory(m_device->device(), buffer_memory, NULL);
12875 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12876 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12877 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12878}
12879
Tobin Ehlis209532e2016-09-07 13:52:18 -060012880TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
12881 TEST_DESCRIPTION("Delete in-use sampler.");
12882
Tony Barbour1fa09702017-03-16 12:09:08 -060012883 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis209532e2016-09-07 13:52:18 -060012884 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12885
12886 VkDescriptorPoolSize ds_type_count;
12887 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12888 ds_type_count.descriptorCount = 1;
12889
12890 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12891 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12892 ds_pool_ci.maxSets = 1;
12893 ds_pool_ci.poolSizeCount = 1;
12894 ds_pool_ci.pPoolSizes = &ds_type_count;
12895
12896 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012897 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012898 ASSERT_VK_SUCCESS(err);
12899
12900 VkSamplerCreateInfo sampler_ci = {};
12901 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12902 sampler_ci.pNext = NULL;
12903 sampler_ci.magFilter = VK_FILTER_NEAREST;
12904 sampler_ci.minFilter = VK_FILTER_NEAREST;
12905 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12906 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12907 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12908 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12909 sampler_ci.mipLodBias = 1.0;
12910 sampler_ci.anisotropyEnable = VK_FALSE;
12911 sampler_ci.maxAnisotropy = 1;
12912 sampler_ci.compareEnable = VK_FALSE;
12913 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12914 sampler_ci.minLod = 1.0;
12915 sampler_ci.maxLod = 1.0;
12916 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12917 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12918 VkSampler sampler;
12919
12920 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12921 ASSERT_VK_SUCCESS(err);
12922
12923 VkDescriptorSetLayoutBinding layout_binding;
12924 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060012925 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060012926 layout_binding.descriptorCount = 1;
12927 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12928 layout_binding.pImmutableSamplers = NULL;
12929
12930 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12931 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12932 ds_layout_ci.bindingCount = 1;
12933 ds_layout_ci.pBindings = &layout_binding;
12934 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012935 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012936 ASSERT_VK_SUCCESS(err);
12937
12938 VkDescriptorSetAllocateInfo alloc_info = {};
12939 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12940 alloc_info.descriptorSetCount = 1;
12941 alloc_info.descriptorPool = ds_pool;
12942 alloc_info.pSetLayouts = &ds_layout;
12943 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012944 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012945 ASSERT_VK_SUCCESS(err);
12946
12947 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12948 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12949 pipeline_layout_ci.pNext = NULL;
12950 pipeline_layout_ci.setLayoutCount = 1;
12951 pipeline_layout_ci.pSetLayouts = &ds_layout;
12952
12953 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012954 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012955 ASSERT_VK_SUCCESS(err);
12956
12957 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012958 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012959 ASSERT_TRUE(image.initialized());
12960
12961 VkImageView view;
12962 VkImageViewCreateInfo ivci = {};
12963 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12964 ivci.image = image.handle();
12965 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12966 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12967 ivci.subresourceRange.layerCount = 1;
12968 ivci.subresourceRange.baseMipLevel = 0;
12969 ivci.subresourceRange.levelCount = 1;
12970 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12971
12972 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12973 ASSERT_VK_SUCCESS(err);
12974
12975 VkDescriptorImageInfo image_info{};
12976 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12977 image_info.imageView = view;
12978 image_info.sampler = sampler;
12979
12980 VkWriteDescriptorSet descriptor_write = {};
12981 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12982 descriptor_write.dstSet = descriptor_set;
12983 descriptor_write.dstBinding = 0;
12984 descriptor_write.descriptorCount = 1;
12985 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12986 descriptor_write.pImageInfo = &image_info;
12987
12988 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12989
12990 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012991 char const *vsSource =
12992 "#version 450\n"
12993 "\n"
12994 "out gl_PerVertex { \n"
12995 " vec4 gl_Position;\n"
12996 "};\n"
12997 "void main(){\n"
12998 " gl_Position = vec4(1);\n"
12999 "}\n";
13000 char const *fsSource =
13001 "#version 450\n"
13002 "\n"
13003 "layout(set=0, binding=0) uniform sampler2D s;\n"
13004 "layout(location=0) out vec4 x;\n"
13005 "void main(){\n"
13006 " x = texture(s, vec2(1));\n"
13007 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060013008 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13009 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13010 VkPipelineObj pipe(m_device);
13011 pipe.AddShader(&vs);
13012 pipe.AddShader(&fs);
13013 pipe.AddColorAttachment();
13014 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13015
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013016 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013017
Tony Barbour552f6c02016-12-21 14:34:07 -070013018 m_commandBuffer->BeginCommandBuffer();
13019 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013020 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013021 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13022 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13023 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070013024
13025 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13026 VkRect2D scissor = {{0, 0}, {16, 16}};
13027 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13028 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13029
Tobin Ehlis209532e2016-09-07 13:52:18 -060013030 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013031 m_commandBuffer->EndRenderPass();
13032 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060013033 // Submit cmd buffer then destroy sampler
13034 VkSubmitInfo submit_info = {};
13035 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13036 submit_info.commandBufferCount = 1;
13037 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13038 // Submit cmd buffer and then destroy sampler while in-flight
13039 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13040
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013041 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060013042 m_errorMonitor->VerifyFound();
13043 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070013044
Tobin Ehlis209532e2016-09-07 13:52:18 -060013045 // Now we can actually destroy sampler
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013046 m_errorMonitor->SetUnexpectedError("If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle");
13047 m_errorMonitor->SetUnexpectedError("Unable to remove Sampler obj");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013048 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060013049 vkDestroyImageView(m_device->device(), view, NULL);
13050 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13051 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13052 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13053}
13054
Mark Mueller1cd9f412016-08-25 13:23:52 -060013055TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013056 TEST_DESCRIPTION(
13057 "Call VkQueueSubmit with a semaphore that is already "
13058 "signaled but not waited on by the queue. Wait on a "
13059 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060013060
Tony Barbour1fa09702017-03-16 12:09:08 -060013061 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller96a56d52016-08-24 10:28:05 -060013062 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13063
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013064 const char *queue_forward_progress_message = " that has already been signaled but not waited on by queue 0x";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013065 const char *invalid_fence_wait_message =
13066 " which has not been submitted on a Queue or during "
13067 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060013068
Tony Barbour552f6c02016-12-21 14:34:07 -070013069 m_commandBuffer->BeginCommandBuffer();
13070 m_commandBuffer->EndCommandBuffer();
Mark Mueller96a56d52016-08-24 10:28:05 -060013071
13072 VkSemaphoreCreateInfo semaphore_create_info = {};
13073 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13074 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013075 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060013076 VkSubmitInfo submit_info = {};
13077 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13078 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013079 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060013080 submit_info.signalSemaphoreCount = 1;
13081 submit_info.pSignalSemaphores = &semaphore;
13082 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070013083 m_errorMonitor->ExpectSuccess(0);
Mark Mueller96a56d52016-08-24 10:28:05 -060013084 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Dave Houltonfbf52152017-01-06 12:55:29 -070013085 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070013086 m_commandBuffer->BeginCommandBuffer();
13087 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060013089 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13090 m_errorMonitor->VerifyFound();
13091
Mark Mueller1cd9f412016-08-25 13:23:52 -060013092 VkFenceCreateInfo fence_create_info = {};
13093 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13094 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013095 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060013096
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013097 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060013098 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
13099 m_errorMonitor->VerifyFound();
13100
Mark Mueller4042b652016-09-05 22:52:21 -060013101 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060013102 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060013103 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13104}
13105
Tobin Ehlis4af23302016-07-19 10:50:30 -060013106TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013107 TEST_DESCRIPTION(
13108 "Bind a secondary command buffer with with a framebuffer "
13109 "that does not match the framebuffer for the active "
13110 "renderpass.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013111 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4af23302016-07-19 10:50:30 -060013112 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13113
13114 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013115 VkAttachmentDescription attachment = {0,
13116 VK_FORMAT_B8G8R8A8_UNORM,
13117 VK_SAMPLE_COUNT_1_BIT,
13118 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13119 VK_ATTACHMENT_STORE_OP_STORE,
13120 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13121 VK_ATTACHMENT_STORE_OP_DONT_CARE,
13122 VK_IMAGE_LAYOUT_UNDEFINED,
13123 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013124
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013125 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013126
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013127 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013128
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013129 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013130
13131 VkRenderPass rp;
13132 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13133 ASSERT_VK_SUCCESS(err);
13134
13135 // A compatible framebuffer.
13136 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013137 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013138 ASSERT_TRUE(image.initialized());
13139
13140 VkImageViewCreateInfo ivci = {
13141 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
13142 nullptr,
13143 0,
13144 image.handle(),
13145 VK_IMAGE_VIEW_TYPE_2D,
13146 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013147 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
13148 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060013149 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
13150 };
13151 VkImageView view;
13152 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
13153 ASSERT_VK_SUCCESS(err);
13154
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013155 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013156 VkFramebuffer fb;
13157 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
13158 ASSERT_VK_SUCCESS(err);
13159
13160 VkCommandBufferAllocateInfo cbai = {};
13161 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070013162 cbai.commandPool = m_commandPool->handle();
Tobin Ehlis4af23302016-07-19 10:50:30 -060013163 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
13164 cbai.commandBufferCount = 1;
13165
13166 VkCommandBuffer sec_cb;
13167 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
13168 ASSERT_VK_SUCCESS(err);
13169 VkCommandBufferBeginInfo cbbi = {};
13170 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130013171 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013172 cbii.renderPass = renderPass();
13173 cbii.framebuffer = fb;
13174 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13175 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013176 cbbi.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013177 cbbi.pInheritanceInfo = &cbii;
13178 vkBeginCommandBuffer(sec_cb, &cbbi);
13179 vkEndCommandBuffer(sec_cb);
13180
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013181 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120013182 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
13183 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013184
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013186 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060013187 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
13188 m_errorMonitor->VerifyFound();
13189 // Cleanup
13190 vkDestroyImageView(m_device->device(), view, NULL);
13191 vkDestroyRenderPass(m_device->device(), rp, NULL);
13192 vkDestroyFramebuffer(m_device->device(), fb, NULL);
13193}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013194
13195TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013196 TEST_DESCRIPTION(
13197 "If logicOp is available on the device, set it to an "
13198 "invalid value. If logicOp is not available, attempt to "
13199 "use it and verify that we see the correct error.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013200 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013201 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13202
13203 auto features = m_device->phy().features();
13204 // Set the expected error depending on whether or not logicOp available
13205 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13207 "If logic operations feature not "
13208 "enabled, logicOpEnable must be "
13209 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013210 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130013211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013212 }
13213 // Create a pipeline using logicOp
13214 VkResult err;
13215
13216 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13217 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13218
13219 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013220 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013221 ASSERT_VK_SUCCESS(err);
13222
13223 VkPipelineViewportStateCreateInfo vp_state_ci = {};
13224 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13225 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013226 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013227 vp_state_ci.pViewports = &vp;
13228 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013229 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013230 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013231
13232 VkPipelineShaderStageCreateInfo shaderStages[2];
13233 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
13234
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013235 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13236 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013237 shaderStages[0] = vs.GetStageCreateInfo();
13238 shaderStages[1] = fs.GetStageCreateInfo();
13239
13240 VkPipelineVertexInputStateCreateInfo vi_ci = {};
13241 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13242
13243 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
13244 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13245 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13246
13247 VkPipelineRasterizationStateCreateInfo rs_ci = {};
13248 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130013249 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013250
13251 VkPipelineColorBlendAttachmentState att = {};
13252 att.blendEnable = VK_FALSE;
13253 att.colorWriteMask = 0xf;
13254
13255 VkPipelineColorBlendStateCreateInfo cb_ci = {};
13256 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13257 // Enable logicOp & set logicOp to value 1 beyond allowed entries
13258 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013259 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013260 cb_ci.attachmentCount = 1;
13261 cb_ci.pAttachments = &att;
13262
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013263 VkPipelineMultisampleStateCreateInfo ms_ci = {};
13264 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
13265 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
13266
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013267 VkGraphicsPipelineCreateInfo gp_ci = {};
13268 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13269 gp_ci.stageCount = 2;
13270 gp_ci.pStages = shaderStages;
13271 gp_ci.pVertexInputState = &vi_ci;
13272 gp_ci.pInputAssemblyState = &ia_ci;
13273 gp_ci.pViewportState = &vp_state_ci;
13274 gp_ci.pRasterizationState = &rs_ci;
13275 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013276 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013277 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13278 gp_ci.layout = pipeline_layout;
13279 gp_ci.renderPass = renderPass();
13280
13281 VkPipelineCacheCreateInfo pc_ci = {};
13282 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13283
13284 VkPipeline pipeline;
13285 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013286 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013287 ASSERT_VK_SUCCESS(err);
13288
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013289 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013290 m_errorMonitor->VerifyFound();
13291 if (VK_SUCCESS == err) {
13292 vkDestroyPipeline(m_device->device(), pipeline, NULL);
13293 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013294 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
13295 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13296}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013297
Mike Stroyanaccf7692015-05-12 16:00:45 -060013298#if GTEST_IS_THREADSAFE
13299struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013300 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013301 VkEvent event;
13302 bool bailout;
13303};
13304
Karl Schultz6addd812016-02-02 17:17:23 -070013305extern "C" void *AddToCommandBuffer(void *arg) {
13306 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013307
Mike Stroyana6d14942016-07-13 15:10:05 -060013308 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013309 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013310 if (data->bailout) {
13311 break;
13312 }
13313 }
13314 return NULL;
13315}
13316
Karl Schultz6addd812016-02-02 17:17:23 -070013317TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013318 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013319
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013320 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013321
Tony Barbour1fa09702017-03-16 12:09:08 -060013322 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanaccf7692015-05-12 16:00:45 -060013323 ASSERT_NO_FATAL_FAILURE(InitViewport());
13324 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13325
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013326 // Calls AllocateCommandBuffers
13327 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013328
13329 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013330 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013331
13332 VkEventCreateInfo event_info;
13333 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013334 VkResult err;
13335
13336 memset(&event_info, 0, sizeof(event_info));
13337 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13338
Chia-I Wuf7458c52015-10-26 21:10:41 +080013339 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013340 ASSERT_VK_SUCCESS(err);
13341
Mike Stroyanaccf7692015-05-12 16:00:45 -060013342 err = vkResetEvent(device(), event);
13343 ASSERT_VK_SUCCESS(err);
13344
13345 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013346 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013347 data.event = event;
13348 data.bailout = false;
13349 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060013350
13351 // First do some correct operations using multiple threads.
13352 // Add many entries to command buffer from another thread.
13353 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
13354 // Make non-conflicting calls from this thread at the same time.
13355 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060013356 uint32_t count;
13357 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060013358 }
13359 test_platform_thread_join(thread, NULL);
13360
13361 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060013362 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013363 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013364 // Add many entries to command buffer from this thread at the same time.
13365 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013366
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013367 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013368 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013369
Mike Stroyan10b8cb72016-01-22 15:22:03 -070013370 m_errorMonitor->SetBailout(NULL);
13371
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013372 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013373
Chia-I Wuf7458c52015-10-26 21:10:41 +080013374 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013375}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013376#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013377
Karl Schultz6addd812016-02-02 17:17:23 -070013378TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013379 TEST_DESCRIPTION(
13380 "Test that an error is produced for a spirv module "
13381 "with an impossible code size");
Chris Forbes1cc79542016-07-20 11:13:44 +120013382
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013383 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013384
Tony Barbour1fa09702017-03-16 12:09:08 -060013385 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013386 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13387
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013388 VkShaderModule module;
13389 VkShaderModuleCreateInfo moduleCreateInfo;
13390 struct icd_spv_header spv;
13391
13392 spv.magic = ICD_SPV_MAGIC;
13393 spv.version = ICD_SPV_VERSION;
13394 spv.gen_magic = 0;
13395
13396 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13397 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013398 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013399 moduleCreateInfo.codeSize = 4;
13400 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013401 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013402
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013403 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013404}
13405
Karl Schultz6addd812016-02-02 17:17:23 -070013406TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013407 TEST_DESCRIPTION(
13408 "Test that an error is produced for a spirv module "
13409 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120013410
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013411 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013412
Tony Barbour1fa09702017-03-16 12:09:08 -060013413 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013414 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13415
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013416 VkShaderModule module;
13417 VkShaderModuleCreateInfo moduleCreateInfo;
13418 struct icd_spv_header spv;
13419
13420 spv.magic = ~ICD_SPV_MAGIC;
13421 spv.version = ICD_SPV_VERSION;
13422 spv.gen_magic = 0;
13423
13424 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13425 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013426 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013427 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13428 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013429 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013430
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013431 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013432}
13433
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013434#if 0
13435// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070013436TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013437 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013438 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013439
Tony Barbour1fa09702017-03-16 12:09:08 -060013440 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013441 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13442
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013443 VkShaderModule module;
13444 VkShaderModuleCreateInfo moduleCreateInfo;
13445 struct icd_spv_header spv;
13446
13447 spv.magic = ICD_SPV_MAGIC;
13448 spv.version = ~ICD_SPV_VERSION;
13449 spv.gen_magic = 0;
13450
13451 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13452 moduleCreateInfo.pNext = NULL;
13453
Karl Schultz6addd812016-02-02 17:17:23 -070013454 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013455 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13456 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013457 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013458
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013459 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013460}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013461#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013462
Karl Schultz6addd812016-02-02 17:17:23 -070013463TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013464 TEST_DESCRIPTION(
13465 "Test that a warning is produced for a vertex output that "
13466 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013467 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013468
Tony Barbour1fa09702017-03-16 12:09:08 -060013469 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013470 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013471
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013472 char const *vsSource =
13473 "#version 450\n"
13474 "\n"
13475 "layout(location=0) out float x;\n"
13476 "out gl_PerVertex {\n"
13477 " vec4 gl_Position;\n"
13478 "};\n"
13479 "void main(){\n"
13480 " gl_Position = vec4(1);\n"
13481 " x = 0;\n"
13482 "}\n";
13483 char const *fsSource =
13484 "#version 450\n"
13485 "\n"
13486 "layout(location=0) out vec4 color;\n"
13487 "void main(){\n"
13488 " color = vec4(1);\n"
13489 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120013490
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013491 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13492 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013493
13494 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013495 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013496 pipe.AddShader(&vs);
13497 pipe.AddShader(&fs);
13498
Chris Forbes9f7ff632015-05-25 11:13:08 +120013499 VkDescriptorSetObj descriptorSet(m_device);
13500 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013501 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013502
Tony Barbour5781e8f2015-08-04 16:23:11 -060013503 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013504
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013505 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013506}
Chris Forbes9f7ff632015-05-25 11:13:08 +120013507
Mark Mueller098c9cb2016-09-08 09:01:57 -060013508TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
13509 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13510
Tony Barbour1fa09702017-03-16 12:09:08 -060013511 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013512 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13513
13514 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013515 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013516
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013517 char const *vsSource =
13518 "#version 450\n"
13519 "\n"
13520 "out gl_PerVertex {\n"
13521 " vec4 gl_Position;\n"
13522 "};\n"
13523 "void main(){\n"
13524 " gl_Position = vec4(1);\n"
13525 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013526
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013527 char const *fsSource =
13528 "#version 450\n"
13529 "\n"
13530 "layout (constant_id = 0) const float r = 0.0f;\n"
13531 "layout(location = 0) out vec4 uFragColor;\n"
13532 "void main(){\n"
13533 " uFragColor = vec4(r,1,0,1);\n"
13534 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013535
13536 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13537 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13538
13539 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13540 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13541
13542 VkPipelineLayout pipeline_layout;
13543 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13544
13545 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
13546 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13547 vp_state_create_info.viewportCount = 1;
13548 VkViewport viewport = {};
13549 vp_state_create_info.pViewports = &viewport;
13550 vp_state_create_info.scissorCount = 1;
13551 VkRect2D scissors = {};
13552 vp_state_create_info.pScissors = &scissors;
13553
13554 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
13555
13556 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
13557 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
13558 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
13559 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
13560
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013561 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060013562
13563 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
13564 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13565
13566 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
13567 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13568 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13569
13570 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
13571 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
13572 rasterization_state_create_info.pNext = nullptr;
13573 rasterization_state_create_info.lineWidth = 1.0f;
13574 rasterization_state_create_info.rasterizerDiscardEnable = true;
13575
13576 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
13577 color_blend_attachment_state.blendEnable = VK_FALSE;
13578 color_blend_attachment_state.colorWriteMask = 0xf;
13579
13580 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
13581 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13582 color_blend_state_create_info.attachmentCount = 1;
13583 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
13584
13585 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
13586 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13587 graphicspipe_create_info.stageCount = 2;
13588 graphicspipe_create_info.pStages = shader_stage_create_info;
13589 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
13590 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
13591 graphicspipe_create_info.pViewportState = &vp_state_create_info;
13592 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
13593 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
13594 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
13595 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13596 graphicspipe_create_info.layout = pipeline_layout;
13597 graphicspipe_create_info.renderPass = renderPass();
13598
13599 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
13600 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13601
13602 VkPipelineCache pipelineCache;
13603 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
13604
13605 // This structure maps constant ids to data locations.
13606 const VkSpecializationMapEntry entry =
13607 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013608 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013609
13610 uint32_t data = 1;
13611
13612 // Set up the info describing spec map and data
13613 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013614 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060013615 };
13616 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
13617
13618 VkPipeline pipeline;
13619 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
13620 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
13621 m_errorMonitor->VerifyFound();
13622
13623 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
13624 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13625}
13626
13627TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
13628 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13629
Tony Barbour1fa09702017-03-16 12:09:08 -060013630 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013631 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13632
13633 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
13634
13635 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
13636 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13637 descriptor_pool_type_count[0].descriptorCount = 1;
13638 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13639 descriptor_pool_type_count[1].descriptorCount = 1;
13640
13641 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13642 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13643 descriptor_pool_create_info.maxSets = 1;
13644 descriptor_pool_create_info.poolSizeCount = 2;
13645 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
13646 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13647
13648 VkDescriptorPool descriptorset_pool;
13649 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13650
13651 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13652 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13653 descriptorset_layout_binding.descriptorCount = 1;
13654 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
Cody Northropa6484fd2017-03-10 14:13:49 -070013655 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013656
13657 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13658 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13659 descriptorset_layout_create_info.bindingCount = 1;
13660 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13661
13662 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013663 ASSERT_VK_SUCCESS(
13664 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013665
13666 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13667 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13668 descriptorset_allocate_info.descriptorSetCount = 1;
13669 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13670 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13671 VkDescriptorSet descriptorset;
13672 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13673
13674 // Challenge core_validation with a non uniform buffer type.
13675 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
13676
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013677 char const *vsSource =
13678 "#version 450\n"
13679 "\n"
13680 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13681 " mat4 mvp;\n"
13682 "} ubuf;\n"
13683 "out gl_PerVertex {\n"
13684 " vec4 gl_Position;\n"
13685 "};\n"
13686 "void main(){\n"
13687 " gl_Position = ubuf.mvp * vec4(1);\n"
13688 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013689
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013690 char const *fsSource =
13691 "#version 450\n"
13692 "\n"
13693 "layout(location = 0) out vec4 uFragColor;\n"
13694 "void main(){\n"
13695 " uFragColor = vec4(0,1,0,1);\n"
13696 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013697
13698 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13699 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13700
13701 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13702 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13703 pipeline_layout_create_info.setLayoutCount = 1;
13704 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13705
13706 VkPipelineLayout pipeline_layout;
13707 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13708
13709 VkPipelineObj pipe(m_device);
13710 pipe.AddColorAttachment();
13711 pipe.AddShader(&vs);
13712 pipe.AddShader(&fs);
13713
13714 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
13715 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13716 m_errorMonitor->VerifyFound();
13717
13718 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13719 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13720 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13721}
13722
13723TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
13724 TEST_DESCRIPTION(
13725 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
13726
Tony Barbour1fa09702017-03-16 12:09:08 -060013727 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013728 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13729
13730 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
13731
13732 VkDescriptorPoolSize descriptor_pool_type_count = {};
13733 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13734 descriptor_pool_type_count.descriptorCount = 1;
13735
13736 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13737 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13738 descriptor_pool_create_info.maxSets = 1;
13739 descriptor_pool_create_info.poolSizeCount = 1;
13740 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
13741 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13742
13743 VkDescriptorPool descriptorset_pool;
13744 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13745
13746 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13747 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13748 descriptorset_layout_binding.descriptorCount = 1;
13749 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
13750 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
Cody Northropa6484fd2017-03-10 14:13:49 -070013751 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013752
13753 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13754 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13755 descriptorset_layout_create_info.bindingCount = 1;
13756 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13757
13758 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013759 ASSERT_VK_SUCCESS(
13760 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013761
13762 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13763 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13764 descriptorset_allocate_info.descriptorSetCount = 1;
13765 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13766 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13767 VkDescriptorSet descriptorset;
13768 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13769
13770 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
13771
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013772 char const *vsSource =
13773 "#version 450\n"
13774 "\n"
13775 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13776 " mat4 mvp;\n"
13777 "} ubuf;\n"
13778 "out gl_PerVertex {\n"
13779 " vec4 gl_Position;\n"
13780 "};\n"
13781 "void main(){\n"
13782 " gl_Position = ubuf.mvp * vec4(1);\n"
13783 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013784
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013785 char const *fsSource =
13786 "#version 450\n"
13787 "\n"
13788 "layout(location = 0) out vec4 uFragColor;\n"
13789 "void main(){\n"
13790 " uFragColor = vec4(0,1,0,1);\n"
13791 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013792
13793 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13794 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13795
13796 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13797 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13798 pipeline_layout_create_info.setLayoutCount = 1;
13799 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13800
13801 VkPipelineLayout pipeline_layout;
13802 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13803
13804 VkPipelineObj pipe(m_device);
13805 pipe.AddColorAttachment();
13806 pipe.AddShader(&vs);
13807 pipe.AddShader(&fs);
13808
13809 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
13810 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13811 m_errorMonitor->VerifyFound();
13812
13813 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13814 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13815 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13816}
13817
13818TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013819 TEST_DESCRIPTION(
13820 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
13821 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060013822
Tony Barbour1fa09702017-03-16 12:09:08 -060013823 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013824 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13825
13826 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013827 "Push constant range covering variable starting at offset 0 not accessible from stage VK_SHADER_STAGE_VERTEX_BIT";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013828
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013829 char const *vsSource =
13830 "#version 450\n"
13831 "\n"
13832 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13833 "out gl_PerVertex {\n"
13834 " vec4 gl_Position;\n"
13835 "};\n"
13836 "void main(){\n"
13837 " gl_Position = vec4(consts.x);\n"
13838 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013839
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013840 char const *fsSource =
13841 "#version 450\n"
13842 "\n"
13843 "layout(location = 0) out vec4 uFragColor;\n"
13844 "void main(){\n"
13845 " uFragColor = vec4(0,1,0,1);\n"
13846 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013847
13848 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13849 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13850
13851 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13852 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13853
13854 // Set up a push constant range
13855 VkPushConstantRange push_constant_ranges = {};
13856 // Set to the wrong stage to challenge core_validation
13857 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13858 push_constant_ranges.size = 4;
13859
13860 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
13861 pipeline_layout_create_info.pushConstantRangeCount = 1;
13862
13863 VkPipelineLayout pipeline_layout;
13864 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13865
13866 VkPipelineObj pipe(m_device);
13867 pipe.AddColorAttachment();
13868 pipe.AddShader(&vs);
13869 pipe.AddShader(&fs);
13870
13871 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
13872 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13873 m_errorMonitor->VerifyFound();
13874
13875 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13876}
13877
13878TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
13879 TEST_DESCRIPTION(
13880 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
13881
Tony Barbour1fa09702017-03-16 12:09:08 -060013882 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013883 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13884
13885 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013886 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013887
13888 // Some awkward steps are required to test with custom device features.
13889 std::vector<const char *> device_extension_names;
13890 auto features = m_device->phy().features();
13891 // Disable support for 64 bit floats
13892 features.shaderFloat64 = false;
13893 // The sacrificial device object
13894 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
13895
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013896 char const *vsSource =
13897 "#version 450\n"
13898 "\n"
13899 "out gl_PerVertex {\n"
13900 " vec4 gl_Position;\n"
13901 "};\n"
13902 "void main(){\n"
13903 " gl_Position = vec4(1);\n"
13904 "}\n";
13905 char const *fsSource =
13906 "#version 450\n"
13907 "\n"
13908 "layout(location=0) out vec4 color;\n"
13909 "void main(){\n"
13910 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
13911 " color = vec4(green);\n"
13912 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013913
13914 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13915 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13916
13917 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060013918
13919 VkPipelineObj pipe(&test_device);
13920 pipe.AddColorAttachment();
13921 pipe.AddShader(&vs);
13922 pipe.AddShader(&fs);
13923
13924 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13925 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13926 VkPipelineLayout pipeline_layout;
13927 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13928
13929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
13930 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
13931 m_errorMonitor->VerifyFound();
13932
13933 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
13934}
13935
Mark Lobodzinski20832822017-03-24 14:49:45 -060013936TEST_F(VkLayerTest, CreateShaderModuleCheckBadCapability) {
13937 TEST_DESCRIPTION("Create a shader in which a capability declared by the shader is not supported.");
13938 // Note that this failure message comes from spirv-tools, specifically the validator.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013939
Tony Barbour1fa09702017-03-16 12:09:08 -060013940 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013941 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13942
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013943 char const *vsSource =
13944 "#version 450\n"
13945 "\n"
13946 "out gl_PerVertex {\n"
13947 " vec4 gl_Position;\n"
13948 "};\n"
13949 "layout(xfb_buffer = 1) out;"
13950 "void main(){\n"
13951 " gl_Position = vec4(1);\n"
13952 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013953
Mark Lobodzinski20832822017-03-24 14:49:45 -060013954 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Capability value 53 is not allowed by Vulkan");
Mark Mueller098c9cb2016-09-08 09:01:57 -060013955
Mark Lobodzinski20832822017-03-24 14:49:45 -060013956 std::vector<unsigned int> spv;
13957 VkShaderModuleCreateInfo module_create_info;
13958 VkShaderModule shader_module;
13959 module_create_info.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13960 module_create_info.pNext = NULL;
13961 this->GLSLtoSPV(VK_SHADER_STAGE_VERTEX_BIT, vsSource, spv);
13962 module_create_info.pCode = spv.data();
13963 module_create_info.codeSize = spv.size() * sizeof(unsigned int);
13964 module_create_info.flags = 0;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013965
Mark Lobodzinski20832822017-03-24 14:49:45 -060013966 vkCreateShaderModule(m_device->handle(), &module_create_info, NULL, &shader_module);
Mark Mueller098c9cb2016-09-08 09:01:57 -060013967
Mark Lobodzinski20832822017-03-24 14:49:45 -060013968 m_errorMonitor->VerifyFound();
Mark Mueller098c9cb2016-09-08 09:01:57 -060013969}
13970
Karl Schultz6addd812016-02-02 17:17:23 -070013971TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013972 TEST_DESCRIPTION(
13973 "Test that an error is produced for a fragment shader input "
13974 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120013975
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013976 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013977
Tony Barbour1fa09702017-03-16 12:09:08 -060013978 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013979 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120013980
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013981 char const *vsSource =
13982 "#version 450\n"
13983 "\n"
13984 "out gl_PerVertex {\n"
13985 " vec4 gl_Position;\n"
13986 "};\n"
13987 "void main(){\n"
13988 " gl_Position = vec4(1);\n"
13989 "}\n";
13990 char const *fsSource =
13991 "#version 450\n"
13992 "\n"
13993 "layout(location=0) in float x;\n"
13994 "layout(location=0) out vec4 color;\n"
13995 "void main(){\n"
13996 " color = vec4(x);\n"
13997 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120013998
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013999 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14000 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014001
14002 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014003 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014004 pipe.AddShader(&vs);
14005 pipe.AddShader(&fs);
14006
Chris Forbes59cb88d2015-05-25 11:13:13 +120014007 VkDescriptorSetObj descriptorSet(m_device);
14008 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014009 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014010
Tony Barbour5781e8f2015-08-04 16:23:11 -060014011 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014012
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014013 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014014}
14015
Karl Schultz6addd812016-02-02 17:17:23 -070014016TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014017 TEST_DESCRIPTION(
14018 "Test that an error is produced for a fragment shader input "
14019 "within an interace block, which is not present in the outputs "
14020 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014021 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014022
Tony Barbour1fa09702017-03-16 12:09:08 -060014023 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014024 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14025
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014026 char const *vsSource =
14027 "#version 450\n"
14028 "\n"
14029 "out gl_PerVertex {\n"
14030 " vec4 gl_Position;\n"
14031 "};\n"
14032 "void main(){\n"
14033 " gl_Position = vec4(1);\n"
14034 "}\n";
14035 char const *fsSource =
14036 "#version 450\n"
14037 "\n"
14038 "in block { layout(location=0) float x; } ins;\n"
14039 "layout(location=0) out vec4 color;\n"
14040 "void main(){\n"
14041 " color = vec4(ins.x);\n"
14042 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014043
14044 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14045 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14046
14047 VkPipelineObj pipe(m_device);
14048 pipe.AddColorAttachment();
14049 pipe.AddShader(&vs);
14050 pipe.AddShader(&fs);
14051
14052 VkDescriptorSetObj descriptorSet(m_device);
14053 descriptorSet.AppendDummy();
14054 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14055
14056 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14057
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014058 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014059}
14060
Karl Schultz6addd812016-02-02 17:17:23 -070014061TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014062 TEST_DESCRIPTION(
14063 "Test that an error is produced for mismatched array sizes "
14064 "across the vertex->fragment shader interface");
14065 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14066 "Type mismatch on location 0.0: 'ptr to "
14067 "output arr[2] of float32' vs 'ptr to "
14068 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130014069
Tony Barbour1fa09702017-03-16 12:09:08 -060014070 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes0036fd12016-01-26 14:19:49 +130014071 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14072
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014073 char const *vsSource =
14074 "#version 450\n"
14075 "\n"
14076 "layout(location=0) out float x[2];\n"
14077 "out gl_PerVertex {\n"
14078 " vec4 gl_Position;\n"
14079 "};\n"
14080 "void main(){\n"
14081 " x[0] = 0; x[1] = 0;\n"
14082 " gl_Position = vec4(1);\n"
14083 "}\n";
14084 char const *fsSource =
14085 "#version 450\n"
14086 "\n"
14087 "layout(location=0) in float x[1];\n"
14088 "layout(location=0) out vec4 color;\n"
14089 "void main(){\n"
14090 " color = vec4(x[0]);\n"
14091 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130014092
14093 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14094 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14095
14096 VkPipelineObj pipe(m_device);
14097 pipe.AddColorAttachment();
14098 pipe.AddShader(&vs);
14099 pipe.AddShader(&fs);
14100
14101 VkDescriptorSetObj descriptorSet(m_device);
14102 descriptorSet.AppendDummy();
14103 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14104
14105 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14106
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014107 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130014108}
14109
Karl Schultz6addd812016-02-02 17:17:23 -070014110TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014111 TEST_DESCRIPTION(
14112 "Test that an error is produced for mismatched types across "
14113 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014114 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014115
Tony Barbour1fa09702017-03-16 12:09:08 -060014116 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014117 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120014118
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014119 char const *vsSource =
14120 "#version 450\n"
14121 "\n"
14122 "layout(location=0) out int x;\n"
14123 "out gl_PerVertex {\n"
14124 " vec4 gl_Position;\n"
14125 "};\n"
14126 "void main(){\n"
14127 " x = 0;\n"
14128 " gl_Position = vec4(1);\n"
14129 "}\n";
14130 char const *fsSource =
14131 "#version 450\n"
14132 "\n"
14133 "layout(location=0) in float x;\n" /* VS writes int */
14134 "layout(location=0) out vec4 color;\n"
14135 "void main(){\n"
14136 " color = vec4(x);\n"
14137 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120014138
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014139 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14140 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120014141
14142 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014143 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120014144 pipe.AddShader(&vs);
14145 pipe.AddShader(&fs);
14146
Chris Forbesb56af562015-05-25 11:13:17 +120014147 VkDescriptorSetObj descriptorSet(m_device);
14148 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014149 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120014150
Tony Barbour5781e8f2015-08-04 16:23:11 -060014151 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120014152
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014153 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120014154}
14155
Karl Schultz6addd812016-02-02 17:17:23 -070014156TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014157 TEST_DESCRIPTION(
14158 "Test that an error is produced for mismatched types across "
14159 "the vertex->fragment shader interface, when the variable is contained within "
14160 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014161 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014162
Tony Barbour1fa09702017-03-16 12:09:08 -060014163 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014164 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14165
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014166 char const *vsSource =
14167 "#version 450\n"
14168 "\n"
14169 "out block { layout(location=0) int x; } outs;\n"
14170 "out gl_PerVertex {\n"
14171 " vec4 gl_Position;\n"
14172 "};\n"
14173 "void main(){\n"
14174 " outs.x = 0;\n"
14175 " gl_Position = vec4(1);\n"
14176 "}\n";
14177 char const *fsSource =
14178 "#version 450\n"
14179 "\n"
14180 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
14181 "layout(location=0) out vec4 color;\n"
14182 "void main(){\n"
14183 " color = vec4(ins.x);\n"
14184 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014185
14186 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14187 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14188
14189 VkPipelineObj pipe(m_device);
14190 pipe.AddColorAttachment();
14191 pipe.AddShader(&vs);
14192 pipe.AddShader(&fs);
14193
14194 VkDescriptorSetObj descriptorSet(m_device);
14195 descriptorSet.AppendDummy();
14196 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14197
14198 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14199
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014200 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014201}
14202
14203TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014204 TEST_DESCRIPTION(
14205 "Test that an error is produced for location mismatches across "
14206 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
14207 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014208 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 +130014209
Tony Barbour1fa09702017-03-16 12:09:08 -060014210 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014211 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14212
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014213 char const *vsSource =
14214 "#version 450\n"
14215 "\n"
14216 "out block { layout(location=1) float x; } outs;\n"
14217 "out gl_PerVertex {\n"
14218 " vec4 gl_Position;\n"
14219 "};\n"
14220 "void main(){\n"
14221 " outs.x = 0;\n"
14222 " gl_Position = vec4(1);\n"
14223 "}\n";
14224 char const *fsSource =
14225 "#version 450\n"
14226 "\n"
14227 "in block { layout(location=0) float x; } ins;\n"
14228 "layout(location=0) out vec4 color;\n"
14229 "void main(){\n"
14230 " color = vec4(ins.x);\n"
14231 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014232
14233 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14234 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14235
14236 VkPipelineObj pipe(m_device);
14237 pipe.AddColorAttachment();
14238 pipe.AddShader(&vs);
14239 pipe.AddShader(&fs);
14240
14241 VkDescriptorSetObj descriptorSet(m_device);
14242 descriptorSet.AppendDummy();
14243 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14244
14245 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14246
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014247 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014248}
14249
14250TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014251 TEST_DESCRIPTION(
14252 "Test that an error is produced for component mismatches across the "
14253 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
14254 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014255 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 +130014256
Tony Barbour1fa09702017-03-16 12:09:08 -060014257 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014258 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14259
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014260 char const *vsSource =
14261 "#version 450\n"
14262 "\n"
14263 "out block { layout(location=0, component=0) float x; } outs;\n"
14264 "out gl_PerVertex {\n"
14265 " vec4 gl_Position;\n"
14266 "};\n"
14267 "void main(){\n"
14268 " outs.x = 0;\n"
14269 " gl_Position = vec4(1);\n"
14270 "}\n";
14271 char const *fsSource =
14272 "#version 450\n"
14273 "\n"
14274 "in block { layout(location=0, component=1) float x; } ins;\n"
14275 "layout(location=0) out vec4 color;\n"
14276 "void main(){\n"
14277 " color = vec4(ins.x);\n"
14278 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014279
14280 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14281 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14282
14283 VkPipelineObj pipe(m_device);
14284 pipe.AddColorAttachment();
14285 pipe.AddShader(&vs);
14286 pipe.AddShader(&fs);
14287
14288 VkDescriptorSetObj descriptorSet(m_device);
14289 descriptorSet.AppendDummy();
14290 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14291
14292 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14293
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014294 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014295}
14296
Chris Forbes1f3b0152016-11-30 12:48:40 +130014297TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
14298 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14299
Tony Barbour1fa09702017-03-16 12:09:08 -060014300 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes1f3b0152016-11-30 12:48:40 +130014301 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14302
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014303 char const *vsSource =
14304 "#version 450\n"
14305 "layout(location=0) out mediump float x;\n"
14306 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14307 char const *fsSource =
14308 "#version 450\n"
14309 "layout(location=0) in highp float x;\n"
14310 "layout(location=0) out vec4 color;\n"
14311 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130014312
14313 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14314 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14315
14316 VkPipelineObj pipe(m_device);
14317 pipe.AddColorAttachment();
14318 pipe.AddShader(&vs);
14319 pipe.AddShader(&fs);
14320
14321 VkDescriptorSetObj descriptorSet(m_device);
14322 descriptorSet.AppendDummy();
14323 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14324
14325 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14326
14327 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14328
14329 m_errorMonitor->VerifyFound();
14330}
14331
Chris Forbes870a39e2016-11-30 12:55:56 +130014332TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
14333 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14334
Tony Barbour1fa09702017-03-16 12:09:08 -060014335 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes870a39e2016-11-30 12:55:56 +130014336 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14337
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014338 char const *vsSource =
14339 "#version 450\n"
14340 "out block { layout(location=0) mediump float x; };\n"
14341 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14342 char const *fsSource =
14343 "#version 450\n"
14344 "in block { layout(location=0) highp float x; };\n"
14345 "layout(location=0) out vec4 color;\n"
14346 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130014347
14348 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14349 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14350
14351 VkPipelineObj pipe(m_device);
14352 pipe.AddColorAttachment();
14353 pipe.AddShader(&vs);
14354 pipe.AddShader(&fs);
14355
14356 VkDescriptorSetObj descriptorSet(m_device);
14357 descriptorSet.AppendDummy();
14358 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14359
14360 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14361
14362 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14363
14364 m_errorMonitor->VerifyFound();
14365}
14366
Karl Schultz6addd812016-02-02 17:17:23 -070014367TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014368 TEST_DESCRIPTION(
14369 "Test that a warning is produced for a vertex attribute which is "
14370 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014371 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014372
Tony Barbour1fa09702017-03-16 12:09:08 -060014373 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014374 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120014375
14376 VkVertexInputBindingDescription input_binding;
14377 memset(&input_binding, 0, sizeof(input_binding));
14378
14379 VkVertexInputAttributeDescription input_attrib;
14380 memset(&input_attrib, 0, sizeof(input_attrib));
14381 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14382
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014383 char const *vsSource =
14384 "#version 450\n"
14385 "\n"
14386 "out gl_PerVertex {\n"
14387 " vec4 gl_Position;\n"
14388 "};\n"
14389 "void main(){\n"
14390 " gl_Position = vec4(1);\n"
14391 "}\n";
14392 char const *fsSource =
14393 "#version 450\n"
14394 "\n"
14395 "layout(location=0) out vec4 color;\n"
14396 "void main(){\n"
14397 " color = vec4(1);\n"
14398 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120014399
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014400 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14401 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120014402
14403 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014404 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120014405 pipe.AddShader(&vs);
14406 pipe.AddShader(&fs);
14407
14408 pipe.AddVertexInputBindings(&input_binding, 1);
14409 pipe.AddVertexInputAttribs(&input_attrib, 1);
14410
Chris Forbesde136e02015-05-25 11:13:28 +120014411 VkDescriptorSetObj descriptorSet(m_device);
14412 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014413 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120014414
Tony Barbour5781e8f2015-08-04 16:23:11 -060014415 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120014416
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014417 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120014418}
14419
Karl Schultz6addd812016-02-02 17:17:23 -070014420TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014421 TEST_DESCRIPTION(
14422 "Test that a warning is produced for a location mismatch on "
14423 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014424 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014425
Tony Barbour1fa09702017-03-16 12:09:08 -060014426 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes7d83cd52016-01-15 11:32:03 +130014427 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14428
14429 VkVertexInputBindingDescription input_binding;
14430 memset(&input_binding, 0, sizeof(input_binding));
14431
14432 VkVertexInputAttributeDescription input_attrib;
14433 memset(&input_attrib, 0, sizeof(input_attrib));
14434 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14435
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014436 char const *vsSource =
14437 "#version 450\n"
14438 "\n"
14439 "layout(location=1) in float x;\n"
14440 "out gl_PerVertex {\n"
14441 " vec4 gl_Position;\n"
14442 "};\n"
14443 "void main(){\n"
14444 " gl_Position = vec4(x);\n"
14445 "}\n";
14446 char const *fsSource =
14447 "#version 450\n"
14448 "\n"
14449 "layout(location=0) out vec4 color;\n"
14450 "void main(){\n"
14451 " color = vec4(1);\n"
14452 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130014453
14454 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14455 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14456
14457 VkPipelineObj pipe(m_device);
14458 pipe.AddColorAttachment();
14459 pipe.AddShader(&vs);
14460 pipe.AddShader(&fs);
14461
14462 pipe.AddVertexInputBindings(&input_binding, 1);
14463 pipe.AddVertexInputAttribs(&input_attrib, 1);
14464
14465 VkDescriptorSetObj descriptorSet(m_device);
14466 descriptorSet.AppendDummy();
14467 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14468
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070014469 m_errorMonitor->SetUnexpectedError("Vertex shader consumes input at location 1 but not provided");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014470 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14471
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014472 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130014473}
14474
Karl Schultz6addd812016-02-02 17:17:23 -070014475TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014476 TEST_DESCRIPTION(
14477 "Test that an error is produced for a vertex shader input which is not "
14478 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14480 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014481
Tony Barbour1fa09702017-03-16 12:09:08 -060014482 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014483 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120014484
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014485 char const *vsSource =
14486 "#version 450\n"
14487 "\n"
14488 "layout(location=0) in vec4 x;\n" /* not provided */
14489 "out gl_PerVertex {\n"
14490 " vec4 gl_Position;\n"
14491 "};\n"
14492 "void main(){\n"
14493 " gl_Position = x;\n"
14494 "}\n";
14495 char const *fsSource =
14496 "#version 450\n"
14497 "\n"
14498 "layout(location=0) out vec4 color;\n"
14499 "void main(){\n"
14500 " color = vec4(1);\n"
14501 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120014502
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014503 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14504 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120014505
14506 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014507 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120014508 pipe.AddShader(&vs);
14509 pipe.AddShader(&fs);
14510
Chris Forbes62e8e502015-05-25 11:13:29 +120014511 VkDescriptorSetObj descriptorSet(m_device);
14512 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014513 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120014514
Tony Barbour5781e8f2015-08-04 16:23:11 -060014515 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120014516
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014517 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120014518}
14519
Karl Schultz6addd812016-02-02 17:17:23 -070014520TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014521 TEST_DESCRIPTION(
14522 "Test that an error is produced for a mismatch between the "
14523 "fundamental type (float/int/uint) of an attribute and the "
14524 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060014525 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 -060014526
Tony Barbour1fa09702017-03-16 12:09:08 -060014527 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014528 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014529
14530 VkVertexInputBindingDescription input_binding;
14531 memset(&input_binding, 0, sizeof(input_binding));
14532
14533 VkVertexInputAttributeDescription input_attrib;
14534 memset(&input_attrib, 0, sizeof(input_attrib));
14535 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14536
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014537 char const *vsSource =
14538 "#version 450\n"
14539 "\n"
14540 "layout(location=0) in int x;\n" /* attrib provided float */
14541 "out gl_PerVertex {\n"
14542 " vec4 gl_Position;\n"
14543 "};\n"
14544 "void main(){\n"
14545 " gl_Position = vec4(x);\n"
14546 "}\n";
14547 char const *fsSource =
14548 "#version 450\n"
14549 "\n"
14550 "layout(location=0) out vec4 color;\n"
14551 "void main(){\n"
14552 " color = vec4(1);\n"
14553 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120014554
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014555 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14556 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014557
14558 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014559 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014560 pipe.AddShader(&vs);
14561 pipe.AddShader(&fs);
14562
14563 pipe.AddVertexInputBindings(&input_binding, 1);
14564 pipe.AddVertexInputAttribs(&input_attrib, 1);
14565
Chris Forbesc97d98e2015-05-25 11:13:31 +120014566 VkDescriptorSetObj descriptorSet(m_device);
14567 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014568 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014569
Tony Barbour5781e8f2015-08-04 16:23:11 -060014570 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014571
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014572 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014573}
14574
Chris Forbesc68b43c2016-04-06 11:18:47 +120014575TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014576 TEST_DESCRIPTION(
14577 "Test that an error is produced for a pipeline containing multiple "
14578 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014579 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14580 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120014581
Tony Barbour1fa09702017-03-16 12:09:08 -060014582 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc68b43c2016-04-06 11:18:47 +120014583 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14584
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014585 char const *vsSource =
14586 "#version 450\n"
14587 "\n"
14588 "out gl_PerVertex {\n"
14589 " vec4 gl_Position;\n"
14590 "};\n"
14591 "void main(){\n"
14592 " gl_Position = vec4(1);\n"
14593 "}\n";
14594 char const *fsSource =
14595 "#version 450\n"
14596 "\n"
14597 "layout(location=0) out vec4 color;\n"
14598 "void main(){\n"
14599 " color = vec4(1);\n"
14600 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120014601
14602 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14603 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14604
14605 VkPipelineObj pipe(m_device);
14606 pipe.AddColorAttachment();
14607 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014608 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120014609 pipe.AddShader(&fs);
14610
14611 VkDescriptorSetObj descriptorSet(m_device);
14612 descriptorSet.AppendDummy();
14613 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14614
14615 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14616
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014617 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120014618}
14619
Chris Forbes82ff92a2016-09-09 10:50:24 +120014620TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014621 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120014622
Tony Barbour1fa09702017-03-16 12:09:08 -060014623 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes82ff92a2016-09-09 10:50:24 +120014624 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14625
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014626 char const *vsSource =
14627 "#version 450\n"
14628 "out gl_PerVertex {\n"
14629 " vec4 gl_Position;\n"
14630 "};\n"
14631 "void main(){\n"
14632 " gl_Position = vec4(0);\n"
14633 "}\n";
14634 char const *fsSource =
14635 "#version 450\n"
14636 "\n"
14637 "layout(location=0) out vec4 color;\n"
14638 "void main(){\n"
14639 " color = vec4(1);\n"
14640 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120014641
14642 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14643 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
14644
14645 VkPipelineObj pipe(m_device);
14646 pipe.AddColorAttachment();
14647 pipe.AddShader(&vs);
14648 pipe.AddShader(&fs);
14649
14650 VkDescriptorSetObj descriptorSet(m_device);
14651 descriptorSet.AppendDummy();
14652 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14653
14654 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14655
14656 m_errorMonitor->VerifyFound();
14657}
14658
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014659TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014660 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14661 "pDepthStencilState is NULL when rasterization is enabled and subpass "
14662 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014663
Tony Barbour1fa09702017-03-16 12:09:08 -060014664 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014665 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14666
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014667 char const *vsSource =
14668 "#version 450\n"
14669 "void main(){ gl_Position = vec4(0); }\n";
14670 char const *fsSource =
14671 "#version 450\n"
14672 "\n"
14673 "layout(location=0) out vec4 color;\n"
14674 "void main(){\n"
14675 " color = vec4(1);\n"
14676 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014677
14678 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14679 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14680
14681 VkPipelineObj pipe(m_device);
14682 pipe.AddColorAttachment();
14683 pipe.AddShader(&vs);
14684 pipe.AddShader(&fs);
14685
14686 VkDescriptorSetObj descriptorSet(m_device);
14687 descriptorSet.AppendDummy();
14688 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14689
14690 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014691 {
14692 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14693 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14694 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014695 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014696 {
14697 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14698 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14699 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014700 },
14701 };
14702 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014703 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014704 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014705 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
14706 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014707 VkRenderPass rp;
14708 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14709 ASSERT_VK_SUCCESS(err);
14710
14711 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
14712
14713 m_errorMonitor->VerifyFound();
14714
14715 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14716}
14717
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014718TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014719 TEST_DESCRIPTION(
14720 "Test that an error is produced for a variable output from "
14721 "the TCS without the patch decoration, but consumed in the TES "
14722 "with the decoration.");
14723 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14724 "is per-vertex in tessellation control shader stage "
14725 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120014726
Tony Barbour1fa09702017-03-16 12:09:08 -060014727 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa0193bc2016-04-04 19:19:47 +120014728 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14729
Chris Forbesc1e852d2016-04-04 19:26:42 +120014730 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070014731 printf(" Device does not support tessellation shaders; skipped.\n");
Chris Forbesc1e852d2016-04-04 19:26:42 +120014732 return;
14733 }
14734
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014735 char const *vsSource =
14736 "#version 450\n"
14737 "void main(){}\n";
14738 char const *tcsSource =
14739 "#version 450\n"
14740 "layout(location=0) out int x[];\n"
14741 "layout(vertices=3) out;\n"
14742 "void main(){\n"
14743 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14744 " gl_TessLevelInner[0] = 1;\n"
14745 " x[gl_InvocationID] = gl_InvocationID;\n"
14746 "}\n";
14747 char const *tesSource =
14748 "#version 450\n"
14749 "layout(triangles, equal_spacing, cw) in;\n"
14750 "layout(location=0) patch in int x;\n"
14751 "out gl_PerVertex { vec4 gl_Position; };\n"
14752 "void main(){\n"
14753 " gl_Position.xyz = gl_TessCoord;\n"
14754 " gl_Position.w = x;\n"
14755 "}\n";
14756 char const *fsSource =
14757 "#version 450\n"
14758 "layout(location=0) out vec4 color;\n"
14759 "void main(){\n"
14760 " color = vec4(1);\n"
14761 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120014762
14763 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14764 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
14765 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
14766 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14767
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014768 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
14769 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014770
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014771 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014772
14773 VkPipelineObj pipe(m_device);
14774 pipe.SetInputAssembly(&iasci);
14775 pipe.SetTessellation(&tsci);
14776 pipe.AddColorAttachment();
14777 pipe.AddShader(&vs);
14778 pipe.AddShader(&tcs);
14779 pipe.AddShader(&tes);
14780 pipe.AddShader(&fs);
14781
14782 VkDescriptorSetObj descriptorSet(m_device);
14783 descriptorSet.AppendDummy();
14784 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14785
14786 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14787
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014788 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120014789}
14790
Karl Schultz6addd812016-02-02 17:17:23 -070014791TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014792 TEST_DESCRIPTION(
14793 "Test that an error is produced for a vertex attribute setup where multiple "
14794 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014795 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14796 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014797
Tony Barbour1fa09702017-03-16 12:09:08 -060014798 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014799 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014800
14801 /* Two binding descriptions for binding 0 */
14802 VkVertexInputBindingDescription input_bindings[2];
14803 memset(input_bindings, 0, sizeof(input_bindings));
14804
14805 VkVertexInputAttributeDescription input_attrib;
14806 memset(&input_attrib, 0, sizeof(input_attrib));
14807 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14808
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014809 char const *vsSource =
14810 "#version 450\n"
14811 "\n"
14812 "layout(location=0) in float x;\n" /* attrib provided float */
14813 "out gl_PerVertex {\n"
14814 " vec4 gl_Position;\n"
14815 "};\n"
14816 "void main(){\n"
14817 " gl_Position = vec4(x);\n"
14818 "}\n";
14819 char const *fsSource =
14820 "#version 450\n"
14821 "\n"
14822 "layout(location=0) out vec4 color;\n"
14823 "void main(){\n"
14824 " color = vec4(1);\n"
14825 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120014826
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014827 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14828 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014829
14830 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014831 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014832 pipe.AddShader(&vs);
14833 pipe.AddShader(&fs);
14834
14835 pipe.AddVertexInputBindings(input_bindings, 2);
14836 pipe.AddVertexInputAttribs(&input_attrib, 1);
14837
Chris Forbes280ba2c2015-06-12 11:16:41 +120014838 VkDescriptorSetObj descriptorSet(m_device);
14839 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014840 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014841
Tony Barbour5781e8f2015-08-04 16:23:11 -060014842 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014843
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014844 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014845}
Chris Forbes8f68b562015-05-25 11:13:32 +120014846
Karl Schultz6addd812016-02-02 17:17:23 -070014847TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014848 TEST_DESCRIPTION(
14849 "Test that an error is produced for a fragment shader which does not "
14850 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014851 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014852
Tony Barbour1fa09702017-03-16 12:09:08 -060014853 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014854
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014855 char const *vsSource =
14856 "#version 450\n"
14857 "\n"
14858 "out gl_PerVertex {\n"
14859 " vec4 gl_Position;\n"
14860 "};\n"
14861 "void main(){\n"
14862 " gl_Position = vec4(1);\n"
14863 "}\n";
14864 char const *fsSource =
14865 "#version 450\n"
14866 "\n"
14867 "void main(){\n"
14868 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014869
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014870 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14871 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014872
14873 VkPipelineObj pipe(m_device);
14874 pipe.AddShader(&vs);
14875 pipe.AddShader(&fs);
14876
Chia-I Wu08accc62015-07-07 11:50:03 +080014877 /* set up CB 0, not written */
14878 pipe.AddColorAttachment();
14879 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014880
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014881 VkDescriptorSetObj descriptorSet(m_device);
14882 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014883 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014884
Tony Barbour5781e8f2015-08-04 16:23:11 -060014885 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014886
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014887 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014888}
14889
Karl Schultz6addd812016-02-02 17:17:23 -070014890TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014891 TEST_DESCRIPTION(
14892 "Test that a warning is produced for a fragment shader which provides a spurious "
14893 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014894 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060014895 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014896
Tony Barbour1fa09702017-03-16 12:09:08 -060014897 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014898
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014899 char const *vsSource =
14900 "#version 450\n"
14901 "\n"
14902 "out gl_PerVertex {\n"
14903 " vec4 gl_Position;\n"
14904 "};\n"
14905 "void main(){\n"
14906 " gl_Position = vec4(1);\n"
14907 "}\n";
14908 char const *fsSource =
14909 "#version 450\n"
14910 "\n"
14911 "layout(location=0) out vec4 x;\n"
14912 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
14913 "void main(){\n"
14914 " x = vec4(1);\n"
14915 " y = vec4(1);\n"
14916 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014917
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014918 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14919 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014920
14921 VkPipelineObj pipe(m_device);
14922 pipe.AddShader(&vs);
14923 pipe.AddShader(&fs);
14924
Chia-I Wu08accc62015-07-07 11:50:03 +080014925 /* set up CB 0, not written */
14926 pipe.AddColorAttachment();
14927 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014928 /* FS writes CB 1, but we don't configure it */
14929
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014930 VkDescriptorSetObj descriptorSet(m_device);
14931 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014932 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014933
Tony Barbour5781e8f2015-08-04 16:23:11 -060014934 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014935
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014936 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014937}
14938
Karl Schultz6addd812016-02-02 17:17:23 -070014939TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014940 TEST_DESCRIPTION(
14941 "Test that an error is produced for a mismatch between the fundamental "
14942 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014943 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014944
Tony Barbour1fa09702017-03-16 12:09:08 -060014945 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014946
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014947 char const *vsSource =
14948 "#version 450\n"
14949 "\n"
14950 "out gl_PerVertex {\n"
14951 " vec4 gl_Position;\n"
14952 "};\n"
14953 "void main(){\n"
14954 " gl_Position = vec4(1);\n"
14955 "}\n";
14956 char const *fsSource =
14957 "#version 450\n"
14958 "\n"
14959 "layout(location=0) out ivec4 x;\n" /* not UNORM */
14960 "void main(){\n"
14961 " x = ivec4(1);\n"
14962 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120014963
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014964 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14965 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014966
14967 VkPipelineObj pipe(m_device);
14968 pipe.AddShader(&vs);
14969 pipe.AddShader(&fs);
14970
Chia-I Wu08accc62015-07-07 11:50:03 +080014971 /* set up CB 0; type is UNORM by default */
14972 pipe.AddColorAttachment();
14973 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014974
Chris Forbesa36d69e2015-05-25 11:13:44 +120014975 VkDescriptorSetObj descriptorSet(m_device);
14976 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014977 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014978
Tony Barbour5781e8f2015-08-04 16:23:11 -060014979 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014980
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014981 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120014982}
Chris Forbes7b1b8932015-06-05 14:43:36 +120014983
Karl Schultz6addd812016-02-02 17:17:23 -070014984TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014985 TEST_DESCRIPTION(
14986 "Test that an error is produced for a shader consuming a uniform "
14987 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014988 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014989
Tony Barbour1fa09702017-03-16 12:09:08 -060014990 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes556c76c2015-08-14 12:04:59 +120014991
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014992 char const *vsSource =
14993 "#version 450\n"
14994 "\n"
14995 "out gl_PerVertex {\n"
14996 " vec4 gl_Position;\n"
14997 "};\n"
14998 "void main(){\n"
14999 " gl_Position = vec4(1);\n"
15000 "}\n";
15001 char const *fsSource =
15002 "#version 450\n"
15003 "\n"
15004 "layout(location=0) out vec4 x;\n"
15005 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
15006 "void main(){\n"
15007 " x = vec4(bar.y);\n"
15008 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120015009
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015010 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15011 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120015012
Chris Forbes556c76c2015-08-14 12:04:59 +120015013 VkPipelineObj pipe(m_device);
15014 pipe.AddShader(&vs);
15015 pipe.AddShader(&fs);
15016
15017 /* set up CB 0; type is UNORM by default */
15018 pipe.AddColorAttachment();
15019 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15020
15021 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015022 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120015023
15024 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15025
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015026 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120015027}
15028
Chris Forbes5c59e902016-02-26 16:56:09 +130015029TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015030 TEST_DESCRIPTION(
15031 "Test that an error is produced for a shader consuming push constants "
15032 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015033 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130015034
Tony Barbour1fa09702017-03-16 12:09:08 -060015035 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5c59e902016-02-26 16:56:09 +130015036
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015037 char const *vsSource =
15038 "#version 450\n"
15039 "\n"
15040 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
15041 "out gl_PerVertex {\n"
15042 " vec4 gl_Position;\n"
15043 "};\n"
15044 "void main(){\n"
15045 " gl_Position = vec4(consts.x);\n"
15046 "}\n";
15047 char const *fsSource =
15048 "#version 450\n"
15049 "\n"
15050 "layout(location=0) out vec4 x;\n"
15051 "void main(){\n"
15052 " x = vec4(1);\n"
15053 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130015054
15055 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15056 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15057
15058 VkPipelineObj pipe(m_device);
15059 pipe.AddShader(&vs);
15060 pipe.AddShader(&fs);
15061
15062 /* set up CB 0; type is UNORM by default */
15063 pipe.AddColorAttachment();
15064 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15065
15066 VkDescriptorSetObj descriptorSet(m_device);
15067 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15068
15069 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15070
15071 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015072 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130015073}
15074
Chris Forbes3fb17902016-08-22 14:57:55 +120015075TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015076 TEST_DESCRIPTION(
15077 "Test that an error is produced for a shader consuming an input attachment "
15078 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120015079 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15080 "consumes input attachment index 0 but not provided in subpass");
15081
Tony Barbour1fa09702017-03-16 12:09:08 -060015082 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3fb17902016-08-22 14:57:55 +120015083
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015084 char const *vsSource =
15085 "#version 450\n"
15086 "\n"
15087 "out gl_PerVertex {\n"
15088 " vec4 gl_Position;\n"
15089 "};\n"
15090 "void main(){\n"
15091 " gl_Position = vec4(1);\n"
15092 "}\n";
15093 char const *fsSource =
15094 "#version 450\n"
15095 "\n"
15096 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15097 "layout(location=0) out vec4 color;\n"
15098 "void main() {\n"
15099 " color = subpassLoad(x);\n"
15100 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120015101
15102 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15103 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15104
15105 VkPipelineObj pipe(m_device);
15106 pipe.AddShader(&vs);
15107 pipe.AddShader(&fs);
15108 pipe.AddColorAttachment();
15109 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15110
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015111 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15112 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120015113 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015114 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015115 ASSERT_VK_SUCCESS(err);
15116
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015117 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120015118 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015119 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015120 ASSERT_VK_SUCCESS(err);
15121
15122 // error here.
15123 pipe.CreateVKPipeline(pl, renderPass());
15124
15125 m_errorMonitor->VerifyFound();
15126
15127 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15128 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15129}
15130
Chris Forbes5a9a0472016-08-22 16:02:09 +120015131TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015132 TEST_DESCRIPTION(
15133 "Test that an error is produced for a shader consuming an input attachment "
15134 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120015135 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15136 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
15137
Tony Barbour1fa09702017-03-16 12:09:08 -060015138 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5a9a0472016-08-22 16:02:09 +120015139
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015140 char const *vsSource =
15141 "#version 450\n"
15142 "\n"
15143 "out gl_PerVertex {\n"
15144 " vec4 gl_Position;\n"
15145 "};\n"
15146 "void main(){\n"
15147 " gl_Position = vec4(1);\n"
15148 "}\n";
15149 char const *fsSource =
15150 "#version 450\n"
15151 "\n"
15152 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15153 "layout(location=0) out vec4 color;\n"
15154 "void main() {\n"
15155 " color = subpassLoad(x);\n"
15156 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120015157
15158 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15159 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15160
15161 VkPipelineObj pipe(m_device);
15162 pipe.AddShader(&vs);
15163 pipe.AddShader(&fs);
15164 pipe.AddColorAttachment();
15165 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15166
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015167 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15168 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015169 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015170 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015171 ASSERT_VK_SUCCESS(err);
15172
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015173 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015174 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015175 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015176 ASSERT_VK_SUCCESS(err);
15177
15178 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015179 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15180 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15181 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
15182 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15183 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 +120015184 };
15185 VkAttachmentReference color = {
15186 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15187 };
15188 VkAttachmentReference input = {
15189 1, VK_IMAGE_LAYOUT_GENERAL,
15190 };
15191
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015192 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015193
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015194 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015195 VkRenderPass rp;
15196 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15197 ASSERT_VK_SUCCESS(err);
15198
15199 // error here.
15200 pipe.CreateVKPipeline(pl, rp);
15201
15202 m_errorMonitor->VerifyFound();
15203
15204 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15205 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15206 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15207}
15208
Chris Forbes541f7b02016-08-22 15:30:27 +120015209TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015210 TEST_DESCRIPTION(
15211 "Test that an error is produced for a shader consuming an input attachment "
15212 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120015213 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070015214 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120015215
Tony Barbour1fa09702017-03-16 12:09:08 -060015216 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes541f7b02016-08-22 15:30:27 +120015217
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015218 char const *vsSource =
15219 "#version 450\n"
15220 "\n"
15221 "out gl_PerVertex {\n"
15222 " vec4 gl_Position;\n"
15223 "};\n"
15224 "void main(){\n"
15225 " gl_Position = vec4(1);\n"
15226 "}\n";
15227 char const *fsSource =
15228 "#version 450\n"
15229 "\n"
15230 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
15231 "layout(location=0) out vec4 color;\n"
15232 "void main() {\n"
15233 " color = subpassLoad(xs[0]);\n"
15234 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120015235
15236 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15237 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15238
15239 VkPipelineObj pipe(m_device);
15240 pipe.AddShader(&vs);
15241 pipe.AddShader(&fs);
15242 pipe.AddColorAttachment();
15243 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15244
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015245 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15246 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120015247 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015248 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015249 ASSERT_VK_SUCCESS(err);
15250
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015251 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120015252 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015253 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015254 ASSERT_VK_SUCCESS(err);
15255
15256 // error here.
15257 pipe.CreateVKPipeline(pl, renderPass());
15258
15259 m_errorMonitor->VerifyFound();
15260
15261 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15262 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15263}
15264
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015265TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015266 TEST_DESCRIPTION(
15267 "Test that an error is produced for a compute pipeline consuming a "
15268 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015269 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015270
Tony Barbour1fa09702017-03-16 12:09:08 -060015271 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015272
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015273 char const *csSource =
15274 "#version 450\n"
15275 "\n"
15276 "layout(local_size_x=1) in;\n"
15277 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15278 "void main(){\n"
15279 " x = vec4(1);\n"
15280 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015281
15282 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15283
15284 VkDescriptorSetObj descriptorSet(m_device);
15285 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15286
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015287 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15288 nullptr,
15289 0,
15290 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15291 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15292 descriptorSet.GetPipelineLayout(),
15293 VK_NULL_HANDLE,
15294 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015295
15296 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015297 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015298
15299 m_errorMonitor->VerifyFound();
15300
15301 if (err == VK_SUCCESS) {
15302 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15303 }
15304}
15305
Chris Forbes22a9b092016-07-19 14:34:05 +120015306TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015307 TEST_DESCRIPTION(
15308 "Test that an error is produced for a pipeline consuming a "
15309 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15311 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120015312
Tony Barbour1fa09702017-03-16 12:09:08 -060015313 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes22a9b092016-07-19 14:34:05 +120015314
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015315 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
15316 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120015317 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015318 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015319 ASSERT_VK_SUCCESS(err);
15320
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015321 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120015322 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015323 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015324 ASSERT_VK_SUCCESS(err);
15325
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015326 char const *csSource =
15327 "#version 450\n"
15328 "\n"
15329 "layout(local_size_x=1) in;\n"
15330 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15331 "void main() {\n"
15332 " x.x = 1.0f;\n"
15333 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120015334 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15335
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015336 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15337 nullptr,
15338 0,
15339 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15340 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15341 pl,
15342 VK_NULL_HANDLE,
15343 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120015344
15345 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015346 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120015347
15348 m_errorMonitor->VerifyFound();
15349
15350 if (err == VK_SUCCESS) {
15351 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15352 }
15353
15354 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15355 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15356}
15357
Chris Forbes50020592016-07-27 13:52:41 +120015358TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015359 TEST_DESCRIPTION(
15360 "Test that an error is produced when an image view type "
15361 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120015362
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015363 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 +120015364
Tony Barbour1fa09702017-03-16 12:09:08 -060015365 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes50020592016-07-27 13:52:41 +120015366 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15367
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015368 char const *vsSource =
15369 "#version 450\n"
15370 "\n"
15371 "out gl_PerVertex { vec4 gl_Position; };\n"
15372 "void main() { gl_Position = vec4(0); }\n";
15373 char const *fsSource =
15374 "#version 450\n"
15375 "\n"
15376 "layout(set=0, binding=0) uniform sampler3D s;\n"
15377 "layout(location=0) out vec4 color;\n"
15378 "void main() {\n"
15379 " color = texture(s, vec3(0));\n"
15380 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120015381 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15382 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15383
15384 VkPipelineObj pipe(m_device);
15385 pipe.AddShader(&vs);
15386 pipe.AddShader(&fs);
15387 pipe.AddColorAttachment();
15388
15389 VkTextureObj texture(m_device, nullptr);
15390 VkSamplerObj sampler(m_device);
15391
15392 VkDescriptorSetObj descriptorSet(m_device);
15393 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15394 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15395
15396 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15397 ASSERT_VK_SUCCESS(err);
15398
Tony Barbour552f6c02016-12-21 14:34:07 -070015399 m_commandBuffer->BeginCommandBuffer();
15400 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120015401
15402 m_commandBuffer->BindPipeline(pipe);
15403 m_commandBuffer->BindDescriptorSet(descriptorSet);
15404
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015405 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120015406 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015407 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120015408 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15409
15410 // error produced here.
15411 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15412
15413 m_errorMonitor->VerifyFound();
15414
Tony Barbour552f6c02016-12-21 14:34:07 -070015415 m_commandBuffer->EndRenderPass();
15416 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120015417}
15418
Chris Forbes5533bfc2016-07-27 14:12:34 +120015419TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015420 TEST_DESCRIPTION(
15421 "Test that an error is produced when a multisampled images "
15422 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015423
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015424 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015425
Tony Barbour1fa09702017-03-16 12:09:08 -060015426 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5533bfc2016-07-27 14:12:34 +120015427 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15428
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015429 char const *vsSource =
15430 "#version 450\n"
15431 "\n"
15432 "out gl_PerVertex { vec4 gl_Position; };\n"
15433 "void main() { gl_Position = vec4(0); }\n";
15434 char const *fsSource =
15435 "#version 450\n"
15436 "\n"
15437 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
15438 "layout(location=0) out vec4 color;\n"
15439 "void main() {\n"
15440 " color = texelFetch(s, ivec2(0), 0);\n"
15441 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120015442 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15443 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15444
15445 VkPipelineObj pipe(m_device);
15446 pipe.AddShader(&vs);
15447 pipe.AddShader(&fs);
15448 pipe.AddColorAttachment();
15449
15450 VkTextureObj texture(m_device, nullptr);
15451 VkSamplerObj sampler(m_device);
15452
15453 VkDescriptorSetObj descriptorSet(m_device);
15454 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15455 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15456
15457 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15458 ASSERT_VK_SUCCESS(err);
15459
Tony Barbour552f6c02016-12-21 14:34:07 -070015460 m_commandBuffer->BeginCommandBuffer();
15461 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120015462
15463 m_commandBuffer->BindPipeline(pipe);
15464 m_commandBuffer->BindDescriptorSet(descriptorSet);
15465
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015466 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015467 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015468 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015469 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15470
15471 // error produced here.
15472 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15473
15474 m_errorMonitor->VerifyFound();
15475
Tony Barbour552f6c02016-12-21 14:34:07 -070015476 m_commandBuffer->EndRenderPass();
15477 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120015478}
15479
Mark Youngc48c4c12016-04-11 14:26:49 -060015480TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015481 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015482
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015483 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15484 {
15485 VkFormatProperties properties;
15486 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15487 if (properties.optimalTilingFeatures == 0) {
15488 printf(" Image format not supported; skipped.\n");
15489 return;
15490 }
15491 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015492
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015493 VkImageCreateInfo info = {};
15494 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15495 info.pNext = NULL;
15496 info.imageType = VK_IMAGE_TYPE_2D;
15497 info.format = format;
15498 info.extent.height = 32;
15499 info.extent.depth = 1;
15500 info.mipLevels = 1;
15501 info.arrayLayers = 1;
15502 info.samples = VK_SAMPLE_COUNT_1_BIT;
15503 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15504 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15505 info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015506
15507 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015508 {
15509 VkImageFormatProperties properties;
15510 auto const result = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), info.format, info.imageType,
15511 info.tiling, info.usage, info.flags, &properties);
15512 ASSERT_VK_SUCCESS(result);
15513 info.extent.width = properties.maxExtent.width + 1;
15514 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015515
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015516 VkImage image;
15517 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
15518 vkCreateImage(m_device->device(), &info, NULL, &image);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015519 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015520}
15521
Mark Youngc48c4c12016-04-11 14:26:49 -060015522TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015523 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc48c4c12016-04-11 14:26:49 -060015524
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015525 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15526 {
15527 VkFormatProperties properties;
15528 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15529 if (properties.optimalTilingFeatures == 0) {
15530 printf(" Image format not supported; skipped.\n");
15531 return;
15532 }
15533 }
Mark Youngc48c4c12016-04-11 14:26:49 -060015534
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015535 VkImageCreateInfo info = {};
15536 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15537 info.pNext = NULL;
15538 info.imageType = VK_IMAGE_TYPE_2D;
15539 info.format = format;
15540 info.extent.height = 32;
15541 info.extent.depth = 1;
15542 info.mipLevels = 1;
15543 info.arrayLayers = 1;
15544 info.samples = VK_SAMPLE_COUNT_1_BIT;
15545 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15546 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15547 info.flags = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015548
15549 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015550 info.extent.width = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015551
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015552 VkImage image;
15553 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00716);
15554 m_errorMonitor->SetUnexpectedError("parameter pCreateInfo->extent.width must be greater than 0");
15555 vkCreateImage(m_device->device(), &info, NULL, &image);
Mark Youngc48c4c12016-04-11 14:26:49 -060015556 m_errorMonitor->VerifyFound();
15557}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070015558
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015559TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015560 TEST_DESCRIPTION(
15561 "Create a render pass with an attachment description "
15562 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015563
Tony Barbour1fa09702017-03-16 12:09:08 -060015564 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015565 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15566
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070015567 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015568
15569 VkAttachmentReference color_attach = {};
15570 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
15571 color_attach.attachment = 0;
15572 VkSubpassDescription subpass = {};
15573 subpass.colorAttachmentCount = 1;
15574 subpass.pColorAttachments = &color_attach;
15575
15576 VkRenderPassCreateInfo rpci = {};
15577 rpci.subpassCount = 1;
15578 rpci.pSubpasses = &subpass;
15579 rpci.attachmentCount = 1;
15580 VkAttachmentDescription attach_desc = {};
15581 attach_desc.format = VK_FORMAT_UNDEFINED;
15582 rpci.pAttachments = &attach_desc;
15583 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
15584 VkRenderPass rp;
15585 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
15586
15587 m_errorMonitor->VerifyFound();
15588
15589 if (result == VK_SUCCESS) {
15590 vkDestroyRenderPass(m_device->device(), rp, NULL);
15591 }
15592}
15593
Karl Schultz6addd812016-02-02 17:17:23 -070015594TEST_F(VkLayerTest, InvalidImageView) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015595 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehliscde08892015-09-22 10:11:37 -060015596
Mike Stroyana3082432015-09-25 13:39:21 -060015597 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070015598 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15599 const int32_t tex_width = 32;
15600 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060015601
15602 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015603 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15604 image_create_info.pNext = NULL;
15605 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15606 image_create_info.format = tex_format;
15607 image_create_info.extent.width = tex_width;
15608 image_create_info.extent.height = tex_height;
15609 image_create_info.extent.depth = 1;
15610 image_create_info.mipLevels = 1;
15611 image_create_info.arrayLayers = 1;
15612 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15613 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15614 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15615 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060015616
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015617 VkImage image;
15618 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060015619 ASSERT_VK_SUCCESS(err);
15620
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015621 VkMemoryRequirements requirements;
15622 vkGetImageMemoryRequirements(m_device->device(), image, &requirements);
15623
15624 VkMemoryAllocateInfo alloc_info{};
15625 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15626 alloc_info.pNext = NULL;
15627 alloc_info.memoryTypeIndex = 0;
15628 alloc_info.allocationSize = requirements.size;
15629 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
15630 ASSERT_TRUE(pass);
15631
15632 VkDeviceMemory memory;
15633 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
15634 ASSERT_VK_SUCCESS(err);
15635
15636 err = vkBindImageMemory(m_device->device(), image, memory, 0);
15637
Tobin Ehliscde08892015-09-22 10:11:37 -060015638 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015639 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015640 image_view_create_info.image = image;
15641 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15642 image_view_create_info.format = tex_format;
15643 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015644 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070015645 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015646 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015647
15648 VkImageView view;
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015649 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015650 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015651 m_errorMonitor->VerifyFound();
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015652
15653 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060015654 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015655}
Mike Stroyana3082432015-09-25 13:39:21 -060015656
Mark Youngd339ba32016-05-30 13:28:35 -060015657TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15658 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060015659 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060015660 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060015661
Tony Barbour1fa09702017-03-16 12:09:08 -060015662 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -060015663
15664 // Create an image and try to create a view with no memory backing the image
15665 VkImage image;
15666
15667 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15668 const int32_t tex_width = 32;
15669 const int32_t tex_height = 32;
15670
15671 VkImageCreateInfo image_create_info = {};
15672 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15673 image_create_info.pNext = NULL;
15674 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15675 image_create_info.format = tex_format;
15676 image_create_info.extent.width = tex_width;
15677 image_create_info.extent.height = tex_height;
15678 image_create_info.extent.depth = 1;
15679 image_create_info.mipLevels = 1;
15680 image_create_info.arrayLayers = 1;
15681 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15682 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15683 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15684 image_create_info.flags = 0;
15685
15686 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15687 ASSERT_VK_SUCCESS(err);
15688
15689 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015690 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060015691 image_view_create_info.image = image;
15692 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15693 image_view_create_info.format = tex_format;
15694 image_view_create_info.subresourceRange.layerCount = 1;
15695 image_view_create_info.subresourceRange.baseMipLevel = 0;
15696 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015697 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060015698
15699 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015700 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060015701
15702 m_errorMonitor->VerifyFound();
15703 vkDestroyImage(m_device->device(), image, NULL);
15704 // If last error is success, it still created the view, so delete it.
15705 if (err == VK_SUCCESS) {
15706 vkDestroyImageView(m_device->device(), view, NULL);
15707 }
Mark Youngd339ba32016-05-30 13:28:35 -060015708}
15709
Karl Schultz6addd812016-02-02 17:17:23 -070015710TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015711 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015712 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015713
Tony Barbour1fa09702017-03-16 12:09:08 -060015714 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015715
Karl Schultz6addd812016-02-02 17:17:23 -070015716 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015717 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015718 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015719 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015720
15721 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015722 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015723 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015724 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15725 image_view_create_info.format = tex_format;
15726 image_view_create_info.subresourceRange.baseMipLevel = 0;
15727 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015728 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015729 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015730 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015731
15732 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015733 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015734
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015735 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015736}
15737
Mike Weiblena1e13f42017-02-09 21:25:59 -070015738TEST_F(VkLayerTest, ExerciseGetImageSubresourceLayout) {
15739 TEST_DESCRIPTION("Test vkGetImageSubresourceLayout() valid usages");
15740
Tony Barbour1fa09702017-03-16 12:09:08 -060015741 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblena1e13f42017-02-09 21:25:59 -070015742 VkSubresourceLayout subres_layout = {};
15743
15744 // VU 00732: image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR
15745 {
15746 const VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL; // ERROR: violates VU 00732
15747 VkImageObj img(m_device);
15748 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, tiling);
15749 ASSERT_TRUE(img.initialized());
15750
15751 VkImageSubresource subres = {};
15752 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15753 subres.mipLevel = 0;
15754 subres.arrayLayer = 0;
15755
15756 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00732);
15757 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15758 m_errorMonitor->VerifyFound();
15759 }
15760
15761 // VU 00733: The aspectMask member of pSubresource must only have a single bit set
15762 {
15763 VkImageObj img(m_device);
15764 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15765 ASSERT_TRUE(img.initialized());
15766
15767 VkImageSubresource subres = {};
15768 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT; // ERROR: triggers VU 00733
15769 subres.mipLevel = 0;
15770 subres.arrayLayer = 0;
15771
15772 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00733);
15773 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
15774 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15775 m_errorMonitor->VerifyFound();
15776 }
15777
15778 // 00739 mipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created
15779 {
15780 VkImageObj img(m_device);
15781 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15782 ASSERT_TRUE(img.initialized());
15783
15784 VkImageSubresource subres = {};
15785 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15786 subres.mipLevel = 1; // ERROR: triggers VU 00739
15787 subres.arrayLayer = 0;
15788
15789 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00739);
15790 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15791 m_errorMonitor->VerifyFound();
15792 }
15793
15794 // 00740 arrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when the image was created
15795 {
15796 VkImageObj img(m_device);
15797 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15798 ASSERT_TRUE(img.initialized());
15799
15800 VkImageSubresource subres = {};
15801 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15802 subres.mipLevel = 0;
15803 subres.arrayLayer = 1; // ERROR: triggers VU 00740
15804
15805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00740);
15806 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15807 m_errorMonitor->VerifyFound();
15808 }
15809}
15810
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015811TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070015812 VkResult err;
15813 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015814
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015815 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015816
Tony Barbour1fa09702017-03-16 12:09:08 -060015817 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060015818
15819 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015820 VkImage srcImage;
15821 VkImage dstImage;
15822 VkDeviceMemory srcMem;
15823 VkDeviceMemory destMem;
15824 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015825
15826 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015827 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15828 image_create_info.pNext = NULL;
15829 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15830 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15831 image_create_info.extent.width = 32;
15832 image_create_info.extent.height = 32;
15833 image_create_info.extent.depth = 1;
15834 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015835 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070015836 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15837 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15838 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15839 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015840
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015841 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015842 ASSERT_VK_SUCCESS(err);
15843
Mark Lobodzinski867787a2016-10-14 11:49:55 -060015844 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015845 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015846 ASSERT_VK_SUCCESS(err);
15847
15848 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015849 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015850 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15851 memAlloc.pNext = NULL;
15852 memAlloc.allocationSize = 0;
15853 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015854
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015855 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015856 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015857 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015858 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015859 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015860 ASSERT_VK_SUCCESS(err);
15861
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015862 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015863 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015864 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015865 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015866 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015867 ASSERT_VK_SUCCESS(err);
15868
15869 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15870 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015871 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015872 ASSERT_VK_SUCCESS(err);
15873
Tony Barbour552f6c02016-12-21 14:34:07 -070015874 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015875 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015876 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015877 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015878 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015879 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015880 copyRegion.srcOffset.x = 0;
15881 copyRegion.srcOffset.y = 0;
15882 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015883 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015884 copyRegion.dstSubresource.mipLevel = 0;
15885 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015886 // Introduce failure by forcing the dst layerCount to differ from src
15887 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015888 copyRegion.dstOffset.x = 0;
15889 copyRegion.dstOffset.y = 0;
15890 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015891 copyRegion.extent.width = 1;
15892 copyRegion.extent.height = 1;
15893 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015894 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015895 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015896
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015897 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015898
Chia-I Wuf7458c52015-10-26 21:10:41 +080015899 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015900 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015901 vkFreeMemory(m_device->device(), srcMem, NULL);
15902 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015903}
15904
Tony Barbourd6673642016-05-05 14:46:39 -060015905TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060015906 TEST_DESCRIPTION("Creating images with unsuported formats ");
15907
Tony Barbour1fa09702017-03-16 12:09:08 -060015908 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060015909 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourd6673642016-05-05 14:46:39 -060015910
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015911 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130015912 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015913 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015914 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15915 image_create_info.format = VK_FORMAT_UNDEFINED;
15916 image_create_info.extent.width = 32;
15917 image_create_info.extent.height = 32;
15918 image_create_info.extent.depth = 1;
15919 image_create_info.mipLevels = 1;
15920 image_create_info.arrayLayers = 1;
15921 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15922 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15923 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015924
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15926 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015927
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015928 VkImage image;
15929 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015930 m_errorMonitor->VerifyFound();
15931
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015932 // Look for a format that is COMPLETELY unsupported with this hardware
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015933 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Tony Barbourd6673642016-05-05 14:46:39 -060015934 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
15935 VkFormat format = static_cast<VkFormat>(f);
15936 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015937 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060015938 unsupported = format;
15939 break;
15940 }
15941 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015942
Tony Barbourd6673642016-05-05 14:46:39 -060015943 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060015944 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060015946
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015947 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Tony Barbourd6673642016-05-05 14:46:39 -060015948 m_errorMonitor->VerifyFound();
15949 }
15950}
15951
15952TEST_F(VkLayerTest, ImageLayerViewTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060015953 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
15954
Tony Barbour1fa09702017-03-16 12:09:08 -060015955 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070015956 auto depth_format = find_depth_stencil_format(m_device);
15957 if (!depth_format) {
15958 return;
15959 }
Tony Barbourd6673642016-05-05 14:46:39 -060015960
15961 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015962 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 -060015963 VK_IMAGE_TILING_OPTIMAL, 0);
15964 ASSERT_TRUE(image.initialized());
15965
15966 VkImageView imgView;
15967 VkImageViewCreateInfo imgViewInfo = {};
15968 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
15969 imgViewInfo.image = image.handle();
15970 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
15971 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15972 imgViewInfo.subresourceRange.layerCount = 1;
15973 imgViewInfo.subresourceRange.baseMipLevel = 0;
15974 imgViewInfo.subresourceRange.levelCount = 1;
15975 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15976
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015977 // View can't have baseMipLevel >= image's mipLevels - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060015978 imgViewInfo.subresourceRange.baseMipLevel = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015979 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060015980 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15981 m_errorMonitor->VerifyFound();
15982 imgViewInfo.subresourceRange.baseMipLevel = 0;
15983
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015984 // View can't have baseArrayLayer >= image's arraySize - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060015985 imgViewInfo.subresourceRange.baseArrayLayer = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015986 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060015987 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15988 m_errorMonitor->VerifyFound();
15989 imgViewInfo.subresourceRange.baseArrayLayer = 0;
15990
Tony Barbourd6673642016-05-05 14:46:39 -060015991 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
15992 imgViewInfo.subresourceRange.levelCount = 0;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015993 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060015994 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15995 m_errorMonitor->VerifyFound();
15996 imgViewInfo.subresourceRange.levelCount = 1;
15997
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015998 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
15999 imgViewInfo.subresourceRange.layerCount = 0;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016000 m_errorMonitor->SetDesiredFailureMsg(
16001 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16002 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060016003 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16004 m_errorMonitor->VerifyFound();
16005 imgViewInfo.subresourceRange.layerCount = 1;
16006
Tony Barbourd6673642016-05-05 14:46:39 -060016007 // Can't use depth format for view into color image - Expect INVALID_FORMAT
Tony Barbourf887b162017-03-09 10:06:46 -070016008 imgViewInfo.format = depth_format;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016009 m_errorMonitor->SetDesiredFailureMsg(
16010 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16011 "Formats MUST be IDENTICAL unless VK_IMAGE_CREATE_MUTABLE_FORMAT BIT was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060016012 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16013 m_errorMonitor->VerifyFound();
16014 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16015
Tony Barbourd6673642016-05-05 14:46:39 -060016016 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
16017 // VIEW_CREATE_ERROR
16018 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016019 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060016020 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16021 m_errorMonitor->VerifyFound();
16022 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16023
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016024 // TODO: Update framework to easily passing mutable flag into ImageObj init
16025 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070016026 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
16027 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16028 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060016029 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
16030 // VIEW_CREATE_ERROR
16031 VkImageCreateInfo mutImgInfo = image.create_info();
16032 VkImage mutImage;
16033 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016034 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060016035 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
16036 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016037 VkResult ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
Tony Barbourd6673642016-05-05 14:46:39 -060016038 ASSERT_VK_SUCCESS(ret);
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016039
16040 VkMemoryRequirements requirements;
16041 vkGetImageMemoryRequirements(m_device->device(), mutImage, &requirements);
16042
16043 VkMemoryAllocateInfo alloc_info{};
16044 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16045 alloc_info.pNext = NULL;
16046 alloc_info.memoryTypeIndex = 0;
16047 alloc_info.allocationSize = requirements.size;
16048 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16049 ASSERT_TRUE(pass);
16050
16051 VkDeviceMemory memory;
16052 ret = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16053 ASSERT_VK_SUCCESS(ret);
16054
16055 ret = vkBindImageMemory(m_device->device(), mutImage, memory, 0);
16056 ASSERT_VK_SUCCESS(ret);
16057
Tony Barbourd6673642016-05-05 14:46:39 -060016058 imgViewInfo.image = mutImage;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016059 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tony Barbourd6673642016-05-05 14:46:39 -060016060 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16061 m_errorMonitor->VerifyFound();
16062 imgViewInfo.image = image.handle();
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016063
16064 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourd6673642016-05-05 14:46:39 -060016065 vkDestroyImage(m_device->handle(), mutImage, NULL);
16066}
16067
Dave Houlton75967fc2017-03-06 17:21:16 -070016068TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
16069 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
16070
Tony Barbour1fa09702017-03-16 12:09:08 -060016071 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton75967fc2017-03-06 17:21:16 -070016072
Jamie Madill35127872017-03-15 16:17:46 -040016073 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton75967fc2017-03-06 17:21:16 -070016074 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
16075 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
16076 if (device_features.textureCompressionBC) {
16077 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
16078 } else if (device_features.textureCompressionETC2) {
16079 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
16080 } else if (device_features.textureCompressionASTC_LDR) {
16081 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
16082 } else {
16083 printf(" No compressed formats supported - CompressedImageMipCopyTests skipped.\n");
16084 return;
16085 }
16086
16087 VkImageCreateInfo ci;
16088 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16089 ci.pNext = NULL;
16090 ci.flags = 0;
16091 ci.imageType = VK_IMAGE_TYPE_2D;
16092 ci.format = compressed_format;
16093 ci.extent = {32, 32, 1};
16094 ci.mipLevels = 6;
16095 ci.arrayLayers = 1;
16096 ci.samples = VK_SAMPLE_COUNT_1_BIT;
16097 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
16098 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16099 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16100 ci.queueFamilyIndexCount = 0;
16101 ci.pQueueFamilyIndices = NULL;
16102 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16103
16104 VkImageObj image(m_device);
16105 image.init(&ci);
16106 ASSERT_TRUE(image.initialized());
16107
16108 VkImageObj odd_image(m_device);
16109 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
16110 odd_image.init(&ci);
16111 ASSERT_TRUE(odd_image.initialized());
16112
16113 // Allocate buffers
16114 VkMemoryPropertyFlags reqs = 0;
16115 vk_testing::Buffer buffer_1024, buffer_64, buffer_16, buffer_8;
16116 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
16117 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
16118 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
16119 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
16120
16121 VkBufferImageCopy region = {};
16122 region.bufferRowLength = 0;
16123 region.bufferImageHeight = 0;
16124 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16125 region.imageSubresource.layerCount = 1;
16126 region.imageOffset = {0, 0, 0};
16127 region.bufferOffset = 0;
16128
16129 // start recording
16130 m_commandBuffer->BeginCommandBuffer();
16131
16132 // Mip level copies that work - 5 levels
16133 m_errorMonitor->ExpectSuccess();
16134
16135 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
16136 region.imageExtent = {32, 32, 1};
16137 region.imageSubresource.mipLevel = 0;
16138 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1,
16139 &region);
16140 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16141 &region);
16142
16143 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
16144 region.imageExtent = {8, 8, 1};
16145 region.imageSubresource.mipLevel = 2;
16146 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1,
16147 &region);
16148 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16149 &region);
16150
16151 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
16152 region.imageExtent = {4, 4, 1};
16153 region.imageSubresource.mipLevel = 3;
16154 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16155 &region);
16156 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16157 &region);
16158
16159 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
16160 region.imageExtent = {2, 2, 1};
16161 region.imageSubresource.mipLevel = 4;
16162 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16163 &region);
16164 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16165 &region);
16166
16167 region.imageExtent = {1, 1, 1};
16168 region.imageSubresource.mipLevel = 5;
16169 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16170 &region);
16171 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16172 &region);
16173 m_errorMonitor->VerifyNotFound();
16174
16175 // Buffer must accomodate a full compressed block, regardless of texel count
16176 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16177 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1,
16178 &region);
16179 m_errorMonitor->VerifyFound();
16180 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227);
16181 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16182 &region);
16183 m_errorMonitor->VerifyFound();
16184
16185 // Copy width < compressed block size, but not the full mip width
16186 region.imageExtent = {1, 2, 1};
16187 region.imageSubresource.mipLevel = 4;
16188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16189 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16190 &region);
16191 m_errorMonitor->VerifyFound();
16192 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16193 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16194 &region);
16195 m_errorMonitor->VerifyFound();
16196
16197 // Copy height < compressed block size but not the full mip height
16198 region.imageExtent = {2, 1, 1};
16199 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16200 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16201 &region);
16202 m_errorMonitor->VerifyFound();
16203 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16204 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16205 &region);
16206 m_errorMonitor->VerifyFound();
16207
16208 // Offsets must be multiple of compressed block size
16209 region.imageOffset = {1, 1, 0};
16210 region.imageExtent = {1, 1, 1};
16211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16212 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16213 &region);
16214 m_errorMonitor->VerifyFound();
16215 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16216 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16217 &region);
16218 m_errorMonitor->VerifyFound();
16219
16220 // Offset + extent width = mip width - should succeed
16221 region.imageOffset = {4, 4, 0};
16222 region.imageExtent = {3, 4, 1};
16223 region.imageSubresource.mipLevel = 2;
16224 m_errorMonitor->ExpectSuccess();
16225 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16226 &region);
16227 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16228 &region);
16229 m_errorMonitor->VerifyNotFound();
16230
16231 // Offset + extent width > mip width, but still within the final compressed block - should succeed
16232 region.imageExtent = {4, 4, 1};
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 and not a multiple of block width - should fail
16241 region.imageExtent = {3, 3, 1};
16242 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16243 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16244 &region);
16245 m_errorMonitor->VerifyFound();
16246 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16247 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16248 &region);
16249 m_errorMonitor->VerifyFound();
16250}
16251
Dave Houlton59a20702017-02-02 17:26:23 -070016252TEST_F(VkLayerTest, ImageBufferCopyTests) {
16253 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
16254
Tony Barbour1fa09702017-03-16 12:09:08 -060016255 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070016256 VkFormatProperties format_props = m_device->format_properties(VK_FORMAT_D24_UNORM_S8_UINT);
16257 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
16258 printf(" VK_FORMAT_D24_UNORM_S8_UINT not supported. Skipped.\n");
16259 return;
16260 }
Dave Houlton584d51e2017-02-16 12:52:54 -070016261
16262 // Bail if any dimension of transfer granularity is 0.
16263 auto index = m_device->graphics_queue_node_index_;
16264 auto queue_family_properties = m_device->phy().queue_properties();
16265 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
16266 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
16267 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
16268 printf(" Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n");
16269 return;
16270 }
16271
Dave Houlton59a20702017-02-02 17:26:23 -070016272 VkImageObj image_64k(m_device); // 128^2 texels, 64k
16273 VkImageObj image_16k(m_device); // 64^2 texels, 16k
16274 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
Dave Houltonf3229d52017-02-21 15:59:08 -070016275 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
16276 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
16277 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
16278 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
16279
Dave Houlton59a20702017-02-02 17:26:23 -070016280 image_64k.init(128, 128, VK_FORMAT_R8G8B8A8_UINT,
16281 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16282 VK_IMAGE_TILING_OPTIMAL, 0);
16283 image_16k.init(64, 64, VK_FORMAT_R8G8B8A8_UINT,
16284 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16285 VK_IMAGE_TILING_OPTIMAL, 0);
16286 image_16k_depth.init(64, 64, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16287 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton59a20702017-02-02 17:26:23 -070016288 ASSERT_TRUE(image_64k.initialized());
16289 ASSERT_TRUE(image_16k.initialized());
16290 ASSERT_TRUE(image_16k_depth.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016291
Dave Houltonf3229d52017-02-21 15:59:08 -070016292 // Verify all needed Depth/Stencil formats are supported
16293 bool missing_ds_support = false;
16294 VkFormatProperties props = {0, 0, 0};
16295 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
16296 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16297 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
16298 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16299 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
16300 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16301 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
16302 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16303
16304 if (!missing_ds_support) {
16305 ds_image_4D_1S.init(
16306 256, 256, VK_FORMAT_D32_SFLOAT_S8_UINT,
16307 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16308 VK_IMAGE_TILING_OPTIMAL, 0);
16309 ASSERT_TRUE(ds_image_4D_1S.initialized());
16310
16311 ds_image_3D_1S.init(
16312 256, 256, VK_FORMAT_D24_UNORM_S8_UINT,
16313 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16314 VK_IMAGE_TILING_OPTIMAL, 0);
16315 ASSERT_TRUE(ds_image_3D_1S.initialized());
16316
16317 ds_image_2D.init(
16318 256, 256, VK_FORMAT_D16_UNORM,
16319 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16320 VK_IMAGE_TILING_OPTIMAL, 0);
16321 ASSERT_TRUE(ds_image_2D.initialized());
16322
16323 ds_image_1S.init(
16324 256, 256, VK_FORMAT_S8_UINT,
16325 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16326 VK_IMAGE_TILING_OPTIMAL, 0);
16327 ASSERT_TRUE(ds_image_1S.initialized());
16328 }
16329
16330 // Allocate buffers
16331 vk_testing::Buffer buffer_256k, buffer_128k, buffer_64k, buffer_16k;
Dave Houlton59a20702017-02-02 17:26:23 -070016332 VkMemoryPropertyFlags reqs = 0;
Dave Houltonf3229d52017-02-21 15:59:08 -070016333 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
16334 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
16335 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
16336 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
Dave Houlton59a20702017-02-02 17:26:23 -070016337
16338 VkBufferImageCopy region = {};
16339 region.bufferRowLength = 0;
16340 region.bufferImageHeight = 0;
16341 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16342 region.imageSubresource.layerCount = 1;
16343 region.imageOffset = {0, 0, 0};
16344 region.imageExtent = {64, 64, 1};
16345 region.bufferOffset = 0;
16346
16347 // attempt copies before putting command buffer in recording state
16348 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01240);
16349 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16350 &region);
16351 m_errorMonitor->VerifyFound();
16352
16353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01258);
16354 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16355 &region);
16356 m_errorMonitor->VerifyFound();
16357
16358 // start recording
16359 m_commandBuffer->BeginCommandBuffer();
16360
16361 // successful copies
16362 m_errorMonitor->ExpectSuccess();
16363 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16364 &region);
16365 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16366 &region);
16367 region.imageOffset.x = 16; // 16k copy, offset requires larger image
16368 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16369 &region);
16370 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
16371 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16372 &region);
16373 region.imageOffset.x = 0;
16374 region.imageExtent.height = 64;
16375 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
16376 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16377 &region);
16378 m_errorMonitor->VerifyNotFound();
16379
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016380 // image/buffer too small (extent too large) on copy to image
Dave Houlton59a20702017-02-02 17:26:23 -070016381 region.imageExtent = {65, 64, 1};
16382 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16383 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16384 &region);
16385 m_errorMonitor->VerifyFound();
16386
16387 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16388 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16389 &region);
16390 m_errorMonitor->VerifyFound();
16391
16392 // image/buffer too small (offset) on copy to image
16393 region.imageExtent = {64, 64, 1};
16394 region.imageOffset = {0, 4, 0};
16395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16396 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16397 &region);
16398 m_errorMonitor->VerifyFound();
16399
16400 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16401 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16402 &region);
16403 m_errorMonitor->VerifyFound();
16404
16405 // image/buffer too small on copy to buffer
16406 region.imageExtent = {64, 64, 1};
16407 region.imageOffset = {0, 0, 0};
Mark Lobodzinski80871462017-02-16 10:37:27 -070016408 region.bufferOffset = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016409 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246); // buffer too small
16410 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16411 &region);
16412 m_errorMonitor->VerifyFound();
16413
16414 region.imageExtent = {64, 65, 1};
16415 region.bufferOffset = 0;
16416 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01245); // image too small
16417 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16418 &region);
16419 m_errorMonitor->VerifyFound();
16420
16421 // buffer size ok but rowlength causes loose packing
16422 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16423 region.imageExtent = {64, 64, 1};
16424 region.bufferRowLength = 68;
16425 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16426 &region);
16427 m_errorMonitor->VerifyFound();
16428
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016429 // An extent with zero area should produce a warning, but no error
16430 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT, "} has zero area");
16431 region.imageExtent.width = 0;
16432 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16433 &region);
16434 m_errorMonitor->VerifyFound();
16435
Dave Houlton59a20702017-02-02 17:26:23 -070016436 // aspect bits
16437 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01280); // more than 1 aspect bit set
16438 region.imageExtent = {64, 64, 1};
16439 region.bufferRowLength = 0;
16440 region.bufferImageHeight = 0;
16441 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16442 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16443 buffer_16k.handle(), 1, &region);
16444 m_errorMonitor->VerifyFound();
16445
16446 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // mis-matched aspect
16447 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16448 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16449 &region);
16450 m_errorMonitor->VerifyFound();
16451
16452 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // different mis-matched aspect
16453 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16454 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16455 buffer_16k.handle(), 1, &region);
16456 m_errorMonitor->VerifyFound();
16457
Dave Houltonf3229d52017-02-21 15:59:08 -070016458 // Test Depth/Stencil copies
16459 if (missing_ds_support) {
16460 printf(" Depth / Stencil formats unsupported - skipping D/S tests.\n");
16461 } else {
16462 VkBufferImageCopy ds_region = {};
16463 ds_region.bufferOffset = 0;
16464 ds_region.bufferRowLength = 0;
16465 ds_region.bufferImageHeight = 0;
16466 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16467 ds_region.imageSubresource.mipLevel = 0;
16468 ds_region.imageSubresource.baseArrayLayer = 0;
16469 ds_region.imageSubresource.layerCount = 1;
16470 ds_region.imageOffset = {0, 0, 0};
16471 ds_region.imageExtent = {256, 256, 1};
16472
16473 // Depth copies that should succeed
16474 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
16475 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16476 buffer_256k.handle(), 1, &ds_region);
16477 m_errorMonitor->VerifyNotFound();
16478
16479 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
16480 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16481 buffer_256k.handle(), 1, &ds_region);
16482 m_errorMonitor->VerifyNotFound();
16483
16484 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
16485 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16486 buffer_128k.handle(), 1, &ds_region);
16487 m_errorMonitor->VerifyNotFound();
16488
16489 // Depth copies that should fail
16490 ds_region.bufferOffset = 4;
16491 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16492 VALIDATION_ERROR_01246); // Extract 4b depth per texel, pack into 256k buffer
16493 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16494 buffer_256k.handle(), 1, &ds_region);
16495 m_errorMonitor->VerifyFound();
16496
16497 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16498 VALIDATION_ERROR_01246); // Extract 3b depth per texel, pack (loose) into 256k buffer
16499 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16500 buffer_256k.handle(), 1, &ds_region);
16501 m_errorMonitor->VerifyFound();
16502
16503 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16504 VALIDATION_ERROR_01246); // Copy 2b depth per texel, into 128k buffer
16505 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16506 buffer_128k.handle(), 1, &ds_region);
16507 m_errorMonitor->VerifyFound();
16508
16509 // Stencil copies that should succeed
16510 ds_region.bufferOffset = 0;
16511 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
16512 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16513 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16514 buffer_64k.handle(), 1, &ds_region);
16515 m_errorMonitor->VerifyNotFound();
16516
16517 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16518 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16519 buffer_64k.handle(), 1, &ds_region);
16520 m_errorMonitor->VerifyNotFound();
16521
16522 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
16523 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16524 buffer_64k.handle(), 1, &ds_region);
16525 m_errorMonitor->VerifyNotFound();
16526
16527 // Stencil copies that should fail
16528 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16529 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16530 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16531 buffer_16k.handle(), 1, &ds_region);
16532 m_errorMonitor->VerifyFound();
16533
16534 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16535 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16536 ds_region.bufferRowLength = 260;
16537 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16538 buffer_64k.handle(), 1, &ds_region);
16539 m_errorMonitor->VerifyFound();
16540
16541 ds_region.bufferRowLength = 0;
16542 ds_region.bufferOffset = 4;
16543 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16544 VALIDATION_ERROR_01246); // Copy 1b depth per texel, into 64k buffer
16545 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16546 buffer_64k.handle(), 1, &ds_region);
16547 m_errorMonitor->VerifyFound();
16548 }
16549
Dave Houlton584d51e2017-02-16 12:52:54 -070016550 // Test compressed formats, if supported
Jamie Madill35127872017-03-15 16:17:46 -040016551 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton584d51e2017-02-16 12:52:54 -070016552 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houltonf3229d52017-02-21 15:59:08 -070016553 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
16554 device_features.textureCompressionASTC_LDR)) {
16555 printf(" No compressed formats supported - block compression tests skipped.\n");
16556 } else {
Dave Houlton67e9b532017-03-02 17:00:10 -070016557 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
16558 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
Dave Houlton584d51e2017-02-16 12:52:54 -070016559 if (device_features.textureCompressionBC) {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016560 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 -070016561 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
16562 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016563 } else if (device_features.textureCompressionETC2) {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016564 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 -070016565 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton67e9b532017-03-02 17:00:10 -070016566 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16567 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016568 } else {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016569 image_16k_4x4comp.init(128, 128, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16570 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton67e9b532017-03-02 17:00:10 -070016571 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16572 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016573 }
16574 ASSERT_TRUE(image_16k_4x4comp.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016575
Dave Houlton584d51e2017-02-16 12:52:54 -070016576 // Just fits
16577 m_errorMonitor->ExpectSuccess();
16578 region.imageExtent = {128, 128, 1};
16579 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16580 buffer_16k.handle(), 1, &region);
16581 m_errorMonitor->VerifyNotFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016582
Dave Houlton584d51e2017-02-16 12:52:54 -070016583 // with offset, too big for buffer
16584 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16585 region.bufferOffset = 16;
16586 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16587 buffer_16k.handle(), 1, &region);
16588 m_errorMonitor->VerifyFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016589 region.bufferOffset = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016590
Dave Houlton67e9b532017-03-02 17:00:10 -070016591 // extents that are not a multiple of compressed block size
16592 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16593 region.imageExtent.width = 66;
16594 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16595 buffer_16k.handle(), 1, &region);
16596 m_errorMonitor->VerifyFound();
16597 region.imageExtent.width = 128;
16598
16599 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016600 region.imageExtent.height = 2;
Dave Houlton67e9b532017-03-02 17:00:10 -070016601 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16602 buffer_16k.handle(), 1, &region);
16603 m_errorMonitor->VerifyFound();
16604 region.imageExtent.height = 128;
16605
16606 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
16607
16608 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
16609 m_errorMonitor->ExpectSuccess();
16610 region.imageExtent.width = 66;
16611 region.imageOffset.x = 64;
16612 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16613 buffer_16k.handle(), 1, &region);
16614 region.imageExtent.width = 16;
16615 region.imageOffset.x = 0;
16616 region.imageExtent.height = 2;
16617 region.imageOffset.y = 128;
16618 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016619 buffer_16k.handle(), 1, &region);
16620 m_errorMonitor->VerifyNotFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016621 region.imageOffset = {0, 0, 0};
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016622
Dave Houlton584d51e2017-02-16 12:52:54 -070016623 // buffer offset must be a multiple of texel block size (16)
16624 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01274);
16625 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
16626 region.imageExtent = {64, 64, 1};
16627 region.bufferOffset = 24;
16628 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16629 buffer_16k.handle(), 1, &region);
16630 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016631
Dave Houlton584d51e2017-02-16 12:52:54 -070016632 // rowlength not a multiple of block width (4)
16633 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01271);
16634 region.bufferOffset = 0;
16635 region.bufferRowLength = 130;
16636 region.bufferImageHeight = 0;
16637 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16638 buffer_64k.handle(), 1, &region);
16639 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016640
Dave Houlton584d51e2017-02-16 12:52:54 -070016641 // imageheight not a multiple of block height (4)
16642 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01272);
16643 region.bufferRowLength = 0;
16644 region.bufferImageHeight = 130;
16645 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16646 buffer_64k.handle(), 1, &region);
16647 m_errorMonitor->VerifyFound();
Dave Houlton584d51e2017-02-16 12:52:54 -070016648 }
Dave Houlton59a20702017-02-02 17:26:23 -070016649}
16650
Tony Barbourd6673642016-05-05 14:46:39 -060016651TEST_F(VkLayerTest, MiscImageLayerTests) {
Mark Lobodzinskie6911292017-02-15 14:38:51 -070016652 TEST_DESCRIPTION("Image-related tests that don't belong elsewhare");
Tony Barbourd6673642016-05-05 14:46:39 -060016653
Tony Barbour1fa09702017-03-16 12:09:08 -060016654 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016655
Rene Lindsay135204f2016-12-22 17:11:09 -070016656 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060016657 VkImageObj image(m_device);
Rene Lindsay135204f2016-12-22 17:11:09 -070016658 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 -070016659 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060016660 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060016661 vk_testing::Buffer buffer;
16662 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070016663 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060016664 VkBufferImageCopy region = {};
16665 region.bufferRowLength = 128;
16666 region.bufferImageHeight = 128;
16667 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16668 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070016669 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016670 region.imageExtent.height = 4;
16671 region.imageExtent.width = 4;
16672 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070016673
16674 VkImageObj image2(m_device);
16675 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 -070016676 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070016677 ASSERT_TRUE(image2.initialized());
16678 vk_testing::Buffer buffer2;
16679 VkMemoryPropertyFlags reqs2 = 0;
16680 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
16681 VkBufferImageCopy region2 = {};
16682 region2.bufferRowLength = 128;
16683 region2.bufferImageHeight = 128;
16684 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16685 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
16686 region2.imageSubresource.layerCount = 1;
16687 region2.imageExtent.height = 4;
16688 region2.imageExtent.width = 4;
16689 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016690 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060016691
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016692 // Image must have offset.z of 0 and extent.depth of 1
16693 // Introduce failure by setting imageExtent.depth to 0
16694 region.imageExtent.depth = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016695 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016696 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016697 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016698 m_errorMonitor->VerifyFound();
16699
16700 region.imageExtent.depth = 1;
16701
16702 // Image must have offset.z of 0 and extent.depth of 1
16703 // Introduce failure by setting imageOffset.z to 4
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016704 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016705 region.imageOffset.z = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016706 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016708 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016709 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016710 m_errorMonitor->VerifyFound();
16711
16712 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016713 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
16714 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070016715 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016716 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016717 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16718 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016719 m_errorMonitor->VerifyFound();
16720
16721 // BufferOffset must be a multiple of 4
16722 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070016723 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016724 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070016725 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
16726 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016727 m_errorMonitor->VerifyFound();
16728
16729 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
16730 region.bufferOffset = 0;
16731 region.imageExtent.height = 128;
16732 region.imageExtent.width = 128;
16733 // Introduce failure by setting bufferRowLength > 0 but less than width
16734 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016735 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016736 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16737 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016738 m_errorMonitor->VerifyFound();
16739
16740 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
16741 region.bufferRowLength = 128;
16742 // Introduce failure by setting bufferRowHeight > 0 but less than height
16743 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016744 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
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 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060016750 VkImageObj intImage1(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070016751 intImage1.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16752 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016753 VkImageObj intImage2(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070016754 intImage2.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16755 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016756 VkImageBlit blitRegion = {};
16757 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16758 blitRegion.srcSubresource.baseArrayLayer = 0;
16759 blitRegion.srcSubresource.layerCount = 1;
16760 blitRegion.srcSubresource.mipLevel = 0;
16761 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16762 blitRegion.dstSubresource.baseArrayLayer = 0;
16763 blitRegion.dstSubresource.layerCount = 1;
16764 blitRegion.dstSubresource.mipLevel = 0;
16765
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016766 // Look for NULL-blit warning
Jeremy Hayesf8e749f2017-03-15 09:40:27 -060016767 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
16768 "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
16769 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
16770 "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016771 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.layout(), intImage2.handle(),
16772 intImage2.layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016773 m_errorMonitor->VerifyFound();
16774
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070016775 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060016776 VkImageMemoryBarrier img_barrier;
16777 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
16778 img_barrier.pNext = NULL;
16779 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
16780 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
16781 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16782 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16783 img_barrier.image = image.handle();
16784 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16785 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16786 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16787 img_barrier.subresourceRange.baseArrayLayer = 0;
16788 img_barrier.subresourceRange.baseMipLevel = 0;
Tony Barbourd6673642016-05-05 14:46:39 -060016789 img_barrier.subresourceRange.layerCount = 0;
16790 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016791 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
16792 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060016793 m_errorMonitor->VerifyFound();
16794 img_barrier.subresourceRange.layerCount = 1;
16795}
16796
16797TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060016798 TEST_DESCRIPTION("Exceed the limits of image format ");
16799
Tony Barbour1fa09702017-03-16 12:09:08 -060016800 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016801
16802 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
16803 {
16804 VkFormatProperties properties;
16805 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
16806 if (properties.linearTilingFeatures == 0) {
16807 printf(" Image format not supported; skipped.\n");
16808 return;
16809 }
16810 }
16811
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016812 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060016813 VkImageCreateInfo image_create_info = {};
16814 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16815 image_create_info.pNext = NULL;
16816 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016817 image_create_info.format = format;
Tony Barbourd6673642016-05-05 14:46:39 -060016818 image_create_info.extent.width = 32;
16819 image_create_info.extent.height = 32;
16820 image_create_info.extent.depth = 1;
16821 image_create_info.mipLevels = 1;
16822 image_create_info.arrayLayers = 1;
16823 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16824 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16825 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16826 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16827 image_create_info.flags = 0;
16828
16829 VkImage nullImg;
16830 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016831 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
16832 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070016833 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016834 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16835 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16836 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070016837 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016838
Tony Barbour0907e362017-03-09 15:05:30 -070016839 uint32_t maxDim =
16840 std::max(std::max(image_create_info.extent.width, image_create_info.extent.height), image_create_info.extent.depth);
16841 // If max mip levels exceeds image extents, skip the max mip levels test
16842 if ((imgFmtProps.maxMipLevels + 1) <= (floor(log2(maxDim)) + 1)) {
16843 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
16844 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
16845 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16846 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16847 m_errorMonitor->VerifyFound();
16848 image_create_info.mipLevels = 1;
16849 }
Tony Barbourd6673642016-05-05 14:46:39 -060016850
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016851 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060016852 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
16853 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16854 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16855 m_errorMonitor->VerifyFound();
16856 image_create_info.arrayLayers = 1;
16857
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016858 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060016859 int samples = imgFmtProps.sampleCounts >> 1;
16860 image_create_info.samples = (VkSampleCountFlagBits)samples;
16861 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16862 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16863 m_errorMonitor->VerifyFound();
16864 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16865
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016866 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16867 "pCreateInfo->initialLayout, must be "
16868 "VK_IMAGE_LAYOUT_UNDEFINED or "
16869 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060016870 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16871 // Expect INVALID_LAYOUT
16872 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16873 m_errorMonitor->VerifyFound();
16874 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16875}
16876
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016877TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016878 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060016879 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016880
Tony Barbour1fa09702017-03-16 12:09:08 -060016881 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016882
16883 VkImageObj src_image(m_device);
16884 src_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
16885 VkImageObj dst_image(m_device);
16886 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
16887
Tony Barbour552f6c02016-12-21 14:34:07 -070016888 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016889 VkImageCopy copy_region;
16890 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16891 copy_region.srcSubresource.mipLevel = 0;
16892 copy_region.srcSubresource.baseArrayLayer = 0;
16893 copy_region.srcSubresource.layerCount = 0;
16894 copy_region.srcOffset.x = 0;
16895 copy_region.srcOffset.y = 0;
16896 copy_region.srcOffset.z = 0;
16897 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16898 copy_region.dstSubresource.mipLevel = 0;
16899 copy_region.dstSubresource.baseArrayLayer = 0;
16900 copy_region.dstSubresource.layerCount = 0;
16901 copy_region.dstOffset.x = 0;
16902 copy_region.dstOffset.y = 0;
16903 copy_region.dstOffset.z = 0;
16904 copy_region.extent.width = 64;
16905 copy_region.extent.height = 64;
16906 copy_region.extent.depth = 1;
16907 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
16908 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070016909 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016910
16911 m_errorMonitor->VerifyFound();
16912}
16913
16914TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016915 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060016916 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016917
Tony Barbour1fa09702017-03-16 12:09:08 -060016918 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016919
16920 VkImageObj src_image(m_device);
16921 src_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
16922 VkImageObj dst_image(m_device);
16923 dst_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
16924
Tony Barbour552f6c02016-12-21 14:34:07 -070016925 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016926 VkImageCopy copy_region;
16927 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16928 copy_region.srcSubresource.mipLevel = 0;
16929 copy_region.srcSubresource.baseArrayLayer = 0;
16930 copy_region.srcSubresource.layerCount = 0;
16931 copy_region.srcOffset.x = 0;
16932 copy_region.srcOffset.y = 0;
16933 copy_region.srcOffset.z = 0;
16934 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16935 copy_region.dstSubresource.mipLevel = 0;
16936 copy_region.dstSubresource.baseArrayLayer = 0;
16937 copy_region.dstSubresource.layerCount = 0;
16938 copy_region.dstOffset.x = 0;
16939 copy_region.dstOffset.y = 0;
16940 copy_region.dstOffset.z = 0;
16941 copy_region.extent.width = 64;
16942 copy_region.extent.height = 64;
16943 copy_region.extent.depth = 1;
16944 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
16945 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070016946 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016947
16948 m_errorMonitor->VerifyFound();
16949}
16950
Karl Schultz6addd812016-02-02 17:17:23 -070016951TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060016952 VkResult err;
16953 bool pass;
16954
16955 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016956 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060016957
Tony Barbour1fa09702017-03-16 12:09:08 -060016958 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -060016959
16960 // Create two images of different types and try to copy between them
16961 VkImage srcImage;
16962 VkImage dstImage;
16963 VkDeviceMemory srcMem;
16964 VkDeviceMemory destMem;
16965 VkMemoryRequirements memReqs;
16966
16967 VkImageCreateInfo image_create_info = {};
16968 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16969 image_create_info.pNext = NULL;
16970 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16971 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16972 image_create_info.extent.width = 32;
16973 image_create_info.extent.height = 32;
16974 image_create_info.extent.depth = 1;
16975 image_create_info.mipLevels = 1;
16976 image_create_info.arrayLayers = 1;
16977 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16978 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16979 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16980 image_create_info.flags = 0;
16981
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016982 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060016983 ASSERT_VK_SUCCESS(err);
16984
16985 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16986 // Introduce failure by creating second image with a different-sized format.
16987 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
16988
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016989 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060016990 ASSERT_VK_SUCCESS(err);
16991
16992 // Allocate memory
16993 VkMemoryAllocateInfo memAlloc = {};
16994 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16995 memAlloc.pNext = NULL;
16996 memAlloc.allocationSize = 0;
16997 memAlloc.memoryTypeIndex = 0;
16998
16999 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
17000 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017001 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017002 ASSERT_TRUE(pass);
17003 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
17004 ASSERT_VK_SUCCESS(err);
17005
17006 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
17007 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017008 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017009 ASSERT_TRUE(pass);
17010 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
17011 ASSERT_VK_SUCCESS(err);
17012
17013 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17014 ASSERT_VK_SUCCESS(err);
17015 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
17016 ASSERT_VK_SUCCESS(err);
17017
Tony Barbour552f6c02016-12-21 14:34:07 -070017018 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017019 VkImageCopy copyRegion;
17020 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17021 copyRegion.srcSubresource.mipLevel = 0;
17022 copyRegion.srcSubresource.baseArrayLayer = 0;
17023 copyRegion.srcSubresource.layerCount = 0;
17024 copyRegion.srcOffset.x = 0;
17025 copyRegion.srcOffset.y = 0;
17026 copyRegion.srcOffset.z = 0;
17027 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17028 copyRegion.dstSubresource.mipLevel = 0;
17029 copyRegion.dstSubresource.baseArrayLayer = 0;
17030 copyRegion.dstSubresource.layerCount = 0;
17031 copyRegion.dstOffset.x = 0;
17032 copyRegion.dstOffset.y = 0;
17033 copyRegion.dstOffset.z = 0;
17034 copyRegion.extent.width = 1;
17035 copyRegion.extent.height = 1;
17036 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017037 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017038 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017039
17040 m_errorMonitor->VerifyFound();
17041
17042 vkDestroyImage(m_device->device(), srcImage, NULL);
17043 vkDestroyImage(m_device->device(), dstImage, NULL);
17044 vkFreeMemory(m_device->device(), srcMem, NULL);
17045 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017046}
17047
Karl Schultz6addd812016-02-02 17:17:23 -070017048TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
17049 VkResult err;
17050 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017051
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017052 // Create a depth image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017053 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17054 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017055
Tony Barbour1fa09702017-03-16 12:09:08 -060017056 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070017057 auto depth_format = find_depth_stencil_format(m_device);
17058 if (!depth_format) {
17059 return;
17060 }
Mike Stroyana3082432015-09-25 13:39:21 -060017061
17062 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017063 VkImage srcImage;
17064 VkImage dstImage;
17065 VkDeviceMemory srcMem;
17066 VkDeviceMemory destMem;
17067 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017068
17069 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017070 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17071 image_create_info.pNext = NULL;
17072 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017073 image_create_info.format = VK_FORMAT_D32_SFLOAT;
Karl Schultz6addd812016-02-02 17:17:23 -070017074 image_create_info.extent.width = 32;
17075 image_create_info.extent.height = 32;
17076 image_create_info.extent.depth = 1;
17077 image_create_info.mipLevels = 1;
17078 image_create_info.arrayLayers = 1;
17079 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17080 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17081 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17082 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017083
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017084 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017085 ASSERT_VK_SUCCESS(err);
17086
Karl Schultzbdb75952016-04-19 11:36:49 -060017087 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17088
Mark Lobodzinskidb117632016-03-31 10:45:56 -060017089 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070017090 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tony Barbourf887b162017-03-09 10:06:46 -070017091 image_create_info.format = depth_format;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060017092 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017093
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017094 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017095 ASSERT_VK_SUCCESS(err);
17096
17097 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017098 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017099 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17100 memAlloc.pNext = NULL;
17101 memAlloc.allocationSize = 0;
17102 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017103
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017104 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017105 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017106 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017107 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017108 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017109 ASSERT_VK_SUCCESS(err);
17110
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017111 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017112 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017113 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017114 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017115 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017116 ASSERT_VK_SUCCESS(err);
17117
17118 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17119 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017120 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017121 ASSERT_VK_SUCCESS(err);
17122
Tony Barbour552f6c02016-12-21 14:34:07 -070017123 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017124 VkImageCopy copyRegion;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017125 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017126 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017127 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017128 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017129 copyRegion.srcOffset.x = 0;
17130 copyRegion.srcOffset.y = 0;
17131 copyRegion.srcOffset.z = 0;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017132 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017133 copyRegion.dstSubresource.mipLevel = 0;
17134 copyRegion.dstSubresource.baseArrayLayer = 0;
17135 copyRegion.dstSubresource.layerCount = 0;
17136 copyRegion.dstOffset.x = 0;
17137 copyRegion.dstOffset.y = 0;
17138 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017139 copyRegion.extent.width = 1;
17140 copyRegion.extent.height = 1;
17141 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017142 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017143 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017144
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017145 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017146
Chia-I Wuf7458c52015-10-26 21:10:41 +080017147 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017148 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017149 vkFreeMemory(m_device->device(), srcMem, NULL);
17150 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017151}
17152
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017153TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
17154 TEST_DESCRIPTION("Image copies with sample count mis-matches");
Dave Houlton33c22b72017-02-28 13:16:02 -070017155
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017156 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton33c22b72017-02-28 13:16:02 -070017157
17158 VkImageFormatProperties image_format_properties;
17159 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
17160 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
17161 &image_format_properties);
17162
17163 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
17164 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
17165 printf(" Image multi-sample support not found; skipped.\n");
17166 return;
17167 }
17168
17169 VkImageCreateInfo ci;
17170 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17171 ci.pNext = NULL;
17172 ci.flags = 0;
17173 ci.imageType = VK_IMAGE_TYPE_2D;
17174 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17175 ci.extent = {128, 128, 1};
17176 ci.mipLevels = 1;
17177 ci.arrayLayers = 1;
17178 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17179 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17180 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17181 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17182 ci.queueFamilyIndexCount = 0;
17183 ci.pQueueFamilyIndices = NULL;
17184 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17185
17186 VkImageObj image1(m_device);
17187 image1.init(&ci);
17188 ASSERT_TRUE(image1.initialized());
17189
17190 ci.samples = VK_SAMPLE_COUNT_2_BIT;
17191 VkImageObj image2(m_device);
17192 image2.init(&ci);
17193 ASSERT_TRUE(image2.initialized());
17194
17195 ci.samples = VK_SAMPLE_COUNT_4_BIT;
17196 VkImageObj image4(m_device);
17197 image4.init(&ci);
17198 ASSERT_TRUE(image4.initialized());
17199
17200 m_commandBuffer->BeginCommandBuffer();
17201
17202 VkImageCopy copyRegion;
17203 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17204 copyRegion.srcSubresource.mipLevel = 0;
17205 copyRegion.srcSubresource.baseArrayLayer = 0;
17206 copyRegion.srcSubresource.layerCount = 1;
17207 copyRegion.srcOffset = {0, 0, 0};
17208 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17209 copyRegion.dstSubresource.mipLevel = 0;
17210 copyRegion.dstSubresource.baseArrayLayer = 0;
17211 copyRegion.dstSubresource.layerCount = 1;
17212 copyRegion.dstOffset = {0, 0, 0};
17213 copyRegion.extent = {128, 128, 1};
17214
17215 // Copy a single sample image to/from a multi-sample image
17216 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17217 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17218 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17219 m_errorMonitor->VerifyFound();
17220
17221 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17222 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(),
17223 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17224 m_errorMonitor->VerifyFound();
17225
17226 // Copy between multi-sample images with different sample counts
17227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17228 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17229 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17230 m_errorMonitor->VerifyFound();
17231
17232 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17233 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(),
17234 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17235 m_errorMonitor->VerifyFound();
17236
17237 m_commandBuffer->EndCommandBuffer();
17238}
17239
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017240TEST_F(VkLayerTest, CopyImageAspectMismatch) {
17241 TEST_DESCRIPTION("Image copies with aspect mask errors");
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017242 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour9357d542017-03-24 15:42:21 -060017243 auto ds_format = find_depth_stencil_format(m_device);
17244 if (!ds_format) {
17245 return;
17246 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017247
17248 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
17249 color_image.init(128, 128, VK_FORMAT_R32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
17250 depth_image.init(128, 128, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
Tony Barbour9357d542017-03-24 15:42:21 -060017251 ds_image.init(128, 128, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL,
17252 0);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017253 ASSERT_TRUE(color_image.initialized());
17254 ASSERT_TRUE(depth_image.initialized());
17255 ASSERT_TRUE(ds_image.initialized());
17256
17257 VkImageCopy copyRegion;
17258 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17259 copyRegion.srcSubresource.mipLevel = 0;
17260 copyRegion.srcSubresource.baseArrayLayer = 0;
17261 copyRegion.srcSubresource.layerCount = 1;
17262 copyRegion.srcOffset = {0, 0, 0};
17263 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17264 copyRegion.dstSubresource.mipLevel = 0;
17265 copyRegion.dstSubresource.baseArrayLayer = 0;
17266 copyRegion.dstSubresource.layerCount = 1;
17267 copyRegion.dstOffset = {64, 0, 0};
17268 copyRegion.extent = {64, 128, 1};
17269
17270 // Submitting command before command buffer is in recording state
17271 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "You must call vkBeginCommandBuffer");// VALIDATION_ERROR_01192);
17272 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17273 m_errorMonitor->VerifyFound();
17274
17275 m_commandBuffer->BeginCommandBuffer();
17276
17277 // Src and dest aspect masks don't match
17278 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
17279 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01197);
17280 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17281 m_errorMonitor->VerifyFound();
17282 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17283
17284 // Illegal combinations of aspect bits - VU 01221
17285 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
17286 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
17287 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01221);
17288 // These aspect/format mismatches are redundant but unavoidable here
17289 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17290 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
17291 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17292 m_errorMonitor->VerifyFound();
17293 // Metadata aspect is illegal - VU 01222
17294 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17295 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17296 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01222);
17297 // These aspect/format mismatches are redundant but unavoidable here
17298 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17299 m_errorMonitor->VerifyFound();
17300
17301 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17302 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17303
17304 // Aspect mask doesn't match source image format - VU 01200
17305 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17306 // Again redundant but unavoidable when provoking vu01200 w/o vu01201
17307 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17308 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17309 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17310 m_errorMonitor->VerifyFound();
17311
17312 // Aspect mask doesn't match dest image format - VU 01201
17313 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17314 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17315 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
17316 // Again redundant but unavoidable when provoking vu01201 w/o vu01200
17317 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17318 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17319 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17320 m_errorMonitor->VerifyFound();
17321
17322 m_commandBuffer->EndCommandBuffer();
17323}
17324
Karl Schultz6addd812016-02-02 17:17:23 -070017325TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
17326 VkResult err;
17327 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017328
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017329 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17330 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017331
Tony Barbour1fa09702017-03-16 12:09:08 -060017332 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017333
17334 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017335 VkImage srcImage;
17336 VkImage dstImage;
17337 VkDeviceMemory srcMem;
17338 VkDeviceMemory destMem;
17339 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017340
17341 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017342 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17343 image_create_info.pNext = NULL;
17344 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17345 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17346 image_create_info.extent.width = 32;
17347 image_create_info.extent.height = 1;
17348 image_create_info.extent.depth = 1;
17349 image_create_info.mipLevels = 1;
17350 image_create_info.arrayLayers = 1;
17351 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17352 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17353 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17354 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017355
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017356 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017357 ASSERT_VK_SUCCESS(err);
17358
Karl Schultz6addd812016-02-02 17:17:23 -070017359 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017360
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017361 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017362 ASSERT_VK_SUCCESS(err);
17363
17364 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017365 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017366 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17367 memAlloc.pNext = NULL;
17368 memAlloc.allocationSize = 0;
17369 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017370
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017371 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017372 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017373 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017374 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017375 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017376 ASSERT_VK_SUCCESS(err);
17377
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017378 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017379 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017380 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017381 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017382 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017383 ASSERT_VK_SUCCESS(err);
17384
17385 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17386 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017387 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017388 ASSERT_VK_SUCCESS(err);
17389
Tony Barbour552f6c02016-12-21 14:34:07 -070017390 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017391 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017392 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17393 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017394 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017395 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017396 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017397 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017398 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017399 resolveRegion.srcOffset.x = 0;
17400 resolveRegion.srcOffset.y = 0;
17401 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017402 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017403 resolveRegion.dstSubresource.mipLevel = 0;
17404 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017405 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017406 resolveRegion.dstOffset.x = 0;
17407 resolveRegion.dstOffset.y = 0;
17408 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017409 resolveRegion.extent.width = 1;
17410 resolveRegion.extent.height = 1;
17411 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017412 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017413 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017414
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017415 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017416
Chia-I Wuf7458c52015-10-26 21:10:41 +080017417 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017418 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017419 vkFreeMemory(m_device->device(), srcMem, NULL);
17420 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017421}
17422
Karl Schultz6addd812016-02-02 17:17:23 -070017423TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
17424 VkResult err;
17425 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017426
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017427 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17428 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017429
Tony Barbour1fa09702017-03-16 12:09:08 -060017430 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017431
Chris Forbesa7530692016-05-08 12:35:39 +120017432 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017433 VkImage srcImage;
17434 VkImage dstImage;
17435 VkDeviceMemory srcMem;
17436 VkDeviceMemory destMem;
17437 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017438
17439 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017440 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17441 image_create_info.pNext = NULL;
17442 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17443 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17444 image_create_info.extent.width = 32;
17445 image_create_info.extent.height = 1;
17446 image_create_info.extent.depth = 1;
17447 image_create_info.mipLevels = 1;
17448 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120017449 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017450 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17451 // Note: Some implementations expect color attachment usage for any
17452 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017453 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017454 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017455
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017456 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017457 ASSERT_VK_SUCCESS(err);
17458
Karl Schultz6addd812016-02-02 17:17:23 -070017459 // Note: Some implementations expect color attachment usage for any
17460 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017461 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017462
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017463 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017464 ASSERT_VK_SUCCESS(err);
17465
17466 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017467 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017468 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17469 memAlloc.pNext = NULL;
17470 memAlloc.allocationSize = 0;
17471 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017472
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017473 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017474 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017475 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017476 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017477 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017478 ASSERT_VK_SUCCESS(err);
17479
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017480 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017481 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017482 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017483 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017484 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017485 ASSERT_VK_SUCCESS(err);
17486
17487 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17488 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017489 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017490 ASSERT_VK_SUCCESS(err);
17491
Tony Barbour552f6c02016-12-21 14:34:07 -070017492 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017493 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017494 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17495 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017496 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017497 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017498 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017499 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017500 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017501 resolveRegion.srcOffset.x = 0;
17502 resolveRegion.srcOffset.y = 0;
17503 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017504 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017505 resolveRegion.dstSubresource.mipLevel = 0;
17506 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017507 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017508 resolveRegion.dstOffset.x = 0;
17509 resolveRegion.dstOffset.y = 0;
17510 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017511 resolveRegion.extent.width = 1;
17512 resolveRegion.extent.height = 1;
17513 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017514 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017515 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017516
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017517 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017518
Chia-I Wuf7458c52015-10-26 21:10:41 +080017519 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017520 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017521 vkFreeMemory(m_device->device(), srcMem, NULL);
17522 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017523}
17524
Karl Schultz6addd812016-02-02 17:17:23 -070017525TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
17526 VkResult err;
17527 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017528
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017529 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017530 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017531
Tony Barbour1fa09702017-03-16 12:09:08 -060017532 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017533
17534 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017535 VkImage srcImage;
17536 VkImage dstImage;
17537 VkDeviceMemory srcMem;
17538 VkDeviceMemory destMem;
17539 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017540
17541 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017542 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17543 image_create_info.pNext = NULL;
17544 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17545 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17546 image_create_info.extent.width = 32;
17547 image_create_info.extent.height = 1;
17548 image_create_info.extent.depth = 1;
17549 image_create_info.mipLevels = 1;
17550 image_create_info.arrayLayers = 1;
17551 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17552 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17553 // Note: Some implementations expect color attachment usage for any
17554 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017555 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017556 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017557
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017558 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017559 ASSERT_VK_SUCCESS(err);
17560
Karl Schultz6addd812016-02-02 17:17:23 -070017561 // Set format to something other than source image
17562 image_create_info.format = VK_FORMAT_R32_SFLOAT;
17563 // Note: Some implementations expect color attachment usage for any
17564 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017565 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017566 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017567
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017568 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017569 ASSERT_VK_SUCCESS(err);
17570
17571 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017572 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017573 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17574 memAlloc.pNext = NULL;
17575 memAlloc.allocationSize = 0;
17576 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017577
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017578 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017579 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017580 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017581 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017582 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017583 ASSERT_VK_SUCCESS(err);
17584
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017585 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017586 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017587 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017588 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017589 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017590 ASSERT_VK_SUCCESS(err);
17591
17592 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17593 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017594 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017595 ASSERT_VK_SUCCESS(err);
17596
Tony Barbour552f6c02016-12-21 14:34:07 -070017597 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017598 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017599 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17600 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017601 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017602 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017603 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017604 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017605 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017606 resolveRegion.srcOffset.x = 0;
17607 resolveRegion.srcOffset.y = 0;
17608 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017609 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017610 resolveRegion.dstSubresource.mipLevel = 0;
17611 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017612 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017613 resolveRegion.dstOffset.x = 0;
17614 resolveRegion.dstOffset.y = 0;
17615 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017616 resolveRegion.extent.width = 1;
17617 resolveRegion.extent.height = 1;
17618 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017619 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017620 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017621
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017622 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017623
Chia-I Wuf7458c52015-10-26 21:10:41 +080017624 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017625 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017626 vkFreeMemory(m_device->device(), srcMem, NULL);
17627 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017628}
17629
Karl Schultz6addd812016-02-02 17:17:23 -070017630TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
17631 VkResult err;
17632 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017633
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017634 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017635 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017636
Tony Barbour1fa09702017-03-16 12:09:08 -060017637 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017638
17639 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017640 VkImage srcImage;
17641 VkImage dstImage;
17642 VkDeviceMemory srcMem;
17643 VkDeviceMemory destMem;
17644 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017645
17646 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017647 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17648 image_create_info.pNext = NULL;
17649 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17650 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17651 image_create_info.extent.width = 32;
17652 image_create_info.extent.height = 1;
17653 image_create_info.extent.depth = 1;
17654 image_create_info.mipLevels = 1;
17655 image_create_info.arrayLayers = 1;
17656 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17657 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17658 // Note: Some implementations expect color attachment usage for any
17659 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017660 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017661 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017662
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017663 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017664 ASSERT_VK_SUCCESS(err);
17665
Karl Schultz6addd812016-02-02 17:17:23 -070017666 image_create_info.imageType = VK_IMAGE_TYPE_1D;
17667 // Note: Some implementations expect color attachment usage for any
17668 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017669 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017670 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017671
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017672 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017673 ASSERT_VK_SUCCESS(err);
17674
17675 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017676 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017677 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17678 memAlloc.pNext = NULL;
17679 memAlloc.allocationSize = 0;
17680 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017681
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017682 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017683 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017684 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017685 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017686 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017687 ASSERT_VK_SUCCESS(err);
17688
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017689 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017690 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017691 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017692 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017693 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017694 ASSERT_VK_SUCCESS(err);
17695
17696 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17697 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017698 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017699 ASSERT_VK_SUCCESS(err);
17700
Tony Barbour552f6c02016-12-21 14:34:07 -070017701 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017702 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017703 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17704 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017705 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017706 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017707 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017708 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017709 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017710 resolveRegion.srcOffset.x = 0;
17711 resolveRegion.srcOffset.y = 0;
17712 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017713 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017714 resolveRegion.dstSubresource.mipLevel = 0;
17715 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017716 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017717 resolveRegion.dstOffset.x = 0;
17718 resolveRegion.dstOffset.y = 0;
17719 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017720 resolveRegion.extent.width = 1;
17721 resolveRegion.extent.height = 1;
17722 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017723 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017724 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017725
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017726 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017727
Chia-I Wuf7458c52015-10-26 21:10:41 +080017728 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017729 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017730 vkFreeMemory(m_device->device(), srcMem, NULL);
17731 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017732}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017733
Karl Schultz6addd812016-02-02 17:17:23 -070017734TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017735 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070017736 // to using a DS format, then cause it to hit error due to COLOR_BIT not
17737 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017738 // The image format check comes 2nd in validation so we trigger it first,
17739 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070017740 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017741
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17743 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017744
Tony Barbour1fa09702017-03-16 12:09:08 -060017745 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070017746 auto depth_format = find_depth_stencil_format(m_device);
17747 if (!depth_format) {
17748 return;
17749 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017750
Chia-I Wu1b99bb22015-10-27 19:25:11 +080017751 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017752 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17753 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017754
17755 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017756 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17757 ds_pool_ci.pNext = NULL;
17758 ds_pool_ci.maxSets = 1;
17759 ds_pool_ci.poolSizeCount = 1;
17760 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017761
17762 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017763 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017764 ASSERT_VK_SUCCESS(err);
17765
17766 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017767 dsl_binding.binding = 0;
17768 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17769 dsl_binding.descriptorCount = 1;
17770 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
17771 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017772
17773 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017774 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17775 ds_layout_ci.pNext = NULL;
17776 ds_layout_ci.bindingCount = 1;
17777 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017778 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017779 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017780 ASSERT_VK_SUCCESS(err);
17781
17782 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017783 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080017784 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070017785 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017786 alloc_info.descriptorPool = ds_pool;
17787 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017788 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017789 ASSERT_VK_SUCCESS(err);
17790
Karl Schultz6addd812016-02-02 17:17:23 -070017791 VkImage image_bad;
17792 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017793 // One bad format and one good format for Color attachment
Tony Barbourf887b162017-03-09 10:06:46 -070017794 const VkFormat tex_format_bad = depth_format;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017795 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070017796 const int32_t tex_width = 32;
17797 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017798
17799 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017800 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17801 image_create_info.pNext = NULL;
17802 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17803 image_create_info.format = tex_format_bad;
17804 image_create_info.extent.width = tex_width;
17805 image_create_info.extent.height = tex_height;
17806 image_create_info.extent.depth = 1;
17807 image_create_info.mipLevels = 1;
17808 image_create_info.arrayLayers = 1;
17809 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17810 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017811 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017812 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017813
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017814 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017815 ASSERT_VK_SUCCESS(err);
17816 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017817 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
17818 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017819 ASSERT_VK_SUCCESS(err);
17820
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017821 // ---Bind image memory---
17822 VkMemoryRequirements img_mem_reqs;
17823 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
17824 VkMemoryAllocateInfo image_alloc_info = {};
17825 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17826 image_alloc_info.pNext = NULL;
17827 image_alloc_info.memoryTypeIndex = 0;
17828 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017829 bool pass =
17830 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 -070017831 ASSERT_TRUE(pass);
17832 VkDeviceMemory mem;
17833 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
17834 ASSERT_VK_SUCCESS(err);
17835 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
17836 ASSERT_VK_SUCCESS(err);
17837 // -----------------------
17838
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017839 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130017840 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070017841 image_view_create_info.image = image_bad;
17842 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
17843 image_view_create_info.format = tex_format_bad;
17844 image_view_create_info.subresourceRange.baseArrayLayer = 0;
17845 image_view_create_info.subresourceRange.baseMipLevel = 0;
17846 image_view_create_info.subresourceRange.layerCount = 1;
17847 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017848 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017849
17850 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017851 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017852
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017853 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017854
Chia-I Wuf7458c52015-10-26 21:10:41 +080017855 vkDestroyImage(m_device->device(), image_bad, NULL);
17856 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017857 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17858 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017859
17860 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017861}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017862
17863TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017864 TEST_DESCRIPTION(
17865 "Call ClearColorImage w/ a depth|stencil image and "
17866 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017867
Tony Barbour1fa09702017-03-16 12:09:08 -060017868 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070017869 auto depth_format = find_depth_stencil_format(m_device);
17870 if (!depth_format) {
17871 return;
17872 }
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017873 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
17874
Tony Barbour552f6c02016-12-21 14:34:07 -070017875 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017876
17877 // Color image
17878 VkClearColorValue clear_color;
17879 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
17880 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
17881 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
17882 const int32_t img_width = 32;
17883 const int32_t img_height = 32;
17884 VkImageCreateInfo image_create_info = {};
17885 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17886 image_create_info.pNext = NULL;
17887 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17888 image_create_info.format = color_format;
17889 image_create_info.extent.width = img_width;
17890 image_create_info.extent.height = img_height;
17891 image_create_info.extent.depth = 1;
17892 image_create_info.mipLevels = 1;
17893 image_create_info.arrayLayers = 1;
17894 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17895 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17896 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
17897
17898 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017899 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017900
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017901 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017902
17903 // Depth/Stencil image
17904 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017905 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017906 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
17907 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070017908 ds_image_create_info.format = depth_format;
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017909 ds_image_create_info.extent.width = 64;
17910 ds_image_create_info.extent.height = 64;
17911 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070017912 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 -060017913
17914 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017915 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017916
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017917 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 -060017918
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017919 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017920
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017921 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017922 &color_range);
17923
17924 m_errorMonitor->VerifyFound();
17925
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017926 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17927 "vkCmdClearColorImage called with "
17928 "image created without "
17929 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060017930
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070017931 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060017932 &color_range);
17933
17934 m_errorMonitor->VerifyFound();
17935
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017936 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017937 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17938 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017939
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017940 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
17941 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017942
17943 m_errorMonitor->VerifyFound();
17944}
Tobin Ehliscde08892015-09-22 10:11:37 -060017945
Mike Schuchardt35fece12017-03-07 14:40:28 -070017946TEST_F(VkLayerTest, CommandQueueFlags) {
17947 TEST_DESCRIPTION(
17948 "Allocate a command buffer on a queue that does not support graphics and try to issue a "
17949 "graphics-only command");
17950
17951 ASSERT_NO_FATAL_FAILURE(Init());
17952
17953 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
17954 if(queueFamilyIndex == UINT32_MAX) {
17955 printf(" Non-graphics queue family not found; skipped.\n");
17956 return;
17957 } else {
17958 // Create command pool on a non-graphics queue
17959 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
17960
17961 // Setup command buffer on pool
17962 VkCommandBufferObj command_buffer(m_device, &command_pool);
17963 command_buffer.BeginCommandBuffer();
17964
17965 // Issue a graphics only command
17966 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01446);
17967 VkViewport viewport = {0, 0, 16, 16, 0, 1};
17968 command_buffer.SetViewport(0, 1, &viewport);
17969 m_errorMonitor->VerifyFound();
17970 }
17971}
17972
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017973// WSI Enabled Tests
17974//
Chris Forbes09368e42016-10-13 11:59:22 +130017975#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017976TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
17977
17978#if defined(VK_USE_PLATFORM_XCB_KHR)
17979 VkSurfaceKHR surface = VK_NULL_HANDLE;
17980
17981 VkResult err;
17982 bool pass;
17983 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
17984 VkSwapchainCreateInfoKHR swapchain_create_info = {};
17985 // uint32_t swapchain_image_count = 0;
17986 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
17987 // uint32_t image_index = 0;
17988 // VkPresentInfoKHR present_info = {};
17989
Tony Barbour1fa09702017-03-16 12:09:08 -060017990 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017991
17992 // Use the create function from one of the VK_KHR_*_surface extension in
17993 // order to create a surface, testing all known errors in the process,
17994 // before successfully creating a surface:
17995 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
17996 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
17997 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
17998 pass = (err != VK_SUCCESS);
17999 ASSERT_TRUE(pass);
18000 m_errorMonitor->VerifyFound();
18001
18002 // Next, try to create a surface with the wrong
18003 // VkXcbSurfaceCreateInfoKHR::sType:
18004 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
18005 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18006 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18007 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18008 pass = (err != VK_SUCCESS);
18009 ASSERT_TRUE(pass);
18010 m_errorMonitor->VerifyFound();
18011
18012 // Create a native window, and then correctly create a surface:
18013 xcb_connection_t *connection;
18014 xcb_screen_t *screen;
18015 xcb_window_t xcb_window;
18016 xcb_intern_atom_reply_t *atom_wm_delete_window;
18017
18018 const xcb_setup_t *setup;
18019 xcb_screen_iterator_t iter;
18020 int scr;
18021 uint32_t value_mask, value_list[32];
18022 int width = 1;
18023 int height = 1;
18024
18025 connection = xcb_connect(NULL, &scr);
18026 ASSERT_TRUE(connection != NULL);
18027 setup = xcb_get_setup(connection);
18028 iter = xcb_setup_roots_iterator(setup);
18029 while (scr-- > 0)
18030 xcb_screen_next(&iter);
18031 screen = iter.data;
18032
18033 xcb_window = xcb_generate_id(connection);
18034
18035 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
18036 value_list[0] = screen->black_pixel;
18037 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
18038
18039 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
18040 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
18041
18042 /* Magic code that will send notification when window is destroyed */
18043 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
18044 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
18045
18046 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
18047 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
18048 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
18049 free(reply);
18050
18051 xcb_map_window(connection, xcb_window);
18052
18053 // Force the x/y coordinates to 100,100 results are identical in consecutive
18054 // runs
18055 const uint32_t coords[] = { 100, 100 };
18056 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
18057
18058 // Finally, try to correctly create a surface:
18059 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
18060 xcb_create_info.pNext = NULL;
18061 xcb_create_info.flags = 0;
18062 xcb_create_info.connection = connection;
18063 xcb_create_info.window = xcb_window;
18064 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18065 pass = (err == VK_SUCCESS);
18066 ASSERT_TRUE(pass);
18067
18068 // Check if surface supports presentation:
18069
18070 // 1st, do so without having queried the queue families:
18071 VkBool32 supported = false;
18072 // TODO: Get the following error to come out:
18073 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18074 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
18075 "function");
18076 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18077 pass = (err != VK_SUCCESS);
18078 // ASSERT_TRUE(pass);
18079 // m_errorMonitor->VerifyFound();
18080
18081 // Next, query a queue family index that's too large:
18082 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18083 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
18084 pass = (err != VK_SUCCESS);
18085 ASSERT_TRUE(pass);
18086 m_errorMonitor->VerifyFound();
18087
18088 // Finally, do so correctly:
18089 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18090 // SUPPORTED
18091 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18092 pass = (err == VK_SUCCESS);
18093 ASSERT_TRUE(pass);
18094
18095 // Before proceeding, try to create a swapchain without having called
18096 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
18097 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18098 swapchain_create_info.pNext = NULL;
18099 swapchain_create_info.flags = 0;
18100 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18101 swapchain_create_info.surface = surface;
18102 swapchain_create_info.imageArrayLayers = 1;
18103 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
18104 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
18105 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18106 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
18107 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18108 pass = (err != VK_SUCCESS);
18109 ASSERT_TRUE(pass);
18110 m_errorMonitor->VerifyFound();
18111
18112 // Get the surface capabilities:
18113 VkSurfaceCapabilitiesKHR surface_capabilities;
18114
18115 // Do so correctly (only error logged by this entrypoint is if the
18116 // extension isn't enabled):
18117 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
18118 pass = (err == VK_SUCCESS);
18119 ASSERT_TRUE(pass);
18120
18121 // Get the surface formats:
18122 uint32_t surface_format_count;
18123
18124 // First, try without a pointer to surface_format_count:
18125 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
18126 "specified as NULL");
18127 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
18128 pass = (err == VK_SUCCESS);
18129 ASSERT_TRUE(pass);
18130 m_errorMonitor->VerifyFound();
18131
18132 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
18133 // correctly done a 1st try (to get the count):
18134 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18135 surface_format_count = 0;
18136 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
18137 pass = (err == VK_SUCCESS);
18138 ASSERT_TRUE(pass);
18139 m_errorMonitor->VerifyFound();
18140
18141 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18142 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18143 pass = (err == VK_SUCCESS);
18144 ASSERT_TRUE(pass);
18145
18146 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18147 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
18148
18149 // Next, do a 2nd try with surface_format_count being set too high:
18150 surface_format_count += 5;
18151 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18152 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18153 pass = (err == VK_SUCCESS);
18154 ASSERT_TRUE(pass);
18155 m_errorMonitor->VerifyFound();
18156
18157 // Finally, do a correct 1st and 2nd try:
18158 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18159 pass = (err == VK_SUCCESS);
18160 ASSERT_TRUE(pass);
18161 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18162 pass = (err == VK_SUCCESS);
18163 ASSERT_TRUE(pass);
18164
18165 // Get the surface present modes:
18166 uint32_t surface_present_mode_count;
18167
18168 // First, try without a pointer to surface_format_count:
18169 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
18170 "specified as NULL");
18171
18172 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
18173 pass = (err == VK_SUCCESS);
18174 ASSERT_TRUE(pass);
18175 m_errorMonitor->VerifyFound();
18176
18177 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
18178 // correctly done a 1st try (to get the count):
18179 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18180 surface_present_mode_count = 0;
18181 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
18182 (VkPresentModeKHR *)&surface_present_mode_count);
18183 pass = (err == VK_SUCCESS);
18184 ASSERT_TRUE(pass);
18185 m_errorMonitor->VerifyFound();
18186
18187 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18188 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18189 pass = (err == VK_SUCCESS);
18190 ASSERT_TRUE(pass);
18191
18192 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18193 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
18194
18195 // Next, do a 2nd try with surface_format_count being set too high:
18196 surface_present_mode_count += 5;
18197 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18198 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18199 pass = (err == VK_SUCCESS);
18200 ASSERT_TRUE(pass);
18201 m_errorMonitor->VerifyFound();
18202
18203 // Finally, do a correct 1st and 2nd try:
18204 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18205 pass = (err == VK_SUCCESS);
18206 ASSERT_TRUE(pass);
18207 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18208 pass = (err == VK_SUCCESS);
18209 ASSERT_TRUE(pass);
18210
18211 // Create a swapchain:
18212
18213 // First, try without a pointer to swapchain_create_info:
18214 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
18215 "specified as NULL");
18216
18217 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
18218 pass = (err != VK_SUCCESS);
18219 ASSERT_TRUE(pass);
18220 m_errorMonitor->VerifyFound();
18221
18222 // Next, call with a non-NULL swapchain_create_info, that has the wrong
18223 // sType:
18224 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18225 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18226
18227 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18228 pass = (err != VK_SUCCESS);
18229 ASSERT_TRUE(pass);
18230 m_errorMonitor->VerifyFound();
18231
18232 // Next, call with a NULL swapchain pointer:
18233 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18234 swapchain_create_info.pNext = NULL;
18235 swapchain_create_info.flags = 0;
18236 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
18237 "specified as NULL");
18238
18239 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
18240 pass = (err != VK_SUCCESS);
18241 ASSERT_TRUE(pass);
18242 m_errorMonitor->VerifyFound();
18243
18244 // TODO: Enhance swapchain layer so that
18245 // swapchain_create_info.queueFamilyIndexCount is checked against something?
18246
18247 // Next, call with a queue family index that's too large:
18248 uint32_t queueFamilyIndex[2] = { 100000, 0 };
18249 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18250 swapchain_create_info.queueFamilyIndexCount = 2;
18251 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
18252 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18253 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18254 pass = (err != VK_SUCCESS);
18255 ASSERT_TRUE(pass);
18256 m_errorMonitor->VerifyFound();
18257
18258 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
18259 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18260 swapchain_create_info.queueFamilyIndexCount = 1;
18261 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18262 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
18263 "pCreateInfo->pQueueFamilyIndices).");
18264 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18265 pass = (err != VK_SUCCESS);
18266 ASSERT_TRUE(pass);
18267 m_errorMonitor->VerifyFound();
18268
18269 // Next, call with an invalid imageSharingMode:
18270 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
18271 swapchain_create_info.queueFamilyIndexCount = 1;
18272 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18273 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
18274 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18275 pass = (err != VK_SUCCESS);
18276 ASSERT_TRUE(pass);
18277 m_errorMonitor->VerifyFound();
18278 // Fix for the future:
18279 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18280 // SUPPORTED
18281 swapchain_create_info.queueFamilyIndexCount = 0;
18282 queueFamilyIndex[0] = 0;
18283 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
18284
18285 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
18286 // Get the images from a swapchain:
18287 // Acquire an image from a swapchain:
18288 // Present an image to a swapchain:
18289 // Destroy the swapchain:
18290
18291 // TODOs:
18292 //
18293 // - Try destroying the device without first destroying the swapchain
18294 //
18295 // - Try destroying the device without first destroying the surface
18296 //
18297 // - Try destroying the surface without first destroying the swapchain
18298
18299 // Destroy the surface:
18300 vkDestroySurfaceKHR(instance(), surface, NULL);
18301
18302 // Tear down the window:
18303 xcb_destroy_window(connection, xcb_window);
18304 xcb_disconnect(connection);
18305
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018306#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018307 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018308#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018309}
Chris Forbes09368e42016-10-13 11:59:22 +130018310#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018311
18312//
18313// POSITIVE VALIDATION TESTS
18314//
18315// These tests do not expect to encounter ANY validation errors pass only if this is true
18316
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018317TEST_F(VkPositiveLayerTest, SecondaryCommandBufferClearColorAttachments) {
18318 TEST_DESCRIPTION("Create a secondary command buffer and record a CmdClearAttachments call into it");
Tony Barbour1fa09702017-03-16 12:09:08 -060018319 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018320 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18321
18322 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18323 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018324 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018325 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18326 command_buffer_allocate_info.commandBufferCount = 1;
18327
18328 VkCommandBuffer secondary_command_buffer;
18329 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18330 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18331 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18332 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18333 command_buffer_inheritance_info.renderPass = m_renderPass;
18334 command_buffer_inheritance_info.framebuffer = m_framebuffer;
18335
18336 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18337 command_buffer_begin_info.flags =
18338 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
18339 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18340
18341 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18342 VkClearAttachment color_attachment;
18343 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18344 color_attachment.clearValue.color.float32[0] = 0;
18345 color_attachment.clearValue.color.float32[1] = 0;
18346 color_attachment.clearValue.color.float32[2] = 0;
18347 color_attachment.clearValue.color.float32[3] = 0;
18348 color_attachment.colorAttachment = 0;
18349 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
18350 vkCmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
18351}
18352
Tobin Ehlise0006882016-11-03 10:14:28 -060018353TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018354 TEST_DESCRIPTION(
18355 "Perform an image layout transition in a secondary command buffer followed "
18356 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060018357 VkResult err;
18358 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060018359 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070018360 auto depth_format = find_depth_stencil_format(m_device);
18361 if (!depth_format) {
18362 return;
18363 }
Tobin Ehlise0006882016-11-03 10:14:28 -060018364 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18365 // Allocate a secondary and primary cmd buffer
18366 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18367 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018368 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Tobin Ehlise0006882016-11-03 10:14:28 -060018369 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18370 command_buffer_allocate_info.commandBufferCount = 1;
18371
18372 VkCommandBuffer secondary_command_buffer;
18373 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18374 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18375 VkCommandBuffer primary_command_buffer;
18376 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
18377 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18378 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18379 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18380 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18381 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
18382 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18383
18384 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18385 ASSERT_VK_SUCCESS(err);
18386 VkImageObj image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -070018387 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 -060018388 ASSERT_TRUE(image.initialized());
18389 VkImageMemoryBarrier img_barrier = {};
18390 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18391 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18392 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18393 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18394 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18395 img_barrier.image = image.handle();
18396 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18397 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18398 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18399 img_barrier.subresourceRange.baseArrayLayer = 0;
18400 img_barrier.subresourceRange.baseMipLevel = 0;
18401 img_barrier.subresourceRange.layerCount = 1;
18402 img_barrier.subresourceRange.levelCount = 1;
18403 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
18404 0, nullptr, 1, &img_barrier);
18405 err = vkEndCommandBuffer(secondary_command_buffer);
18406 ASSERT_VK_SUCCESS(err);
18407
18408 // Now update primary cmd buffer to execute secondary and transitions image
18409 command_buffer_begin_info.pInheritanceInfo = nullptr;
18410 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
18411 ASSERT_VK_SUCCESS(err);
18412 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
18413 VkImageMemoryBarrier img_barrier2 = {};
18414 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18415 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18416 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18417 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18418 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18419 img_barrier2.image = image.handle();
18420 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18421 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18422 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18423 img_barrier2.subresourceRange.baseArrayLayer = 0;
18424 img_barrier2.subresourceRange.baseMipLevel = 0;
18425 img_barrier2.subresourceRange.layerCount = 1;
18426 img_barrier2.subresourceRange.levelCount = 1;
18427 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
18428 nullptr, 1, &img_barrier2);
18429 err = vkEndCommandBuffer(primary_command_buffer);
18430 ASSERT_VK_SUCCESS(err);
18431 VkSubmitInfo submit_info = {};
18432 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18433 submit_info.commandBufferCount = 1;
18434 submit_info.pCommandBuffers = &primary_command_buffer;
18435 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18436 ASSERT_VK_SUCCESS(err);
18437 m_errorMonitor->VerifyNotFound();
18438 err = vkDeviceWaitIdle(m_device->device());
18439 ASSERT_VK_SUCCESS(err);
Mike Schuchardt06304c22017-03-01 17:09:09 -070018440 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &secondary_command_buffer);
18441 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &primary_command_buffer);
Tobin Ehlise0006882016-11-03 10:14:28 -060018442}
18443
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018444// This is a positive test. No failures are expected.
18445TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018446 TEST_DESCRIPTION(
18447 "Ensure that the vkUpdateDescriptorSets validation code "
18448 "is ignoring VkWriteDescriptorSet members that are not "
18449 "related to the descriptor type specified by "
18450 "VkWriteDescriptorSet::descriptorType. Correct "
18451 "validation behavior will result in the test running to "
18452 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018453
18454 const uintptr_t invalid_ptr = 0xcdcdcdcd;
18455
Tony Barbour1fa09702017-03-16 12:09:08 -060018456 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018457
18458 // Image Case
18459 {
18460 m_errorMonitor->ExpectSuccess();
18461
18462 VkImage image;
18463 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
18464 const int32_t tex_width = 32;
18465 const int32_t tex_height = 32;
18466 VkImageCreateInfo image_create_info = {};
18467 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18468 image_create_info.pNext = NULL;
18469 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18470 image_create_info.format = tex_format;
18471 image_create_info.extent.width = tex_width;
18472 image_create_info.extent.height = tex_height;
18473 image_create_info.extent.depth = 1;
18474 image_create_info.mipLevels = 1;
18475 image_create_info.arrayLayers = 1;
18476 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18477 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18478 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18479 image_create_info.flags = 0;
18480 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
18481 ASSERT_VK_SUCCESS(err);
18482
18483 VkMemoryRequirements memory_reqs;
18484 VkDeviceMemory image_memory;
18485 bool pass;
18486 VkMemoryAllocateInfo memory_info = {};
18487 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18488 memory_info.pNext = NULL;
18489 memory_info.allocationSize = 0;
18490 memory_info.memoryTypeIndex = 0;
18491 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
18492 memory_info.allocationSize = memory_reqs.size;
18493 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18494 ASSERT_TRUE(pass);
18495 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
18496 ASSERT_VK_SUCCESS(err);
18497 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
18498 ASSERT_VK_SUCCESS(err);
18499
18500 VkImageViewCreateInfo image_view_create_info = {};
18501 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
18502 image_view_create_info.image = image;
18503 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18504 image_view_create_info.format = tex_format;
18505 image_view_create_info.subresourceRange.layerCount = 1;
18506 image_view_create_info.subresourceRange.baseMipLevel = 0;
18507 image_view_create_info.subresourceRange.levelCount = 1;
18508 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18509
18510 VkImageView view;
18511 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
18512 ASSERT_VK_SUCCESS(err);
18513
18514 VkDescriptorPoolSize ds_type_count = {};
18515 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18516 ds_type_count.descriptorCount = 1;
18517
18518 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18519 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18520 ds_pool_ci.pNext = NULL;
18521 ds_pool_ci.maxSets = 1;
18522 ds_pool_ci.poolSizeCount = 1;
18523 ds_pool_ci.pPoolSizes = &ds_type_count;
18524
18525 VkDescriptorPool ds_pool;
18526 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18527 ASSERT_VK_SUCCESS(err);
18528
18529 VkDescriptorSetLayoutBinding dsl_binding = {};
18530 dsl_binding.binding = 0;
18531 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18532 dsl_binding.descriptorCount = 1;
18533 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18534 dsl_binding.pImmutableSamplers = NULL;
18535
18536 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18537 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18538 ds_layout_ci.pNext = NULL;
18539 ds_layout_ci.bindingCount = 1;
18540 ds_layout_ci.pBindings = &dsl_binding;
18541 VkDescriptorSetLayout ds_layout;
18542 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18543 ASSERT_VK_SUCCESS(err);
18544
18545 VkDescriptorSet descriptor_set;
18546 VkDescriptorSetAllocateInfo alloc_info = {};
18547 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18548 alloc_info.descriptorSetCount = 1;
18549 alloc_info.descriptorPool = ds_pool;
18550 alloc_info.pSetLayouts = &ds_layout;
18551 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18552 ASSERT_VK_SUCCESS(err);
18553
18554 VkDescriptorImageInfo image_info = {};
18555 image_info.imageView = view;
18556 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
18557
18558 VkWriteDescriptorSet descriptor_write;
18559 memset(&descriptor_write, 0, sizeof(descriptor_write));
18560 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18561 descriptor_write.dstSet = descriptor_set;
18562 descriptor_write.dstBinding = 0;
18563 descriptor_write.descriptorCount = 1;
18564 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18565 descriptor_write.pImageInfo = &image_info;
18566
18567 // Set pBufferInfo and pTexelBufferView to invalid values, which should
18568 // be
18569 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
18570 // This will most likely produce a crash if the parameter_validation
18571 // layer
18572 // does not correctly ignore pBufferInfo.
18573 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18574 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18575
18576 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18577
18578 m_errorMonitor->VerifyNotFound();
18579
18580 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18581 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18582 vkDestroyImageView(m_device->device(), view, NULL);
18583 vkDestroyImage(m_device->device(), image, NULL);
18584 vkFreeMemory(m_device->device(), image_memory, NULL);
18585 }
18586
18587 // Buffer Case
18588 {
18589 m_errorMonitor->ExpectSuccess();
18590
18591 VkBuffer buffer;
18592 uint32_t queue_family_index = 0;
18593 VkBufferCreateInfo buffer_create_info = {};
18594 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18595 buffer_create_info.size = 1024;
18596 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18597 buffer_create_info.queueFamilyIndexCount = 1;
18598 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18599
18600 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18601 ASSERT_VK_SUCCESS(err);
18602
18603 VkMemoryRequirements memory_reqs;
18604 VkDeviceMemory buffer_memory;
18605 bool pass;
18606 VkMemoryAllocateInfo memory_info = {};
18607 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18608 memory_info.pNext = NULL;
18609 memory_info.allocationSize = 0;
18610 memory_info.memoryTypeIndex = 0;
18611
18612 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18613 memory_info.allocationSize = memory_reqs.size;
18614 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18615 ASSERT_TRUE(pass);
18616
18617 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18618 ASSERT_VK_SUCCESS(err);
18619 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18620 ASSERT_VK_SUCCESS(err);
18621
18622 VkDescriptorPoolSize ds_type_count = {};
18623 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18624 ds_type_count.descriptorCount = 1;
18625
18626 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18627 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18628 ds_pool_ci.pNext = NULL;
18629 ds_pool_ci.maxSets = 1;
18630 ds_pool_ci.poolSizeCount = 1;
18631 ds_pool_ci.pPoolSizes = &ds_type_count;
18632
18633 VkDescriptorPool ds_pool;
18634 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18635 ASSERT_VK_SUCCESS(err);
18636
18637 VkDescriptorSetLayoutBinding dsl_binding = {};
18638 dsl_binding.binding = 0;
18639 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18640 dsl_binding.descriptorCount = 1;
18641 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18642 dsl_binding.pImmutableSamplers = NULL;
18643
18644 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18645 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18646 ds_layout_ci.pNext = NULL;
18647 ds_layout_ci.bindingCount = 1;
18648 ds_layout_ci.pBindings = &dsl_binding;
18649 VkDescriptorSetLayout ds_layout;
18650 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18651 ASSERT_VK_SUCCESS(err);
18652
18653 VkDescriptorSet descriptor_set;
18654 VkDescriptorSetAllocateInfo alloc_info = {};
18655 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18656 alloc_info.descriptorSetCount = 1;
18657 alloc_info.descriptorPool = ds_pool;
18658 alloc_info.pSetLayouts = &ds_layout;
18659 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18660 ASSERT_VK_SUCCESS(err);
18661
18662 VkDescriptorBufferInfo buffer_info = {};
18663 buffer_info.buffer = buffer;
18664 buffer_info.offset = 0;
18665 buffer_info.range = 1024;
18666
18667 VkWriteDescriptorSet descriptor_write;
18668 memset(&descriptor_write, 0, sizeof(descriptor_write));
18669 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18670 descriptor_write.dstSet = descriptor_set;
18671 descriptor_write.dstBinding = 0;
18672 descriptor_write.descriptorCount = 1;
18673 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18674 descriptor_write.pBufferInfo = &buffer_info;
18675
18676 // Set pImageInfo and pTexelBufferView to invalid values, which should
18677 // be
18678 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
18679 // This will most likely produce a crash if the parameter_validation
18680 // layer
18681 // does not correctly ignore pImageInfo.
18682 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18683 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18684
18685 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18686
18687 m_errorMonitor->VerifyNotFound();
18688
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018689 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18690 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18691 vkDestroyBuffer(m_device->device(), buffer, NULL);
18692 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18693 }
18694
18695 // Texel Buffer Case
18696 {
18697 m_errorMonitor->ExpectSuccess();
18698
18699 VkBuffer buffer;
18700 uint32_t queue_family_index = 0;
18701 VkBufferCreateInfo buffer_create_info = {};
18702 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18703 buffer_create_info.size = 1024;
18704 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
18705 buffer_create_info.queueFamilyIndexCount = 1;
18706 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18707
18708 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18709 ASSERT_VK_SUCCESS(err);
18710
18711 VkMemoryRequirements memory_reqs;
18712 VkDeviceMemory buffer_memory;
18713 bool pass;
18714 VkMemoryAllocateInfo memory_info = {};
18715 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18716 memory_info.pNext = NULL;
18717 memory_info.allocationSize = 0;
18718 memory_info.memoryTypeIndex = 0;
18719
18720 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18721 memory_info.allocationSize = memory_reqs.size;
18722 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18723 ASSERT_TRUE(pass);
18724
18725 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18726 ASSERT_VK_SUCCESS(err);
18727 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18728 ASSERT_VK_SUCCESS(err);
18729
18730 VkBufferViewCreateInfo buff_view_ci = {};
18731 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
18732 buff_view_ci.buffer = buffer;
18733 buff_view_ci.format = VK_FORMAT_R8_UNORM;
18734 buff_view_ci.range = VK_WHOLE_SIZE;
18735 VkBufferView buffer_view;
18736 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
18737
18738 VkDescriptorPoolSize ds_type_count = {};
18739 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18740 ds_type_count.descriptorCount = 1;
18741
18742 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18743 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18744 ds_pool_ci.pNext = NULL;
18745 ds_pool_ci.maxSets = 1;
18746 ds_pool_ci.poolSizeCount = 1;
18747 ds_pool_ci.pPoolSizes = &ds_type_count;
18748
18749 VkDescriptorPool ds_pool;
18750 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18751 ASSERT_VK_SUCCESS(err);
18752
18753 VkDescriptorSetLayoutBinding dsl_binding = {};
18754 dsl_binding.binding = 0;
18755 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18756 dsl_binding.descriptorCount = 1;
18757 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18758 dsl_binding.pImmutableSamplers = NULL;
18759
18760 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18761 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18762 ds_layout_ci.pNext = NULL;
18763 ds_layout_ci.bindingCount = 1;
18764 ds_layout_ci.pBindings = &dsl_binding;
18765 VkDescriptorSetLayout ds_layout;
18766 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18767 ASSERT_VK_SUCCESS(err);
18768
18769 VkDescriptorSet descriptor_set;
18770 VkDescriptorSetAllocateInfo alloc_info = {};
18771 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18772 alloc_info.descriptorSetCount = 1;
18773 alloc_info.descriptorPool = ds_pool;
18774 alloc_info.pSetLayouts = &ds_layout;
18775 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18776 ASSERT_VK_SUCCESS(err);
18777
18778 VkWriteDescriptorSet descriptor_write;
18779 memset(&descriptor_write, 0, sizeof(descriptor_write));
18780 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18781 descriptor_write.dstSet = descriptor_set;
18782 descriptor_write.dstBinding = 0;
18783 descriptor_write.descriptorCount = 1;
18784 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18785 descriptor_write.pTexelBufferView = &buffer_view;
18786
18787 // Set pImageInfo and pBufferInfo to invalid values, which should be
18788 // ignored for descriptorType ==
18789 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
18790 // This will most likely produce a crash if the parameter_validation
18791 // layer
18792 // does not correctly ignore pImageInfo and pBufferInfo.
18793 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18794 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18795
18796 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18797
18798 m_errorMonitor->VerifyNotFound();
18799
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018800 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18801 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18802 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
18803 vkDestroyBuffer(m_device->device(), buffer, NULL);
18804 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18805 }
18806}
18807
Tobin Ehlisf7428442016-10-25 07:58:24 -060018808TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
18809 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
18810
Tony Barbour1fa09702017-03-16 12:09:08 -060018811 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf7428442016-10-25 07:58:24 -060018812 // Create layout where two binding #s are "1"
18813 static const uint32_t NUM_BINDINGS = 3;
18814 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
18815 dsl_binding[0].binding = 1;
18816 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18817 dsl_binding[0].descriptorCount = 1;
18818 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18819 dsl_binding[0].pImmutableSamplers = NULL;
18820 dsl_binding[1].binding = 0;
18821 dsl_binding[1].descriptorCount = 1;
18822 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18823 dsl_binding[1].descriptorCount = 1;
18824 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18825 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018826 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060018827 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18828 dsl_binding[2].descriptorCount = 1;
18829 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18830 dsl_binding[2].pImmutableSamplers = NULL;
18831
18832 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18833 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18834 ds_layout_ci.pNext = NULL;
18835 ds_layout_ci.bindingCount = NUM_BINDINGS;
18836 ds_layout_ci.pBindings = dsl_binding;
18837 VkDescriptorSetLayout ds_layout;
18838 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
18839 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18840 m_errorMonitor->VerifyFound();
18841}
18842
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060018843TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018844 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
18845
Tony Barbour1fa09702017-03-16 12:09:08 -060018846 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018847
Tony Barbour552f6c02016-12-21 14:34:07 -070018848 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018849
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060018850 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
18851
18852 {
18853 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
18854 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
18855 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18856 m_errorMonitor->VerifyFound();
18857 }
18858
18859 {
18860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
18861 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
18862 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18863 m_errorMonitor->VerifyFound();
18864 }
18865
18866 {
18867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
18868 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
18869 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18870 m_errorMonitor->VerifyFound();
18871 }
18872
18873 {
18874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
18875 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
18876 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18877 m_errorMonitor->VerifyFound();
18878 }
18879
18880 {
18881 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
18882 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
18883 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18884 m_errorMonitor->VerifyFound();
18885 }
18886
18887 {
18888 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
18889 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
18890 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18891 m_errorMonitor->VerifyFound();
18892 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018893
18894 {
18895 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
18896 VkRect2D scissor = {{-1, 0}, {16, 16}};
18897 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18898 m_errorMonitor->VerifyFound();
18899 }
18900
18901 {
18902 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
18903 VkRect2D scissor = {{0, -2}, {16, 16}};
18904 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18905 m_errorMonitor->VerifyFound();
18906 }
18907
18908 {
18909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
18910 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
18911 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18912 m_errorMonitor->VerifyFound();
18913 }
18914
18915 {
18916 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
18917 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
18918 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18919 m_errorMonitor->VerifyFound();
18920 }
18921
Tony Barbour552f6c02016-12-21 14:34:07 -070018922 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018923}
18924
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018925// This is a positive test. No failures are expected.
18926TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
18927 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
18928 VkResult err;
18929
Tony Barbour1fa09702017-03-16 12:09:08 -060018930 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018931 m_errorMonitor->ExpectSuccess();
18932 VkDescriptorPoolSize ds_type_count = {};
18933 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18934 ds_type_count.descriptorCount = 2;
18935
18936 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18937 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18938 ds_pool_ci.pNext = NULL;
18939 ds_pool_ci.maxSets = 1;
18940 ds_pool_ci.poolSizeCount = 1;
18941 ds_pool_ci.pPoolSizes = &ds_type_count;
18942
18943 VkDescriptorPool ds_pool;
18944 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18945 ASSERT_VK_SUCCESS(err);
18946
18947 // Create layout with two uniform buffer descriptors w/ empty binding between them
18948 static const uint32_t NUM_BINDINGS = 3;
18949 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
18950 dsl_binding[0].binding = 0;
18951 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18952 dsl_binding[0].descriptorCount = 1;
18953 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
18954 dsl_binding[0].pImmutableSamplers = NULL;
18955 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018956 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018957 dsl_binding[2].binding = 2;
18958 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18959 dsl_binding[2].descriptorCount = 1;
18960 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
18961 dsl_binding[2].pImmutableSamplers = NULL;
18962
18963 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18964 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18965 ds_layout_ci.pNext = NULL;
18966 ds_layout_ci.bindingCount = NUM_BINDINGS;
18967 ds_layout_ci.pBindings = dsl_binding;
18968 VkDescriptorSetLayout ds_layout;
18969 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18970 ASSERT_VK_SUCCESS(err);
18971
18972 VkDescriptorSet descriptor_set = {};
18973 VkDescriptorSetAllocateInfo alloc_info = {};
18974 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18975 alloc_info.descriptorSetCount = 1;
18976 alloc_info.descriptorPool = ds_pool;
18977 alloc_info.pSetLayouts = &ds_layout;
18978 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18979 ASSERT_VK_SUCCESS(err);
18980
18981 // Create a buffer to be used for update
18982 VkBufferCreateInfo buff_ci = {};
18983 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18984 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18985 buff_ci.size = 256;
18986 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
18987 VkBuffer buffer;
18988 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
18989 ASSERT_VK_SUCCESS(err);
18990 // Have to bind memory to buffer before descriptor update
18991 VkMemoryAllocateInfo mem_alloc = {};
18992 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18993 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018994 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018995 mem_alloc.memoryTypeIndex = 0;
18996
18997 VkMemoryRequirements mem_reqs;
18998 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
18999 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
19000 if (!pass) {
19001 vkDestroyBuffer(m_device->device(), buffer, NULL);
19002 return;
19003 }
19004
19005 VkDeviceMemory mem;
19006 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
19007 ASSERT_VK_SUCCESS(err);
19008 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19009 ASSERT_VK_SUCCESS(err);
19010
19011 // Only update the descriptor at binding 2
19012 VkDescriptorBufferInfo buff_info = {};
19013 buff_info.buffer = buffer;
19014 buff_info.offset = 0;
19015 buff_info.range = VK_WHOLE_SIZE;
19016 VkWriteDescriptorSet descriptor_write = {};
19017 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19018 descriptor_write.dstBinding = 2;
19019 descriptor_write.descriptorCount = 1;
19020 descriptor_write.pTexelBufferView = nullptr;
19021 descriptor_write.pBufferInfo = &buff_info;
19022 descriptor_write.pImageInfo = nullptr;
19023 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19024 descriptor_write.dstSet = descriptor_set;
19025
19026 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19027
19028 m_errorMonitor->VerifyNotFound();
19029 // Cleanup
19030 vkFreeMemory(m_device->device(), mem, NULL);
19031 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19032 vkDestroyBuffer(m_device->device(), buffer, NULL);
19033 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19034}
19035
19036// This is a positive test. No failures are expected.
19037TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
19038 VkResult err;
19039 bool pass;
19040
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019041 TEST_DESCRIPTION(
19042 "Create a buffer, allocate memory, bind memory, destroy "
19043 "the buffer, create an image, and bind the same memory to "
19044 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019045
19046 m_errorMonitor->ExpectSuccess();
19047
Tony Barbour1fa09702017-03-16 12:09:08 -060019048 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019049
19050 VkBuffer buffer;
19051 VkImage image;
19052 VkDeviceMemory mem;
19053 VkMemoryRequirements mem_reqs;
19054
19055 VkBufferCreateInfo buf_info = {};
19056 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19057 buf_info.pNext = NULL;
19058 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19059 buf_info.size = 256;
19060 buf_info.queueFamilyIndexCount = 0;
19061 buf_info.pQueueFamilyIndices = NULL;
19062 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19063 buf_info.flags = 0;
19064 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
19065 ASSERT_VK_SUCCESS(err);
19066
19067 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19068
19069 VkMemoryAllocateInfo alloc_info = {};
19070 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19071 alloc_info.pNext = NULL;
19072 alloc_info.memoryTypeIndex = 0;
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019073
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019074 // Ensure memory is big enough for both bindings
19075 alloc_info.allocationSize = 0x10000;
19076
19077 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19078 if (!pass) {
19079 vkDestroyBuffer(m_device->device(), buffer, NULL);
19080 return;
19081 }
19082
19083 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19084 ASSERT_VK_SUCCESS(err);
19085
19086 uint8_t *pData;
19087 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
19088 ASSERT_VK_SUCCESS(err);
19089
19090 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
19091
19092 vkUnmapMemory(m_device->device(), mem);
19093
19094 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19095 ASSERT_VK_SUCCESS(err);
19096
19097 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
19098 // memory. In fact, it was never used by the GPU.
19099 // Just be be sure, wait for idle.
19100 vkDestroyBuffer(m_device->device(), buffer, NULL);
19101 vkDeviceWaitIdle(m_device->device());
19102
Tobin Ehlis6a005702016-12-28 15:25:56 -070019103 // Use optimal as some platforms report linear support but then fail image creation
19104 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
19105 VkImageFormatProperties image_format_properties;
19106 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
19107 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
19108 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070019109 printf(" Image format not supported; skipped.\n");
Tobin Ehlis6a005702016-12-28 15:25:56 -070019110 vkFreeMemory(m_device->device(), mem, NULL);
19111 return;
19112 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019113 VkImageCreateInfo image_create_info = {};
19114 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19115 image_create_info.pNext = NULL;
19116 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19117 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
19118 image_create_info.extent.width = 64;
19119 image_create_info.extent.height = 64;
19120 image_create_info.extent.depth = 1;
19121 image_create_info.mipLevels = 1;
19122 image_create_info.arrayLayers = 1;
19123 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070019124 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019125 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
19126 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
19127 image_create_info.queueFamilyIndexCount = 0;
19128 image_create_info.pQueueFamilyIndices = NULL;
19129 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19130 image_create_info.flags = 0;
19131
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019132 /* Create a mappable image. It will be the texture if linear images are ok
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019133 * to be textures or it will be the staging image if they are not.
19134 */
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019135 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19136 ASSERT_VK_SUCCESS(err);
19137
19138 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
19139
Tobin Ehlis6a005702016-12-28 15:25:56 -070019140 VkMemoryAllocateInfo mem_alloc = {};
19141 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19142 mem_alloc.pNext = NULL;
19143 mem_alloc.allocationSize = 0;
19144 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019145 mem_alloc.allocationSize = mem_reqs.size;
19146
19147 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19148 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070019149 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019150 vkDestroyImage(m_device->device(), image, NULL);
19151 return;
19152 }
19153
19154 // VALIDATION FAILURE:
19155 err = vkBindImageMemory(m_device->device(), image, mem, 0);
19156 ASSERT_VK_SUCCESS(err);
19157
19158 m_errorMonitor->VerifyNotFound();
19159
19160 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019161 vkDestroyImage(m_device->device(), image, NULL);
19162}
19163
Tony Barbourab713912017-02-02 14:17:35 -070019164// This is a positive test. No failures are expected.
19165TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
19166 VkResult err;
19167
19168 TEST_DESCRIPTION(
19169 "Call all applicable destroy and free routines with NULL"
19170 "handles, expecting no validation errors");
19171
19172 m_errorMonitor->ExpectSuccess();
19173
Tony Barbour1fa09702017-03-16 12:09:08 -060019174 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourab713912017-02-02 14:17:35 -070019175 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19176 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
19177 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
19178 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
19179 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19180 vkDestroyDevice(VK_NULL_HANDLE, NULL);
19181 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
19182 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
19183 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19184 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
19185 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
19186 vkDestroyInstance(VK_NULL_HANDLE, NULL);
19187 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
19188 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
19189 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19190 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
19191 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
19192 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
19193 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
19194 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
19195
19196 VkCommandPool command_pool;
19197 VkCommandPoolCreateInfo pool_create_info{};
19198 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19199 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19200 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19201 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19202 VkCommandBuffer command_buffers[3] = {};
19203 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19204 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19205 command_buffer_allocate_info.commandPool = command_pool;
19206 command_buffer_allocate_info.commandBufferCount = 1;
19207 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19208 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
19209 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
19210 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19211
19212 VkDescriptorPoolSize ds_type_count = {};
19213 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19214 ds_type_count.descriptorCount = 1;
19215
19216 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19217 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19218 ds_pool_ci.pNext = NULL;
19219 ds_pool_ci.maxSets = 1;
19220 ds_pool_ci.poolSizeCount = 1;
19221 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
19222 ds_pool_ci.pPoolSizes = &ds_type_count;
19223
19224 VkDescriptorPool ds_pool;
19225 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19226 ASSERT_VK_SUCCESS(err);
19227
19228 VkDescriptorSetLayoutBinding dsl_binding = {};
19229 dsl_binding.binding = 2;
19230 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19231 dsl_binding.descriptorCount = 1;
19232 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19233 dsl_binding.pImmutableSamplers = NULL;
19234 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19235 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19236 ds_layout_ci.pNext = NULL;
19237 ds_layout_ci.bindingCount = 1;
19238 ds_layout_ci.pBindings = &dsl_binding;
19239 VkDescriptorSetLayout ds_layout;
19240 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19241 ASSERT_VK_SUCCESS(err);
19242
19243 VkDescriptorSet descriptor_sets[3] = {};
19244 VkDescriptorSetAllocateInfo alloc_info = {};
19245 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19246 alloc_info.descriptorSetCount = 1;
19247 alloc_info.descriptorPool = ds_pool;
19248 alloc_info.pSetLayouts = &ds_layout;
19249 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
19250 ASSERT_VK_SUCCESS(err);
19251 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
19252 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19253 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19254
19255 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
19256
19257 m_errorMonitor->VerifyNotFound();
19258}
19259
Tony Barbour626994c2017-02-08 15:29:37 -070019260TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070019261 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070019262
19263 m_errorMonitor->ExpectSuccess();
19264
Tony Barbour1fa09702017-03-16 12:09:08 -060019265 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070019266 VkCommandBuffer cmd_bufs[4];
19267 VkCommandBufferAllocateInfo alloc_info;
19268 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19269 alloc_info.pNext = NULL;
19270 alloc_info.commandBufferCount = 4;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019271 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070019272 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19273 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
19274 VkImageObj image(m_device);
Mike Weiblen62d08a32017-03-07 22:18:27 -070019275 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
19276 (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
19277 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour626994c2017-02-08 15:29:37 -070019278 ASSERT_TRUE(image.initialized());
19279 VkCommandBufferBeginInfo cb_binfo;
19280 cb_binfo.pNext = NULL;
19281 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19282 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
19283 cb_binfo.flags = 0;
19284 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
19285 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
19286 VkImageMemoryBarrier img_barrier = {};
19287 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19288 img_barrier.pNext = NULL;
19289 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19290 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19291 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19292 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
19293 img_barrier.image = image.handle();
19294 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19295 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19296 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19297 img_barrier.subresourceRange.baseArrayLayer = 0;
19298 img_barrier.subresourceRange.baseMipLevel = 0;
19299 img_barrier.subresourceRange.layerCount = 1;
19300 img_barrier.subresourceRange.levelCount = 1;
19301 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19302 &img_barrier);
19303 vkEndCommandBuffer(cmd_bufs[0]);
19304 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
19305 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
19306 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19307 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19308 &img_barrier);
19309 vkEndCommandBuffer(cmd_bufs[1]);
19310 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
19311 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19312 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19313 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19314 &img_barrier);
19315 vkEndCommandBuffer(cmd_bufs[2]);
19316 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
19317 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19318 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
19319 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19320 &img_barrier);
19321 vkEndCommandBuffer(cmd_bufs[3]);
19322
19323 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
19324 VkSemaphore semaphore1, semaphore2;
19325 VkSemaphoreCreateInfo semaphore_create_info{};
19326 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19327 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
19328 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
19329 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
19330 VkSubmitInfo submit_info[3];
19331 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19332 submit_info[0].pNext = nullptr;
19333 submit_info[0].commandBufferCount = 1;
19334 submit_info[0].pCommandBuffers = &cmd_bufs[0];
19335 submit_info[0].signalSemaphoreCount = 1;
19336 submit_info[0].pSignalSemaphores = &semaphore1;
19337 submit_info[0].waitSemaphoreCount = 0;
19338 submit_info[0].pWaitDstStageMask = nullptr;
19339 submit_info[0].pWaitDstStageMask = flags;
19340 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19341 submit_info[1].pNext = nullptr;
19342 submit_info[1].commandBufferCount = 1;
19343 submit_info[1].pCommandBuffers = &cmd_bufs[1];
19344 submit_info[1].waitSemaphoreCount = 1;
19345 submit_info[1].pWaitSemaphores = &semaphore1;
19346 submit_info[1].signalSemaphoreCount = 1;
19347 submit_info[1].pSignalSemaphores = &semaphore2;
19348 submit_info[1].pWaitDstStageMask = flags;
19349 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19350 submit_info[2].pNext = nullptr;
19351 submit_info[2].commandBufferCount = 2;
19352 submit_info[2].pCommandBuffers = &cmd_bufs[2];
19353 submit_info[2].waitSemaphoreCount = 1;
19354 submit_info[2].pWaitSemaphores = &semaphore2;
19355 submit_info[2].signalSemaphoreCount = 0;
19356 submit_info[2].pSignalSemaphores = nullptr;
19357 submit_info[2].pWaitDstStageMask = flags;
19358 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
19359 vkQueueWaitIdle(m_device->m_queue);
19360
19361 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
19362 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
19363 m_errorMonitor->VerifyNotFound();
19364}
19365
Tobin Ehlis953e8392016-11-17 10:54:13 -070019366TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
19367 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
19368 // We previously had a bug where dynamic offset of inactive bindings was still being used
19369 VkResult err;
19370 m_errorMonitor->ExpectSuccess();
19371
Tony Barbour1fa09702017-03-16 12:09:08 -060019372 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis953e8392016-11-17 10:54:13 -070019373 ASSERT_NO_FATAL_FAILURE(InitViewport());
19374 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19375
19376 VkDescriptorPoolSize ds_type_count = {};
19377 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19378 ds_type_count.descriptorCount = 3;
19379
19380 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19381 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19382 ds_pool_ci.pNext = NULL;
19383 ds_pool_ci.maxSets = 1;
19384 ds_pool_ci.poolSizeCount = 1;
19385 ds_pool_ci.pPoolSizes = &ds_type_count;
19386
19387 VkDescriptorPool ds_pool;
19388 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19389 ASSERT_VK_SUCCESS(err);
19390
19391 const uint32_t BINDING_COUNT = 3;
19392 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019393 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019394 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19395 dsl_binding[0].descriptorCount = 1;
19396 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19397 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019398 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019399 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19400 dsl_binding[1].descriptorCount = 1;
19401 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19402 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019403 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019404 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19405 dsl_binding[2].descriptorCount = 1;
19406 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19407 dsl_binding[2].pImmutableSamplers = NULL;
19408
19409 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19410 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19411 ds_layout_ci.pNext = NULL;
19412 ds_layout_ci.bindingCount = BINDING_COUNT;
19413 ds_layout_ci.pBindings = dsl_binding;
19414 VkDescriptorSetLayout ds_layout;
19415 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19416 ASSERT_VK_SUCCESS(err);
19417
19418 VkDescriptorSet descriptor_set;
19419 VkDescriptorSetAllocateInfo alloc_info = {};
19420 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19421 alloc_info.descriptorSetCount = 1;
19422 alloc_info.descriptorPool = ds_pool;
19423 alloc_info.pSetLayouts = &ds_layout;
19424 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19425 ASSERT_VK_SUCCESS(err);
19426
19427 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
19428 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
19429 pipeline_layout_ci.pNext = NULL;
19430 pipeline_layout_ci.setLayoutCount = 1;
19431 pipeline_layout_ci.pSetLayouts = &ds_layout;
19432
19433 VkPipelineLayout pipeline_layout;
19434 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
19435 ASSERT_VK_SUCCESS(err);
19436
19437 // Create two buffers to update the descriptors with
19438 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
19439 uint32_t qfi = 0;
19440 VkBufferCreateInfo buffCI = {};
19441 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19442 buffCI.size = 2048;
19443 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19444 buffCI.queueFamilyIndexCount = 1;
19445 buffCI.pQueueFamilyIndices = &qfi;
19446
19447 VkBuffer dyub1;
19448 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
19449 ASSERT_VK_SUCCESS(err);
19450 // buffer2
19451 buffCI.size = 1024;
19452 VkBuffer dyub2;
19453 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
19454 ASSERT_VK_SUCCESS(err);
19455 // Allocate memory and bind to buffers
19456 VkMemoryAllocateInfo mem_alloc[2] = {};
19457 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19458 mem_alloc[0].pNext = NULL;
19459 mem_alloc[0].memoryTypeIndex = 0;
19460 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19461 mem_alloc[1].pNext = NULL;
19462 mem_alloc[1].memoryTypeIndex = 0;
19463
19464 VkMemoryRequirements mem_reqs1;
19465 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
19466 VkMemoryRequirements mem_reqs2;
19467 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
19468 mem_alloc[0].allocationSize = mem_reqs1.size;
19469 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
19470 mem_alloc[1].allocationSize = mem_reqs2.size;
19471 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
19472 if (!pass) {
19473 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19474 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19475 return;
19476 }
19477
19478 VkDeviceMemory mem1;
19479 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
19480 ASSERT_VK_SUCCESS(err);
19481 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
19482 ASSERT_VK_SUCCESS(err);
19483 VkDeviceMemory mem2;
19484 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
19485 ASSERT_VK_SUCCESS(err);
19486 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
19487 ASSERT_VK_SUCCESS(err);
19488 // Update descriptors
19489 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
19490 buff_info[0].buffer = dyub1;
19491 buff_info[0].offset = 0;
19492 buff_info[0].range = 256;
19493 buff_info[1].buffer = dyub1;
19494 buff_info[1].offset = 256;
19495 buff_info[1].range = 512;
19496 buff_info[2].buffer = dyub2;
19497 buff_info[2].offset = 0;
19498 buff_info[2].range = 512;
19499
19500 VkWriteDescriptorSet descriptor_write;
19501 memset(&descriptor_write, 0, sizeof(descriptor_write));
19502 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19503 descriptor_write.dstSet = descriptor_set;
19504 descriptor_write.dstBinding = 0;
19505 descriptor_write.descriptorCount = BINDING_COUNT;
19506 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19507 descriptor_write.pBufferInfo = buff_info;
19508
19509 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19510
Tony Barbour552f6c02016-12-21 14:34:07 -070019511 m_commandBuffer->BeginCommandBuffer();
19512 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070019513
19514 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019515 char const *vsSource =
19516 "#version 450\n"
19517 "\n"
19518 "out gl_PerVertex { \n"
19519 " vec4 gl_Position;\n"
19520 "};\n"
19521 "void main(){\n"
19522 " gl_Position = vec4(1);\n"
19523 "}\n";
19524 char const *fsSource =
19525 "#version 450\n"
19526 "\n"
19527 "layout(location=0) out vec4 x;\n"
19528 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
19529 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
19530 "void main(){\n"
19531 " x = vec4(bar1.y) + vec4(bar2.y);\n"
19532 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070019533 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19534 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19535 VkPipelineObj pipe(m_device);
19536 pipe.SetViewport(m_viewports);
19537 pipe.SetScissor(m_scissors);
19538 pipe.AddShader(&vs);
19539 pipe.AddShader(&fs);
19540 pipe.AddColorAttachment();
19541 pipe.CreateVKPipeline(pipeline_layout, renderPass());
19542
19543 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
19544 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
19545 // we used to have a bug in this case.
19546 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
19547 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
19548 &descriptor_set, BINDING_COUNT, dyn_off);
19549 Draw(1, 0, 0, 0);
19550 m_errorMonitor->VerifyNotFound();
19551
19552 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19553 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19554 vkFreeMemory(m_device->device(), mem1, NULL);
19555 vkFreeMemory(m_device->device(), mem2, NULL);
19556
19557 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
19558 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19559 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19560}
19561
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019562TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019563 TEST_DESCRIPTION(
19564 "Ensure that validations handling of non-coherent memory "
19565 "mapping while using VK_WHOLE_SIZE does not cause access "
19566 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019567 VkResult err;
19568 uint8_t *pData;
Tony Barbour1fa09702017-03-16 12:09:08 -060019569 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019570
19571 VkDeviceMemory mem;
19572 VkMemoryRequirements mem_reqs;
19573 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019574 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019575 VkMemoryAllocateInfo alloc_info = {};
19576 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19577 alloc_info.pNext = NULL;
19578 alloc_info.memoryTypeIndex = 0;
19579
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019580 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019581 alloc_info.allocationSize = allocation_size;
19582
19583 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
19584 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 -070019585 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019586 if (!pass) {
19587 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019588 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
19589 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019590 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019591 pass = m_device->phy().set_memory_type(
19592 mem_reqs.memoryTypeBits, &alloc_info,
19593 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
19594 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019595 if (!pass) {
19596 return;
19597 }
19598 }
19599 }
19600
19601 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19602 ASSERT_VK_SUCCESS(err);
19603
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019604 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019605 m_errorMonitor->ExpectSuccess();
19606 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19607 ASSERT_VK_SUCCESS(err);
19608 VkMappedMemoryRange mmr = {};
19609 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19610 mmr.memory = mem;
19611 mmr.offset = 0;
19612 mmr.size = VK_WHOLE_SIZE;
19613 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19614 ASSERT_VK_SUCCESS(err);
19615 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19616 ASSERT_VK_SUCCESS(err);
19617 m_errorMonitor->VerifyNotFound();
19618 vkUnmapMemory(m_device->device(), mem);
19619
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019620 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019621 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019622 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019623 ASSERT_VK_SUCCESS(err);
19624 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19625 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019626 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019627 mmr.size = VK_WHOLE_SIZE;
19628 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19629 ASSERT_VK_SUCCESS(err);
19630 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19631 ASSERT_VK_SUCCESS(err);
19632 m_errorMonitor->VerifyNotFound();
19633 vkUnmapMemory(m_device->device(), mem);
19634
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019635 // Map with offset and size
19636 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019637 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019638 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019639 ASSERT_VK_SUCCESS(err);
19640 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19641 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019642 mmr.offset = 4 * atom_size;
19643 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019644 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19645 ASSERT_VK_SUCCESS(err);
19646 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19647 ASSERT_VK_SUCCESS(err);
19648 m_errorMonitor->VerifyNotFound();
19649 vkUnmapMemory(m_device->device(), mem);
19650
19651 // Map without offset and flush WHOLE_SIZE with two separate offsets
19652 m_errorMonitor->ExpectSuccess();
19653 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19654 ASSERT_VK_SUCCESS(err);
19655 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19656 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019657 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019658 mmr.size = VK_WHOLE_SIZE;
19659 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19660 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019661 mmr.offset = allocation_size - (6 * 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);
19665 m_errorMonitor->VerifyNotFound();
19666 vkUnmapMemory(m_device->device(), mem);
19667
19668 vkFreeMemory(m_device->device(), mem, NULL);
19669}
19670
19671// This is a positive test. We used to expect error in this case but spec now allows it
19672TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
19673 m_errorMonitor->ExpectSuccess();
19674 vk_testing::Fence testFence;
19675 VkFenceCreateInfo fenceInfo = {};
19676 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19677 fenceInfo.pNext = NULL;
19678
Tony Barbour1fa09702017-03-16 12:09:08 -060019679 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019680 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019681 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019682 VkResult result = vkResetFences(m_device->device(), 1, fences);
19683 ASSERT_VK_SUCCESS(result);
19684
19685 m_errorMonitor->VerifyNotFound();
19686}
19687
19688TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
19689 m_errorMonitor->ExpectSuccess();
19690
Tony Barbour1fa09702017-03-16 12:09:08 -060019691 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019692 VkResult err;
19693
19694 // Record (empty!) command buffer that can be submitted multiple times
19695 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019696 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
19697 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019698 m_commandBuffer->BeginCommandBuffer(&cbbi);
19699 m_commandBuffer->EndCommandBuffer();
19700
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019701 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019702 VkFence fence;
19703 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
19704 ASSERT_VK_SUCCESS(err);
19705
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019706 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019707 VkSemaphore s1, s2;
19708 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
19709 ASSERT_VK_SUCCESS(err);
19710 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
19711 ASSERT_VK_SUCCESS(err);
19712
19713 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019714 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019715 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
19716 ASSERT_VK_SUCCESS(err);
19717
19718 // Submit CB again, signaling s2.
19719 si.pSignalSemaphores = &s2;
19720 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
19721 ASSERT_VK_SUCCESS(err);
19722
19723 // Wait for fence.
19724 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19725 ASSERT_VK_SUCCESS(err);
19726
19727 // CB is still in flight from second submission, but semaphore s1 is no
19728 // longer in flight. delete it.
19729 vkDestroySemaphore(m_device->device(), s1, nullptr);
19730
19731 m_errorMonitor->VerifyNotFound();
19732
19733 // Force device idle and clean up remaining objects
19734 vkDeviceWaitIdle(m_device->device());
19735 vkDestroySemaphore(m_device->device(), s2, nullptr);
19736 vkDestroyFence(m_device->device(), fence, nullptr);
19737}
19738
19739TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
19740 m_errorMonitor->ExpectSuccess();
19741
Tony Barbour1fa09702017-03-16 12:09:08 -060019742 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019743 VkResult err;
19744
19745 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019746 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019747 VkFence f1;
19748 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
19749 ASSERT_VK_SUCCESS(err);
19750
19751 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019752 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019753 VkFence f2;
19754 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
19755 ASSERT_VK_SUCCESS(err);
19756
19757 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019758 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019759 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
19760
19761 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019762 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019763 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
19764
19765 // Should have both retired!
19766 vkDestroyFence(m_device->device(), f1, nullptr);
19767 vkDestroyFence(m_device->device(), f2, nullptr);
19768
19769 m_errorMonitor->VerifyNotFound();
19770}
19771
19772TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019773 TEST_DESCRIPTION(
19774 "Verify that creating an image view from an image with valid usage "
19775 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019776
Tony Barbour1fa09702017-03-16 12:09:08 -060019777 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019778
19779 m_errorMonitor->ExpectSuccess();
19780 // Verify that we can create a view with usage INPUT_ATTACHMENT
19781 VkImageObj image(m_device);
19782 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
19783 ASSERT_TRUE(image.initialized());
19784 VkImageView imageView;
19785 VkImageViewCreateInfo ivci = {};
19786 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
19787 ivci.image = image.handle();
19788 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
19789 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
19790 ivci.subresourceRange.layerCount = 1;
19791 ivci.subresourceRange.baseMipLevel = 0;
19792 ivci.subresourceRange.levelCount = 1;
19793 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19794
19795 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
19796 m_errorMonitor->VerifyNotFound();
19797 vkDestroyImageView(m_device->device(), imageView, NULL);
19798}
19799
19800// This is a positive test. No failures are expected.
19801TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019802 TEST_DESCRIPTION(
19803 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
19804 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019805
Tony Barbour1fa09702017-03-16 12:09:08 -060019806 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019807
19808 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019809 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Tony Barbour623721f2017-03-24 15:00:21 -060019810 if (!m_device->phy().features().sparseBinding) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019811
19812 m_errorMonitor->ExpectSuccess();
19813
19814 VkImage image;
19815 VkImageCreateInfo image_create_info = {};
19816 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19817 image_create_info.pNext = NULL;
19818 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19819 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
19820 image_create_info.extent.width = 64;
19821 image_create_info.extent.height = 64;
19822 image_create_info.extent.depth = 1;
19823 image_create_info.mipLevels = 1;
19824 image_create_info.arrayLayers = 1;
19825 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
19826 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
19827 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
19828 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
19829 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19830 ASSERT_VK_SUCCESS(err);
19831
19832 VkMemoryRequirements memory_reqs;
19833 VkDeviceMemory memory_one, memory_two;
19834 bool pass;
19835 VkMemoryAllocateInfo memory_info = {};
19836 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19837 memory_info.pNext = NULL;
19838 memory_info.allocationSize = 0;
19839 memory_info.memoryTypeIndex = 0;
19840 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19841 // Find an image big enough to allow sparse mapping of 2 memory regions
19842 // Increase the image size until it is at least twice the
19843 // size of the required alignment, to ensure we can bind both
19844 // allocated memory blocks to the image on aligned offsets.
19845 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
19846 vkDestroyImage(m_device->device(), image, nullptr);
19847 image_create_info.extent.width *= 2;
19848 image_create_info.extent.height *= 2;
19849 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
19850 ASSERT_VK_SUCCESS(err);
19851 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19852 }
19853 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
19854 // at the end of the first
19855 memory_info.allocationSize = memory_reqs.alignment;
19856 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19857 ASSERT_TRUE(pass);
19858 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
19859 ASSERT_VK_SUCCESS(err);
19860 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
19861 ASSERT_VK_SUCCESS(err);
19862 VkSparseMemoryBind binds[2];
19863 binds[0].flags = 0;
19864 binds[0].memory = memory_one;
19865 binds[0].memoryOffset = 0;
19866 binds[0].resourceOffset = 0;
19867 binds[0].size = memory_info.allocationSize;
19868 binds[1].flags = 0;
19869 binds[1].memory = memory_two;
19870 binds[1].memoryOffset = 0;
19871 binds[1].resourceOffset = memory_info.allocationSize;
19872 binds[1].size = memory_info.allocationSize;
19873
19874 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
19875 opaqueBindInfo.image = image;
19876 opaqueBindInfo.bindCount = 2;
19877 opaqueBindInfo.pBinds = binds;
19878
19879 VkFence fence = VK_NULL_HANDLE;
19880 VkBindSparseInfo bindSparseInfo = {};
19881 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
19882 bindSparseInfo.imageOpaqueBindCount = 1;
19883 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
19884
19885 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
19886 vkQueueWaitIdle(m_device->m_queue);
19887 vkDestroyImage(m_device->device(), image, NULL);
19888 vkFreeMemory(m_device->device(), memory_one, NULL);
19889 vkFreeMemory(m_device->device(), memory_two, NULL);
19890 m_errorMonitor->VerifyNotFound();
19891}
19892
19893TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019894 TEST_DESCRIPTION(
19895 "Ensure that CmdBeginRenderPass with an attachment's "
19896 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
19897 "the command buffer has prior knowledge of that "
19898 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019899
19900 m_errorMonitor->ExpectSuccess();
19901
Tony Barbour1fa09702017-03-16 12:09:08 -060019902 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019903
19904 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019905 VkAttachmentDescription attachment = {0,
19906 VK_FORMAT_R8G8B8A8_UNORM,
19907 VK_SAMPLE_COUNT_1_BIT,
19908 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19909 VK_ATTACHMENT_STORE_OP_STORE,
19910 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19911 VK_ATTACHMENT_STORE_OP_DONT_CARE,
19912 VK_IMAGE_LAYOUT_UNDEFINED,
19913 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019914
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019915 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019916
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019917 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019918
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019919 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019920
19921 VkRenderPass rp;
19922 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
19923 ASSERT_VK_SUCCESS(err);
19924
19925 // A compatible framebuffer.
19926 VkImageObj image(m_device);
19927 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
19928 ASSERT_TRUE(image.initialized());
19929
19930 VkImageViewCreateInfo ivci = {
19931 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
19932 nullptr,
19933 0,
19934 image.handle(),
19935 VK_IMAGE_VIEW_TYPE_2D,
19936 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019937 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
19938 VK_COMPONENT_SWIZZLE_IDENTITY},
19939 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019940 };
19941 VkImageView view;
19942 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
19943 ASSERT_VK_SUCCESS(err);
19944
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019945 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019946 VkFramebuffer fb;
19947 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
19948 ASSERT_VK_SUCCESS(err);
19949
19950 // Record a single command buffer which uses this renderpass twice. The
19951 // bug is triggered at the beginning of the second renderpass, when the
19952 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019953 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 -070019954 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019955 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
19956 vkCmdEndRenderPass(m_commandBuffer->handle());
19957 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
19958
19959 m_errorMonitor->VerifyNotFound();
19960
19961 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070019962 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019963
19964 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
19965 vkDestroyRenderPass(m_device->device(), rp, nullptr);
19966 vkDestroyImageView(m_device->device(), view, nullptr);
19967}
19968
19969TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019970 TEST_DESCRIPTION(
19971 "This test should pass. Create a Framebuffer and "
19972 "command buffer, bind them together, then destroy "
19973 "command pool and framebuffer and verify there are no "
19974 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019975
19976 m_errorMonitor->ExpectSuccess();
19977
Tony Barbour1fa09702017-03-16 12:09:08 -060019978 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019979
19980 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019981 VkAttachmentDescription attachment = {0,
19982 VK_FORMAT_R8G8B8A8_UNORM,
19983 VK_SAMPLE_COUNT_1_BIT,
19984 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19985 VK_ATTACHMENT_STORE_OP_STORE,
19986 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19987 VK_ATTACHMENT_STORE_OP_DONT_CARE,
19988 VK_IMAGE_LAYOUT_UNDEFINED,
19989 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019990
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019991 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019992
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019993 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019994
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019995 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019996
19997 VkRenderPass rp;
19998 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
19999 ASSERT_VK_SUCCESS(err);
20000
20001 // A compatible framebuffer.
20002 VkImageObj image(m_device);
20003 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
20004 ASSERT_TRUE(image.initialized());
20005
20006 VkImageViewCreateInfo ivci = {
20007 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20008 nullptr,
20009 0,
20010 image.handle(),
20011 VK_IMAGE_VIEW_TYPE_2D,
20012 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020013 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20014 VK_COMPONENT_SWIZZLE_IDENTITY},
20015 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020016 };
20017 VkImageView view;
20018 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20019 ASSERT_VK_SUCCESS(err);
20020
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020021 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020022 VkFramebuffer fb;
20023 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20024 ASSERT_VK_SUCCESS(err);
20025
20026 // Explicitly create a command buffer to bind the FB to so that we can then
20027 // destroy the command pool in order to implicitly free command buffer
20028 VkCommandPool command_pool;
20029 VkCommandPoolCreateInfo pool_create_info{};
20030 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20031 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20032 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20033 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20034
20035 VkCommandBuffer command_buffer;
20036 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20037 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20038 command_buffer_allocate_info.commandPool = command_pool;
20039 command_buffer_allocate_info.commandBufferCount = 1;
20040 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20041 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20042
20043 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020044 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 -060020045 VkCommandBufferBeginInfo begin_info{};
20046 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20047 vkBeginCommandBuffer(command_buffer, &begin_info);
20048
20049 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20050 vkCmdEndRenderPass(command_buffer);
20051 vkEndCommandBuffer(command_buffer);
20052 vkDestroyImageView(m_device->device(), view, nullptr);
20053 // Destroy command pool to implicitly free command buffer
20054 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20055 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20056 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20057 m_errorMonitor->VerifyNotFound();
20058}
20059
20060TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020061 TEST_DESCRIPTION(
20062 "Ensure that CmdBeginRenderPass applies the layout "
20063 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020064
20065 m_errorMonitor->ExpectSuccess();
20066
Tony Barbour1fa09702017-03-16 12:09:08 -060020067 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020068
20069 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020070 VkAttachmentDescription attachment = {0,
20071 VK_FORMAT_R8G8B8A8_UNORM,
20072 VK_SAMPLE_COUNT_1_BIT,
20073 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20074 VK_ATTACHMENT_STORE_OP_STORE,
20075 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20076 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20077 VK_IMAGE_LAYOUT_UNDEFINED,
20078 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020079
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020080 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020081
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020082 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020083
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020084 VkSubpassDependency dep = {0,
20085 0,
20086 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20087 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20088 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20089 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20090 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020091
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020092 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020093
20094 VkResult err;
20095 VkRenderPass rp;
20096 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20097 ASSERT_VK_SUCCESS(err);
20098
20099 // A compatible framebuffer.
20100 VkImageObj image(m_device);
20101 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
20102 ASSERT_TRUE(image.initialized());
20103
20104 VkImageViewCreateInfo ivci = {
20105 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20106 nullptr,
20107 0,
20108 image.handle(),
20109 VK_IMAGE_VIEW_TYPE_2D,
20110 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020111 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20112 VK_COMPONENT_SWIZZLE_IDENTITY},
20113 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020114 };
20115 VkImageView view;
20116 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20117 ASSERT_VK_SUCCESS(err);
20118
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020119 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020120 VkFramebuffer fb;
20121 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20122 ASSERT_VK_SUCCESS(err);
20123
20124 // Record a single command buffer which issues a pipeline barrier w/
20125 // image memory barrier for the attachment. This detects the previously
20126 // missing tracking of the subpass layout by throwing a validation error
20127 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020128 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 -070020129 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020130 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20131
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020132 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
20133 nullptr,
20134 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20135 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20136 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20137 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20138 VK_QUEUE_FAMILY_IGNORED,
20139 VK_QUEUE_FAMILY_IGNORED,
20140 image.handle(),
20141 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020142 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020143 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20144 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020145
20146 vkCmdEndRenderPass(m_commandBuffer->handle());
20147 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020148 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020149
20150 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20151 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20152 vkDestroyImageView(m_device->device(), view, nullptr);
20153}
20154
20155TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020156 TEST_DESCRIPTION(
20157 "Validate that when an imageView of a depth/stencil image "
20158 "is used as a depth/stencil framebuffer attachment, the "
20159 "aspectMask is ignored and both depth and stencil image "
20160 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020161
Tony Barbour1fa09702017-03-16 12:09:08 -060020162 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020163 VkFormatProperties format_properties;
20164 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
20165 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
20166 return;
20167 }
20168
20169 m_errorMonitor->ExpectSuccess();
20170
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020171 VkAttachmentDescription attachment = {0,
20172 VK_FORMAT_D32_SFLOAT_S8_UINT,
20173 VK_SAMPLE_COUNT_1_BIT,
20174 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20175 VK_ATTACHMENT_STORE_OP_STORE,
20176 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20177 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20178 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
20179 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020180
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020181 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020182
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020183 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020184
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020185 VkSubpassDependency dep = {0,
20186 0,
20187 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20188 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20189 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20190 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20191 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020192
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020193 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020194
20195 VkResult err;
20196 VkRenderPass rp;
20197 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20198 ASSERT_VK_SUCCESS(err);
20199
20200 VkImageObj image(m_device);
20201 image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020202 0x26, // usage
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020203 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020204 ASSERT_TRUE(image.initialized());
20205 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
20206
20207 VkImageViewCreateInfo ivci = {
20208 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20209 nullptr,
20210 0,
20211 image.handle(),
20212 VK_IMAGE_VIEW_TYPE_2D,
20213 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020214 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
20215 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020216 };
20217 VkImageView view;
20218 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20219 ASSERT_VK_SUCCESS(err);
20220
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020221 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020222 VkFramebuffer fb;
20223 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20224 ASSERT_VK_SUCCESS(err);
20225
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020226 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 -070020227 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020228 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20229
20230 VkImageMemoryBarrier imb = {};
20231 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20232 imb.pNext = nullptr;
20233 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20234 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20235 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20236 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
20237 imb.srcQueueFamilyIndex = 0;
20238 imb.dstQueueFamilyIndex = 0;
20239 imb.image = image.handle();
20240 imb.subresourceRange.aspectMask = 0x6;
20241 imb.subresourceRange.baseMipLevel = 0;
20242 imb.subresourceRange.levelCount = 0x1;
20243 imb.subresourceRange.baseArrayLayer = 0;
20244 imb.subresourceRange.layerCount = 0x1;
20245
20246 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020247 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20248 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020249
20250 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020251 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020252 QueueCommandBuffer(false);
20253 m_errorMonitor->VerifyNotFound();
20254
20255 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20256 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20257 vkDestroyImageView(m_device->device(), view, nullptr);
20258}
20259
20260TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020261 TEST_DESCRIPTION(
20262 "Ensure that layout transitions work correctly without "
20263 "errors, when an attachment reference is "
20264 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020265
20266 m_errorMonitor->ExpectSuccess();
20267
Tony Barbour1fa09702017-03-16 12:09:08 -060020268 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020269
20270 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020271 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020272
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020273 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020274
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020275 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020276
20277 VkRenderPass rp;
20278 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20279 ASSERT_VK_SUCCESS(err);
20280
20281 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020282 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020283 VkFramebuffer fb;
20284 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20285 ASSERT_VK_SUCCESS(err);
20286
20287 // Record a command buffer which just begins and ends the renderpass. The
20288 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020289 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 -070020290 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020291 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20292 vkCmdEndRenderPass(m_commandBuffer->handle());
20293 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020294 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020295
20296 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20297 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20298}
20299
20300// This is a positive test. No errors are expected.
20301TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020302 TEST_DESCRIPTION(
20303 "Create a stencil-only attachment with a LOAD_OP set to "
20304 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020305 VkResult result = VK_SUCCESS;
Tony Barbour1fa09702017-03-16 12:09:08 -060020306 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070020307 auto depth_format = find_depth_stencil_format(m_device);
20308 if (!depth_format) {
20309 printf(" No Depth + Stencil format found. Skipped.\n");
20310 return;
20311 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020312 VkImageFormatProperties formatProps;
Tony Barbourf887b162017-03-09 10:06:46 -070020313 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020314 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
20315 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020316 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
20317 return;
20318 }
20319
Tony Barbourf887b162017-03-09 10:06:46 -070020320 VkFormat depth_stencil_fmt = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020321 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020322 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020323 VkAttachmentDescription att = {};
20324 VkAttachmentReference ref = {};
20325 att.format = depth_stencil_fmt;
20326 att.samples = VK_SAMPLE_COUNT_1_BIT;
20327 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
20328 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
20329 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
20330 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
20331 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20332 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20333
20334 VkClearValue clear;
20335 clear.depthStencil.depth = 1.0;
20336 clear.depthStencil.stencil = 0;
20337 ref.attachment = 0;
20338 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20339
20340 VkSubpassDescription subpass = {};
20341 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
20342 subpass.flags = 0;
20343 subpass.inputAttachmentCount = 0;
20344 subpass.pInputAttachments = NULL;
20345 subpass.colorAttachmentCount = 0;
20346 subpass.pColorAttachments = NULL;
20347 subpass.pResolveAttachments = NULL;
20348 subpass.pDepthStencilAttachment = &ref;
20349 subpass.preserveAttachmentCount = 0;
20350 subpass.pPreserveAttachments = NULL;
20351
20352 VkRenderPass rp;
20353 VkRenderPassCreateInfo rp_info = {};
20354 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
20355 rp_info.attachmentCount = 1;
20356 rp_info.pAttachments = &att;
20357 rp_info.subpassCount = 1;
20358 rp_info.pSubpasses = &subpass;
20359 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
20360 ASSERT_VK_SUCCESS(result);
20361
20362 VkImageView *depthView = m_depthStencil->BindInfo();
20363 VkFramebufferCreateInfo fb_info = {};
20364 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
20365 fb_info.pNext = NULL;
20366 fb_info.renderPass = rp;
20367 fb_info.attachmentCount = 1;
20368 fb_info.pAttachments = depthView;
20369 fb_info.width = 100;
20370 fb_info.height = 100;
20371 fb_info.layers = 1;
20372 VkFramebuffer fb;
20373 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
20374 ASSERT_VK_SUCCESS(result);
20375
20376 VkRenderPassBeginInfo rpbinfo = {};
20377 rpbinfo.clearValueCount = 1;
20378 rpbinfo.pClearValues = &clear;
20379 rpbinfo.pNext = NULL;
20380 rpbinfo.renderPass = rp;
20381 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
20382 rpbinfo.renderArea.extent.width = 100;
20383 rpbinfo.renderArea.extent.height = 100;
20384 rpbinfo.renderArea.offset.x = 0;
20385 rpbinfo.renderArea.offset.y = 0;
20386 rpbinfo.framebuffer = fb;
20387
20388 VkFence fence = {};
20389 VkFenceCreateInfo fence_ci = {};
20390 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20391 fence_ci.pNext = nullptr;
20392 fence_ci.flags = 0;
20393 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
20394 ASSERT_VK_SUCCESS(result);
20395
20396 m_commandBuffer->BeginCommandBuffer();
20397 m_commandBuffer->BeginRenderPass(rpbinfo);
20398 m_commandBuffer->EndRenderPass();
20399 m_commandBuffer->EndCommandBuffer();
20400 m_commandBuffer->QueueCommandBuffer(fence);
20401
20402 VkImageObj destImage(m_device);
20403 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 -070020404 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020405 VkImageMemoryBarrier barrier = {};
20406 VkImageSubresourceRange range;
20407 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20408 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20409 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
20410 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20411 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20412 barrier.image = m_depthStencil->handle();
20413 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20414 range.baseMipLevel = 0;
20415 range.levelCount = 1;
20416 range.baseArrayLayer = 0;
20417 range.layerCount = 1;
20418 barrier.subresourceRange = range;
20419 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20420 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
20421 cmdbuf.BeginCommandBuffer();
20422 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 -070020423 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020424 barrier.srcAccessMask = 0;
20425 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
20426 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
20427 barrier.image = destImage.handle();
20428 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20429 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 -070020430 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020431 VkImageCopy cregion;
20432 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20433 cregion.srcSubresource.mipLevel = 0;
20434 cregion.srcSubresource.baseArrayLayer = 0;
20435 cregion.srcSubresource.layerCount = 1;
20436 cregion.srcOffset.x = 0;
20437 cregion.srcOffset.y = 0;
20438 cregion.srcOffset.z = 0;
20439 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20440 cregion.dstSubresource.mipLevel = 0;
20441 cregion.dstSubresource.baseArrayLayer = 0;
20442 cregion.dstSubresource.layerCount = 1;
20443 cregion.dstOffset.x = 0;
20444 cregion.dstOffset.y = 0;
20445 cregion.dstOffset.z = 0;
20446 cregion.extent.width = 100;
20447 cregion.extent.height = 100;
20448 cregion.extent.depth = 1;
20449 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020450 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020451 cmdbuf.EndCommandBuffer();
20452
20453 VkSubmitInfo submit_info;
20454 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20455 submit_info.pNext = NULL;
20456 submit_info.waitSemaphoreCount = 0;
20457 submit_info.pWaitSemaphores = NULL;
20458 submit_info.pWaitDstStageMask = NULL;
20459 submit_info.commandBufferCount = 1;
20460 submit_info.pCommandBuffers = &cmdbuf.handle();
20461 submit_info.signalSemaphoreCount = 0;
20462 submit_info.pSignalSemaphores = NULL;
20463
20464 m_errorMonitor->ExpectSuccess();
20465 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20466 m_errorMonitor->VerifyNotFound();
20467
20468 vkQueueWaitIdle(m_device->m_queue);
20469 vkDestroyFence(m_device->device(), fence, nullptr);
20470 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20471 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20472}
20473
20474// This is a positive test. No errors should be generated.
Mike Weiblene4e225d2017-03-07 23:15:43 -070020475TEST_F(VkPositiveLayerTest, BarrierLayoutToImageUsage) {
20476 TEST_DESCRIPTION("Ensure barriers' new and old VkImageLayout are compatible with their images' VkImageUsageFlags");
20477
20478 m_errorMonitor->ExpectSuccess();
20479
Tony Barbour1fa09702017-03-16 12:09:08 -060020480 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour9357d542017-03-24 15:42:21 -060020481 auto depth_format = find_depth_stencil_format(m_device);
20482 if (!depth_format) {
20483 printf(" No Depth + Stencil format found. Skipped.\n");
20484 return;
20485 }
Mike Weiblene4e225d2017-03-07 23:15:43 -070020486 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20487
20488 VkImageMemoryBarrier img_barrier = {};
20489 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20490 img_barrier.pNext = NULL;
20491 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20492 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20493 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20494 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20495 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20496 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20497 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20498 img_barrier.subresourceRange.baseArrayLayer = 0;
20499 img_barrier.subresourceRange.baseMipLevel = 0;
20500 img_barrier.subresourceRange.layerCount = 1;
20501 img_barrier.subresourceRange.levelCount = 1;
20502
20503 {
20504 VkImageObj img_color(m_device);
20505 img_color.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
20506 ASSERT_TRUE(img_color.initialized());
20507
20508 VkImageObj img_ds1(m_device);
Tony Barbour9357d542017-03-24 15:42:21 -060020509 img_ds1.init(128, 128, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene4e225d2017-03-07 23:15:43 -070020510 ASSERT_TRUE(img_ds1.initialized());
20511
20512 VkImageObj img_ds2(m_device);
Tony Barbour9357d542017-03-24 15:42:21 -060020513 img_ds2.init(128, 128, depth_format, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
Mike Weiblene4e225d2017-03-07 23:15:43 -070020514 ASSERT_TRUE(img_ds2.initialized());
20515
20516 VkImageObj img_xfer_src(m_device);
20517 img_xfer_src.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
20518 ASSERT_TRUE(img_xfer_src.initialized());
20519
20520 VkImageObj img_xfer_dst(m_device);
20521 img_xfer_dst.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
20522 ASSERT_TRUE(img_xfer_dst.initialized());
20523
20524 VkImageObj img_sampled(m_device);
20525 img_sampled.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL);
20526 ASSERT_TRUE(img_sampled.initialized());
20527
20528 VkImageObj img_input(m_device);
20529 img_input.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
20530 ASSERT_TRUE(img_input.initialized());
20531
20532 const struct {
20533 VkImageObj &image_obj;
20534 VkImageLayout old_layout;
20535 VkImageLayout new_layout;
20536 } buffer_layouts[] = {
20537 // clang-format off
20538 {img_color, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20539 {img_ds1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20540 {img_ds2, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20541 {img_sampled, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20542 {img_input, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20543 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20544 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20545 // clang-format on
20546 };
20547 const uint32_t layout_count = sizeof(buffer_layouts) / sizeof(buffer_layouts[0]);
20548
20549 m_commandBuffer->BeginCommandBuffer();
20550 for (uint32_t i = 0; i < layout_count; ++i) {
20551 img_barrier.image = buffer_layouts[i].image_obj.handle();
20552 const VkImageUsageFlags usage = buffer_layouts[i].image_obj.usage();
20553 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
20554 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
20555 : VK_IMAGE_ASPECT_COLOR_BIT;
20556
20557 img_barrier.oldLayout = buffer_layouts[i].old_layout;
20558 img_barrier.newLayout = buffer_layouts[i].new_layout;
20559 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20560 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20561
20562 img_barrier.oldLayout = buffer_layouts[i].new_layout;
20563 img_barrier.newLayout = buffer_layouts[i].old_layout;
20564 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20565 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20566 }
20567 m_commandBuffer->EndCommandBuffer();
20568
20569 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
20570 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
20571 }
20572 m_errorMonitor->VerifyNotFound();
20573}
20574
20575// This is a positive test. No errors should be generated.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020576TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
20577 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
20578
20579 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060020580 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020581
20582 VkEvent event;
20583 VkEventCreateInfo event_create_info{};
20584 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20585 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20586
20587 VkCommandPool command_pool;
20588 VkCommandPoolCreateInfo pool_create_info{};
20589 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20590 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20591 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20592 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20593
20594 VkCommandBuffer command_buffer;
20595 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20596 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20597 command_buffer_allocate_info.commandPool = command_pool;
20598 command_buffer_allocate_info.commandBufferCount = 1;
20599 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20600 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20601
20602 VkQueue queue = VK_NULL_HANDLE;
20603 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20604
20605 {
20606 VkCommandBufferBeginInfo begin_info{};
20607 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20608 vkBeginCommandBuffer(command_buffer, &begin_info);
20609
20610 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 -070020611 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020612 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
20613 vkEndCommandBuffer(command_buffer);
20614 }
20615 {
20616 VkSubmitInfo submit_info{};
20617 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20618 submit_info.commandBufferCount = 1;
20619 submit_info.pCommandBuffers = &command_buffer;
20620 submit_info.signalSemaphoreCount = 0;
20621 submit_info.pSignalSemaphores = nullptr;
20622 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20623 }
20624 { vkSetEvent(m_device->device(), event); }
20625
20626 vkQueueWaitIdle(queue);
20627
20628 vkDestroyEvent(m_device->device(), event, nullptr);
20629 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20630 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20631
20632 m_errorMonitor->VerifyNotFound();
20633}
20634// This is a positive test. No errors should be generated.
20635TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
20636 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
20637
Tony Barbour1fa09702017-03-16 12:09:08 -060020638 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020639 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020640
20641 m_errorMonitor->ExpectSuccess();
20642
20643 VkQueryPool query_pool;
20644 VkQueryPoolCreateInfo query_pool_create_info{};
20645 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20646 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20647 query_pool_create_info.queryCount = 1;
20648 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20649
20650 VkCommandPool command_pool;
20651 VkCommandPoolCreateInfo pool_create_info{};
20652 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20653 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20654 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20655 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20656
20657 VkCommandBuffer command_buffer;
20658 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20659 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20660 command_buffer_allocate_info.commandPool = command_pool;
20661 command_buffer_allocate_info.commandBufferCount = 1;
20662 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20663 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20664
20665 VkCommandBuffer secondary_command_buffer;
20666 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
20667 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
20668
20669 VkQueue queue = VK_NULL_HANDLE;
20670 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20671
20672 uint32_t qfi = 0;
20673 VkBufferCreateInfo buff_create_info = {};
20674 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20675 buff_create_info.size = 1024;
20676 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20677 buff_create_info.queueFamilyIndexCount = 1;
20678 buff_create_info.pQueueFamilyIndices = &qfi;
20679
20680 VkResult err;
20681 VkBuffer buffer;
20682 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20683 ASSERT_VK_SUCCESS(err);
20684 VkMemoryAllocateInfo mem_alloc = {};
20685 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20686 mem_alloc.pNext = NULL;
20687 mem_alloc.allocationSize = 1024;
20688 mem_alloc.memoryTypeIndex = 0;
20689
20690 VkMemoryRequirements memReqs;
20691 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20692 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20693 if (!pass) {
20694 vkDestroyBuffer(m_device->device(), buffer, NULL);
20695 return;
20696 }
20697
20698 VkDeviceMemory mem;
20699 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20700 ASSERT_VK_SUCCESS(err);
20701 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20702 ASSERT_VK_SUCCESS(err);
20703
20704 VkCommandBufferInheritanceInfo hinfo = {};
20705 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
20706 hinfo.renderPass = VK_NULL_HANDLE;
20707 hinfo.subpass = 0;
20708 hinfo.framebuffer = VK_NULL_HANDLE;
20709 hinfo.occlusionQueryEnable = VK_FALSE;
20710 hinfo.queryFlags = 0;
20711 hinfo.pipelineStatistics = 0;
20712
20713 {
20714 VkCommandBufferBeginInfo begin_info{};
20715 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20716 begin_info.pInheritanceInfo = &hinfo;
20717 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
20718
20719 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
20720 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20721
20722 vkEndCommandBuffer(secondary_command_buffer);
20723
20724 begin_info.pInheritanceInfo = nullptr;
20725 vkBeginCommandBuffer(command_buffer, &begin_info);
20726
20727 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
20728 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
20729
20730 vkEndCommandBuffer(command_buffer);
20731 }
20732 {
20733 VkSubmitInfo submit_info{};
20734 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20735 submit_info.commandBufferCount = 1;
20736 submit_info.pCommandBuffers = &command_buffer;
20737 submit_info.signalSemaphoreCount = 0;
20738 submit_info.pSignalSemaphores = nullptr;
20739 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20740 }
20741
20742 vkQueueWaitIdle(queue);
20743
20744 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
20745 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20746 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
20747 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20748 vkDestroyBuffer(m_device->device(), buffer, NULL);
20749 vkFreeMemory(m_device->device(), mem, NULL);
20750
20751 m_errorMonitor->VerifyNotFound();
20752}
20753
20754// This is a positive test. No errors should be generated.
20755TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
20756 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
20757
Tony Barbour1fa09702017-03-16 12:09:08 -060020758 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020759 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020760
20761 m_errorMonitor->ExpectSuccess();
20762
20763 VkQueryPool query_pool;
20764 VkQueryPoolCreateInfo query_pool_create_info{};
20765 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20766 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20767 query_pool_create_info.queryCount = 1;
20768 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20769
20770 VkCommandPool command_pool;
20771 VkCommandPoolCreateInfo pool_create_info{};
20772 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20773 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20774 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20775 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20776
20777 VkCommandBuffer command_buffer[2];
20778 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20779 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20780 command_buffer_allocate_info.commandPool = command_pool;
20781 command_buffer_allocate_info.commandBufferCount = 2;
20782 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20783 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20784
20785 VkQueue queue = VK_NULL_HANDLE;
20786 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20787
20788 uint32_t qfi = 0;
20789 VkBufferCreateInfo buff_create_info = {};
20790 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20791 buff_create_info.size = 1024;
20792 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20793 buff_create_info.queueFamilyIndexCount = 1;
20794 buff_create_info.pQueueFamilyIndices = &qfi;
20795
20796 VkResult err;
20797 VkBuffer buffer;
20798 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20799 ASSERT_VK_SUCCESS(err);
20800 VkMemoryAllocateInfo mem_alloc = {};
20801 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20802 mem_alloc.pNext = NULL;
20803 mem_alloc.allocationSize = 1024;
20804 mem_alloc.memoryTypeIndex = 0;
20805
20806 VkMemoryRequirements memReqs;
20807 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20808 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20809 if (!pass) {
20810 vkDestroyBuffer(m_device->device(), buffer, NULL);
20811 return;
20812 }
20813
20814 VkDeviceMemory mem;
20815 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20816 ASSERT_VK_SUCCESS(err);
20817 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20818 ASSERT_VK_SUCCESS(err);
20819
20820 {
20821 VkCommandBufferBeginInfo begin_info{};
20822 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20823 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20824
20825 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
20826 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20827
20828 vkEndCommandBuffer(command_buffer[0]);
20829
20830 vkBeginCommandBuffer(command_buffer[1], &begin_info);
20831
20832 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
20833
20834 vkEndCommandBuffer(command_buffer[1]);
20835 }
20836 {
20837 VkSubmitInfo submit_info{};
20838 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20839 submit_info.commandBufferCount = 2;
20840 submit_info.pCommandBuffers = command_buffer;
20841 submit_info.signalSemaphoreCount = 0;
20842 submit_info.pSignalSemaphores = nullptr;
20843 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20844 }
20845
20846 vkQueueWaitIdle(queue);
20847
20848 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
20849 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
20850 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20851 vkDestroyBuffer(m_device->device(), buffer, NULL);
20852 vkFreeMemory(m_device->device(), mem, NULL);
20853
20854 m_errorMonitor->VerifyNotFound();
20855}
20856
Tony Barbourc46924f2016-11-04 11:49:52 -060020857TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020858 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
20859
Tony Barbour1fa09702017-03-16 12:09:08 -060020860 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020861 VkEvent event;
20862 VkEventCreateInfo event_create_info{};
20863 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20864 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20865
20866 VkCommandPool command_pool;
20867 VkCommandPoolCreateInfo pool_create_info{};
20868 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20869 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20870 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20871 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20872
20873 VkCommandBuffer command_buffer;
20874 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20875 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20876 command_buffer_allocate_info.commandPool = command_pool;
20877 command_buffer_allocate_info.commandBufferCount = 1;
20878 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20879 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20880
20881 VkQueue queue = VK_NULL_HANDLE;
20882 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20883
20884 {
20885 VkCommandBufferBeginInfo begin_info{};
20886 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20887 vkBeginCommandBuffer(command_buffer, &begin_info);
20888
20889 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020890 vkEndCommandBuffer(command_buffer);
20891 }
20892 {
20893 VkSubmitInfo submit_info{};
20894 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20895 submit_info.commandBufferCount = 1;
20896 submit_info.pCommandBuffers = &command_buffer;
20897 submit_info.signalSemaphoreCount = 0;
20898 submit_info.pSignalSemaphores = nullptr;
20899 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20900 }
20901 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020902 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
20903 "that is already in use by a "
20904 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020905 vkSetEvent(m_device->device(), event);
20906 m_errorMonitor->VerifyFound();
20907 }
20908
20909 vkQueueWaitIdle(queue);
20910
20911 vkDestroyEvent(m_device->device(), event, nullptr);
20912 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20913 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20914}
20915
20916// This is a positive test. No errors should be generated.
20917TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020918 TEST_DESCRIPTION(
20919 "Two command buffers with two separate fences are each "
20920 "run through a Submit & WaitForFences cycle 3 times. This "
20921 "previously revealed a bug so running this positive test "
20922 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020923 m_errorMonitor->ExpectSuccess();
20924
Tony Barbour1fa09702017-03-16 12:09:08 -060020925 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020926 VkQueue queue = VK_NULL_HANDLE;
20927 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20928
20929 static const uint32_t NUM_OBJECTS = 2;
20930 static const uint32_t NUM_FRAMES = 3;
20931 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
20932 VkFence fences[NUM_OBJECTS] = {};
20933
20934 VkCommandPool cmd_pool;
20935 VkCommandPoolCreateInfo cmd_pool_ci = {};
20936 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20937 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
20938 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20939 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
20940 ASSERT_VK_SUCCESS(err);
20941
20942 VkCommandBufferAllocateInfo cmd_buf_info = {};
20943 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20944 cmd_buf_info.commandPool = cmd_pool;
20945 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20946 cmd_buf_info.commandBufferCount = 1;
20947
20948 VkFenceCreateInfo fence_ci = {};
20949 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20950 fence_ci.pNext = nullptr;
20951 fence_ci.flags = 0;
20952
20953 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
20954 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
20955 ASSERT_VK_SUCCESS(err);
20956 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
20957 ASSERT_VK_SUCCESS(err);
20958 }
20959
20960 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
20961 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
20962 // Create empty cmd buffer
20963 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
20964 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20965
20966 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
20967 ASSERT_VK_SUCCESS(err);
20968 err = vkEndCommandBuffer(cmd_buffers[obj]);
20969 ASSERT_VK_SUCCESS(err);
20970
20971 VkSubmitInfo submit_info = {};
20972 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20973 submit_info.commandBufferCount = 1;
20974 submit_info.pCommandBuffers = &cmd_buffers[obj];
20975 // Submit cmd buffer and wait for fence
20976 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
20977 ASSERT_VK_SUCCESS(err);
20978 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
20979 ASSERT_VK_SUCCESS(err);
20980 err = vkResetFences(m_device->device(), 1, &fences[obj]);
20981 ASSERT_VK_SUCCESS(err);
20982 }
20983 }
20984 m_errorMonitor->VerifyNotFound();
20985 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
20986 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
20987 vkDestroyFence(m_device->device(), fences[i], nullptr);
20988 }
20989}
20990// This is a positive test. No errors should be generated.
20991TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020992 TEST_DESCRIPTION(
20993 "Two command buffers, each in a separate QueueSubmit call "
20994 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020995
Tony Barbour1fa09702017-03-16 12:09:08 -060020996 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020997 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020998
20999 m_errorMonitor->ExpectSuccess();
21000
21001 VkSemaphore semaphore;
21002 VkSemaphoreCreateInfo semaphore_create_info{};
21003 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21004 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21005
21006 VkCommandPool command_pool;
21007 VkCommandPoolCreateInfo pool_create_info{};
21008 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21009 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21010 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21011 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21012
21013 VkCommandBuffer command_buffer[2];
21014 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21015 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21016 command_buffer_allocate_info.commandPool = command_pool;
21017 command_buffer_allocate_info.commandBufferCount = 2;
21018 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21019 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21020
21021 VkQueue queue = VK_NULL_HANDLE;
21022 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21023
21024 {
21025 VkCommandBufferBeginInfo begin_info{};
21026 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21027 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21028
21029 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 -070021030 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021031
21032 VkViewport viewport{};
21033 viewport.maxDepth = 1.0f;
21034 viewport.minDepth = 0.0f;
21035 viewport.width = 512;
21036 viewport.height = 512;
21037 viewport.x = 0;
21038 viewport.y = 0;
21039 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21040 vkEndCommandBuffer(command_buffer[0]);
21041 }
21042 {
21043 VkCommandBufferBeginInfo begin_info{};
21044 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21045 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21046
21047 VkViewport viewport{};
21048 viewport.maxDepth = 1.0f;
21049 viewport.minDepth = 0.0f;
21050 viewport.width = 512;
21051 viewport.height = 512;
21052 viewport.x = 0;
21053 viewport.y = 0;
21054 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21055 vkEndCommandBuffer(command_buffer[1]);
21056 }
21057 {
21058 VkSubmitInfo submit_info{};
21059 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21060 submit_info.commandBufferCount = 1;
21061 submit_info.pCommandBuffers = &command_buffer[0];
21062 submit_info.signalSemaphoreCount = 1;
21063 submit_info.pSignalSemaphores = &semaphore;
21064 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21065 }
21066 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021067 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021068 VkSubmitInfo submit_info{};
21069 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21070 submit_info.commandBufferCount = 1;
21071 submit_info.pCommandBuffers = &command_buffer[1];
21072 submit_info.waitSemaphoreCount = 1;
21073 submit_info.pWaitSemaphores = &semaphore;
21074 submit_info.pWaitDstStageMask = flags;
21075 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21076 }
21077
21078 vkQueueWaitIdle(m_device->m_queue);
21079
21080 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21081 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21082 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21083
21084 m_errorMonitor->VerifyNotFound();
21085}
21086
21087// This is a positive test. No errors should be generated.
21088TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021089 TEST_DESCRIPTION(
21090 "Two command buffers, each in a separate QueueSubmit call "
21091 "submitted on separate queues, the second having a fence"
21092 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021093
Tony Barbour1fa09702017-03-16 12:09:08 -060021094 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021095 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021096
21097 m_errorMonitor->ExpectSuccess();
21098
21099 VkFence fence;
21100 VkFenceCreateInfo fence_create_info{};
21101 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21102 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21103
21104 VkSemaphore semaphore;
21105 VkSemaphoreCreateInfo semaphore_create_info{};
21106 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21107 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21108
21109 VkCommandPool command_pool;
21110 VkCommandPoolCreateInfo pool_create_info{};
21111 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21112 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21113 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21114 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21115
21116 VkCommandBuffer command_buffer[2];
21117 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21118 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21119 command_buffer_allocate_info.commandPool = command_pool;
21120 command_buffer_allocate_info.commandBufferCount = 2;
21121 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21122 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21123
21124 VkQueue queue = VK_NULL_HANDLE;
21125 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21126
21127 {
21128 VkCommandBufferBeginInfo begin_info{};
21129 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21130 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21131
21132 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 -070021133 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021134
21135 VkViewport viewport{};
21136 viewport.maxDepth = 1.0f;
21137 viewport.minDepth = 0.0f;
21138 viewport.width = 512;
21139 viewport.height = 512;
21140 viewport.x = 0;
21141 viewport.y = 0;
21142 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21143 vkEndCommandBuffer(command_buffer[0]);
21144 }
21145 {
21146 VkCommandBufferBeginInfo begin_info{};
21147 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21148 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21149
21150 VkViewport viewport{};
21151 viewport.maxDepth = 1.0f;
21152 viewport.minDepth = 0.0f;
21153 viewport.width = 512;
21154 viewport.height = 512;
21155 viewport.x = 0;
21156 viewport.y = 0;
21157 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21158 vkEndCommandBuffer(command_buffer[1]);
21159 }
21160 {
21161 VkSubmitInfo submit_info{};
21162 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21163 submit_info.commandBufferCount = 1;
21164 submit_info.pCommandBuffers = &command_buffer[0];
21165 submit_info.signalSemaphoreCount = 1;
21166 submit_info.pSignalSemaphores = &semaphore;
21167 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21168 }
21169 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021170 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021171 VkSubmitInfo submit_info{};
21172 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21173 submit_info.commandBufferCount = 1;
21174 submit_info.pCommandBuffers = &command_buffer[1];
21175 submit_info.waitSemaphoreCount = 1;
21176 submit_info.pWaitSemaphores = &semaphore;
21177 submit_info.pWaitDstStageMask = flags;
21178 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21179 }
21180
21181 vkQueueWaitIdle(m_device->m_queue);
21182
21183 vkDestroyFence(m_device->device(), fence, nullptr);
21184 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21185 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21186 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21187
21188 m_errorMonitor->VerifyNotFound();
21189}
21190
21191// This is a positive test. No errors should be generated.
21192TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021193 TEST_DESCRIPTION(
21194 "Two command buffers, each in a separate QueueSubmit call "
21195 "submitted on separate queues, the second having a fence"
21196 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021197
Tony Barbour1fa09702017-03-16 12:09:08 -060021198 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021199 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021200
21201 m_errorMonitor->ExpectSuccess();
21202
21203 VkFence fence;
21204 VkFenceCreateInfo fence_create_info{};
21205 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21206 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21207
21208 VkSemaphore semaphore;
21209 VkSemaphoreCreateInfo semaphore_create_info{};
21210 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21211 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21212
21213 VkCommandPool command_pool;
21214 VkCommandPoolCreateInfo pool_create_info{};
21215 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21216 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21217 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21218 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21219
21220 VkCommandBuffer command_buffer[2];
21221 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21222 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21223 command_buffer_allocate_info.commandPool = command_pool;
21224 command_buffer_allocate_info.commandBufferCount = 2;
21225 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21226 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21227
21228 VkQueue queue = VK_NULL_HANDLE;
21229 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21230
21231 {
21232 VkCommandBufferBeginInfo begin_info{};
21233 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21234 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21235
21236 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 -070021237 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021238
21239 VkViewport viewport{};
21240 viewport.maxDepth = 1.0f;
21241 viewport.minDepth = 0.0f;
21242 viewport.width = 512;
21243 viewport.height = 512;
21244 viewport.x = 0;
21245 viewport.y = 0;
21246 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21247 vkEndCommandBuffer(command_buffer[0]);
21248 }
21249 {
21250 VkCommandBufferBeginInfo begin_info{};
21251 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21252 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21253
21254 VkViewport viewport{};
21255 viewport.maxDepth = 1.0f;
21256 viewport.minDepth = 0.0f;
21257 viewport.width = 512;
21258 viewport.height = 512;
21259 viewport.x = 0;
21260 viewport.y = 0;
21261 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21262 vkEndCommandBuffer(command_buffer[1]);
21263 }
21264 {
21265 VkSubmitInfo submit_info{};
21266 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21267 submit_info.commandBufferCount = 1;
21268 submit_info.pCommandBuffers = &command_buffer[0];
21269 submit_info.signalSemaphoreCount = 1;
21270 submit_info.pSignalSemaphores = &semaphore;
21271 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21272 }
21273 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021274 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021275 VkSubmitInfo submit_info{};
21276 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21277 submit_info.commandBufferCount = 1;
21278 submit_info.pCommandBuffers = &command_buffer[1];
21279 submit_info.waitSemaphoreCount = 1;
21280 submit_info.pWaitSemaphores = &semaphore;
21281 submit_info.pWaitDstStageMask = flags;
21282 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21283 }
21284
21285 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21286 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21287
21288 vkDestroyFence(m_device->device(), fence, nullptr);
21289 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21290 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21291 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21292
21293 m_errorMonitor->VerifyNotFound();
21294}
21295
21296TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Tony Barbour1fa09702017-03-16 12:09:08 -060021297 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021298 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070021299 printf(" Test requires two queues, skipping\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021300 return;
21301 }
21302
21303 VkResult err;
21304
21305 m_errorMonitor->ExpectSuccess();
21306
21307 VkQueue q0 = m_device->m_queue;
21308 VkQueue q1 = nullptr;
21309 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
21310 ASSERT_NE(q1, nullptr);
21311
21312 // An (empty) command buffer. We must have work in the first submission --
21313 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021314 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021315 VkCommandPool pool;
21316 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
21317 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021318 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
21319 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021320 VkCommandBuffer cb;
21321 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
21322 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021323 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021324 err = vkBeginCommandBuffer(cb, &cbbi);
21325 ASSERT_VK_SUCCESS(err);
21326 err = vkEndCommandBuffer(cb);
21327 ASSERT_VK_SUCCESS(err);
21328
21329 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021330 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021331 VkSemaphore s;
21332 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
21333 ASSERT_VK_SUCCESS(err);
21334
21335 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021336 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021337
21338 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
21339 ASSERT_VK_SUCCESS(err);
21340
21341 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021342 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021343 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021344
21345 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
21346 ASSERT_VK_SUCCESS(err);
21347
21348 // Wait for q0 idle
21349 err = vkQueueWaitIdle(q0);
21350 ASSERT_VK_SUCCESS(err);
21351
21352 // Command buffer should have been completed (it was on q0); reset the pool.
21353 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
21354
21355 m_errorMonitor->VerifyNotFound();
21356
21357 // Force device completely idle and clean up resources
21358 vkDeviceWaitIdle(m_device->device());
21359 vkDestroyCommandPool(m_device->device(), pool, nullptr);
21360 vkDestroySemaphore(m_device->device(), s, nullptr);
21361}
21362
21363// This is a positive test. No errors should be generated.
21364TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021365 TEST_DESCRIPTION(
21366 "Two command buffers, each in a separate QueueSubmit call "
21367 "submitted on separate queues, the second having a fence, "
21368 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021369
Tony Barbour1fa09702017-03-16 12:09:08 -060021370 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021371 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021372
21373 m_errorMonitor->ExpectSuccess();
21374
Tony Barbour1fa09702017-03-16 12:09:08 -060021375 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021376 VkFence fence;
21377 VkFenceCreateInfo fence_create_info{};
21378 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21379 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21380
21381 VkSemaphore semaphore;
21382 VkSemaphoreCreateInfo semaphore_create_info{};
21383 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21384 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21385
21386 VkCommandPool command_pool;
21387 VkCommandPoolCreateInfo pool_create_info{};
21388 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21389 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21390 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21391 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21392
21393 VkCommandBuffer command_buffer[2];
21394 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21395 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21396 command_buffer_allocate_info.commandPool = command_pool;
21397 command_buffer_allocate_info.commandBufferCount = 2;
21398 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21399 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21400
21401 VkQueue queue = VK_NULL_HANDLE;
21402 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21403
21404 {
21405 VkCommandBufferBeginInfo begin_info{};
21406 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21407 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21408
21409 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 -070021410 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021411
21412 VkViewport viewport{};
21413 viewport.maxDepth = 1.0f;
21414 viewport.minDepth = 0.0f;
21415 viewport.width = 512;
21416 viewport.height = 512;
21417 viewport.x = 0;
21418 viewport.y = 0;
21419 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21420 vkEndCommandBuffer(command_buffer[0]);
21421 }
21422 {
21423 VkCommandBufferBeginInfo begin_info{};
21424 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21425 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21426
21427 VkViewport viewport{};
21428 viewport.maxDepth = 1.0f;
21429 viewport.minDepth = 0.0f;
21430 viewport.width = 512;
21431 viewport.height = 512;
21432 viewport.x = 0;
21433 viewport.y = 0;
21434 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21435 vkEndCommandBuffer(command_buffer[1]);
21436 }
21437 {
21438 VkSubmitInfo submit_info{};
21439 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21440 submit_info.commandBufferCount = 1;
21441 submit_info.pCommandBuffers = &command_buffer[0];
21442 submit_info.signalSemaphoreCount = 1;
21443 submit_info.pSignalSemaphores = &semaphore;
21444 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21445 }
21446 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021447 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021448 VkSubmitInfo submit_info{};
21449 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21450 submit_info.commandBufferCount = 1;
21451 submit_info.pCommandBuffers = &command_buffer[1];
21452 submit_info.waitSemaphoreCount = 1;
21453 submit_info.pWaitSemaphores = &semaphore;
21454 submit_info.pWaitDstStageMask = flags;
21455 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21456 }
21457
21458 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21459
21460 vkDestroyFence(m_device->device(), fence, nullptr);
21461 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21462 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21463 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21464
21465 m_errorMonitor->VerifyNotFound();
21466}
21467
21468// This is a positive test. No errors should be generated.
21469TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021470 TEST_DESCRIPTION(
21471 "Two command buffers, each in a separate QueueSubmit call "
21472 "on the same queue, sharing a signal/wait semaphore, the "
21473 "second having a fence, "
21474 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021475
21476 m_errorMonitor->ExpectSuccess();
21477
Tony Barbour1fa09702017-03-16 12:09:08 -060021478 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021479 VkFence fence;
21480 VkFenceCreateInfo fence_create_info{};
21481 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21482 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21483
21484 VkSemaphore semaphore;
21485 VkSemaphoreCreateInfo semaphore_create_info{};
21486 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21487 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21488
21489 VkCommandPool command_pool;
21490 VkCommandPoolCreateInfo pool_create_info{};
21491 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21492 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21493 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21494 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21495
21496 VkCommandBuffer command_buffer[2];
21497 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21498 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21499 command_buffer_allocate_info.commandPool = command_pool;
21500 command_buffer_allocate_info.commandBufferCount = 2;
21501 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21502 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21503
21504 {
21505 VkCommandBufferBeginInfo begin_info{};
21506 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21507 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21508
21509 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 -070021510 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021511
21512 VkViewport viewport{};
21513 viewport.maxDepth = 1.0f;
21514 viewport.minDepth = 0.0f;
21515 viewport.width = 512;
21516 viewport.height = 512;
21517 viewport.x = 0;
21518 viewport.y = 0;
21519 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21520 vkEndCommandBuffer(command_buffer[0]);
21521 }
21522 {
21523 VkCommandBufferBeginInfo begin_info{};
21524 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21525 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21526
21527 VkViewport viewport{};
21528 viewport.maxDepth = 1.0f;
21529 viewport.minDepth = 0.0f;
21530 viewport.width = 512;
21531 viewport.height = 512;
21532 viewport.x = 0;
21533 viewport.y = 0;
21534 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21535 vkEndCommandBuffer(command_buffer[1]);
21536 }
21537 {
21538 VkSubmitInfo submit_info{};
21539 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21540 submit_info.commandBufferCount = 1;
21541 submit_info.pCommandBuffers = &command_buffer[0];
21542 submit_info.signalSemaphoreCount = 1;
21543 submit_info.pSignalSemaphores = &semaphore;
21544 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21545 }
21546 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021547 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021548 VkSubmitInfo submit_info{};
21549 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21550 submit_info.commandBufferCount = 1;
21551 submit_info.pCommandBuffers = &command_buffer[1];
21552 submit_info.waitSemaphoreCount = 1;
21553 submit_info.pWaitSemaphores = &semaphore;
21554 submit_info.pWaitDstStageMask = flags;
21555 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21556 }
21557
21558 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21559
21560 vkDestroyFence(m_device->device(), fence, nullptr);
21561 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21562 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21563 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21564
21565 m_errorMonitor->VerifyNotFound();
21566}
21567
21568// This is a positive test. No errors should be generated.
21569TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021570 TEST_DESCRIPTION(
21571 "Two command buffers, each in a separate QueueSubmit call "
21572 "on the same queue, no fences, followed by a third QueueSubmit with NO "
21573 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021574
21575 m_errorMonitor->ExpectSuccess();
21576
Tony Barbour1fa09702017-03-16 12:09:08 -060021577 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021578 VkFence fence;
21579 VkFenceCreateInfo fence_create_info{};
21580 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21581 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21582
21583 VkCommandPool command_pool;
21584 VkCommandPoolCreateInfo pool_create_info{};
21585 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21586 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21587 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21588 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21589
21590 VkCommandBuffer command_buffer[2];
21591 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21592 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21593 command_buffer_allocate_info.commandPool = command_pool;
21594 command_buffer_allocate_info.commandBufferCount = 2;
21595 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21596 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21597
21598 {
21599 VkCommandBufferBeginInfo begin_info{};
21600 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21601 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21602
21603 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 -070021604 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021605
21606 VkViewport viewport{};
21607 viewport.maxDepth = 1.0f;
21608 viewport.minDepth = 0.0f;
21609 viewport.width = 512;
21610 viewport.height = 512;
21611 viewport.x = 0;
21612 viewport.y = 0;
21613 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21614 vkEndCommandBuffer(command_buffer[0]);
21615 }
21616 {
21617 VkCommandBufferBeginInfo begin_info{};
21618 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21619 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21620
21621 VkViewport viewport{};
21622 viewport.maxDepth = 1.0f;
21623 viewport.minDepth = 0.0f;
21624 viewport.width = 512;
21625 viewport.height = 512;
21626 viewport.x = 0;
21627 viewport.y = 0;
21628 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21629 vkEndCommandBuffer(command_buffer[1]);
21630 }
21631 {
21632 VkSubmitInfo submit_info{};
21633 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21634 submit_info.commandBufferCount = 1;
21635 submit_info.pCommandBuffers = &command_buffer[0];
21636 submit_info.signalSemaphoreCount = 0;
21637 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21638 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21639 }
21640 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021641 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021642 VkSubmitInfo submit_info{};
21643 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21644 submit_info.commandBufferCount = 1;
21645 submit_info.pCommandBuffers = &command_buffer[1];
21646 submit_info.waitSemaphoreCount = 0;
21647 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21648 submit_info.pWaitDstStageMask = flags;
21649 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21650 }
21651
21652 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
21653
21654 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21655 ASSERT_VK_SUCCESS(err);
21656
21657 vkDestroyFence(m_device->device(), fence, nullptr);
21658 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21659 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21660
21661 m_errorMonitor->VerifyNotFound();
21662}
21663
21664// This is a positive test. No errors should be generated.
21665TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021666 TEST_DESCRIPTION(
21667 "Two command buffers, each in a separate QueueSubmit call "
21668 "on the same queue, the second having a fence, followed "
21669 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021670
21671 m_errorMonitor->ExpectSuccess();
21672
Tony Barbour1fa09702017-03-16 12:09:08 -060021673 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021674 VkFence fence;
21675 VkFenceCreateInfo fence_create_info{};
21676 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21677 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21678
21679 VkCommandPool command_pool;
21680 VkCommandPoolCreateInfo pool_create_info{};
21681 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21682 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21683 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21684 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21685
21686 VkCommandBuffer command_buffer[2];
21687 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21688 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21689 command_buffer_allocate_info.commandPool = command_pool;
21690 command_buffer_allocate_info.commandBufferCount = 2;
21691 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21692 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21693
21694 {
21695 VkCommandBufferBeginInfo begin_info{};
21696 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21697 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21698
21699 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 -070021700 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021701
21702 VkViewport viewport{};
21703 viewport.maxDepth = 1.0f;
21704 viewport.minDepth = 0.0f;
21705 viewport.width = 512;
21706 viewport.height = 512;
21707 viewport.x = 0;
21708 viewport.y = 0;
21709 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21710 vkEndCommandBuffer(command_buffer[0]);
21711 }
21712 {
21713 VkCommandBufferBeginInfo begin_info{};
21714 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21715 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21716
21717 VkViewport viewport{};
21718 viewport.maxDepth = 1.0f;
21719 viewport.minDepth = 0.0f;
21720 viewport.width = 512;
21721 viewport.height = 512;
21722 viewport.x = 0;
21723 viewport.y = 0;
21724 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21725 vkEndCommandBuffer(command_buffer[1]);
21726 }
21727 {
21728 VkSubmitInfo submit_info{};
21729 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21730 submit_info.commandBufferCount = 1;
21731 submit_info.pCommandBuffers = &command_buffer[0];
21732 submit_info.signalSemaphoreCount = 0;
21733 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21734 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21735 }
21736 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021737 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021738 VkSubmitInfo submit_info{};
21739 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21740 submit_info.commandBufferCount = 1;
21741 submit_info.pCommandBuffers = &command_buffer[1];
21742 submit_info.waitSemaphoreCount = 0;
21743 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21744 submit_info.pWaitDstStageMask = flags;
21745 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21746 }
21747
21748 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21749
21750 vkDestroyFence(m_device->device(), fence, nullptr);
21751 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21752 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21753
21754 m_errorMonitor->VerifyNotFound();
21755}
21756
21757// This is a positive test. No errors should be generated.
21758TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021759 TEST_DESCRIPTION(
21760 "Two command buffers each in a separate SubmitInfo sent in a single "
21761 "QueueSubmit call followed by a WaitForFences call.");
Tony Barbour1fa09702017-03-16 12:09:08 -060021762 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021763
21764 m_errorMonitor->ExpectSuccess();
21765
21766 VkFence fence;
21767 VkFenceCreateInfo fence_create_info{};
21768 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21769 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21770
21771 VkSemaphore semaphore;
21772 VkSemaphoreCreateInfo semaphore_create_info{};
21773 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21774 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21775
21776 VkCommandPool command_pool;
21777 VkCommandPoolCreateInfo pool_create_info{};
21778 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21779 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21780 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21781 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21782
21783 VkCommandBuffer command_buffer[2];
21784 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21785 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21786 command_buffer_allocate_info.commandPool = command_pool;
21787 command_buffer_allocate_info.commandBufferCount = 2;
21788 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21789 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21790
21791 {
21792 VkCommandBufferBeginInfo begin_info{};
21793 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21794 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21795
21796 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 -070021797 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021798
21799 VkViewport viewport{};
21800 viewport.maxDepth = 1.0f;
21801 viewport.minDepth = 0.0f;
21802 viewport.width = 512;
21803 viewport.height = 512;
21804 viewport.x = 0;
21805 viewport.y = 0;
21806 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21807 vkEndCommandBuffer(command_buffer[0]);
21808 }
21809 {
21810 VkCommandBufferBeginInfo begin_info{};
21811 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21812 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21813
21814 VkViewport viewport{};
21815 viewport.maxDepth = 1.0f;
21816 viewport.minDepth = 0.0f;
21817 viewport.width = 512;
21818 viewport.height = 512;
21819 viewport.x = 0;
21820 viewport.y = 0;
21821 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21822 vkEndCommandBuffer(command_buffer[1]);
21823 }
21824 {
21825 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021826 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021827
21828 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21829 submit_info[0].pNext = NULL;
21830 submit_info[0].commandBufferCount = 1;
21831 submit_info[0].pCommandBuffers = &command_buffer[0];
21832 submit_info[0].signalSemaphoreCount = 1;
21833 submit_info[0].pSignalSemaphores = &semaphore;
21834 submit_info[0].waitSemaphoreCount = 0;
21835 submit_info[0].pWaitSemaphores = NULL;
21836 submit_info[0].pWaitDstStageMask = 0;
21837
21838 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21839 submit_info[1].pNext = NULL;
21840 submit_info[1].commandBufferCount = 1;
21841 submit_info[1].pCommandBuffers = &command_buffer[1];
21842 submit_info[1].waitSemaphoreCount = 1;
21843 submit_info[1].pWaitSemaphores = &semaphore;
21844 submit_info[1].pWaitDstStageMask = flags;
21845 submit_info[1].signalSemaphoreCount = 0;
21846 submit_info[1].pSignalSemaphores = NULL;
21847 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
21848 }
21849
21850 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21851
21852 vkDestroyFence(m_device->device(), fence, nullptr);
21853 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21854 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21855 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21856
21857 m_errorMonitor->VerifyNotFound();
21858}
21859
21860TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
21861 m_errorMonitor->ExpectSuccess();
21862
Tony Barbour1fa09702017-03-16 12:09:08 -060021863 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021864 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21865
Tony Barbour552f6c02016-12-21 14:34:07 -070021866 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021867
21868 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
21869 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
21870 m_errorMonitor->VerifyNotFound();
21871 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
21872 m_errorMonitor->VerifyNotFound();
21873 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
21874 m_errorMonitor->VerifyNotFound();
21875
21876 m_commandBuffer->EndCommandBuffer();
21877 m_errorMonitor->VerifyNotFound();
21878}
21879
21880TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021881 TEST_DESCRIPTION(
21882 "Positive test where we create a renderpass with an "
21883 "attachment that uses LOAD_OP_CLEAR, the first subpass "
21884 "has a valid layout, and a second subpass then uses a "
21885 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021886 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060021887 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070021888 auto depth_format = find_depth_stencil_format(m_device);
21889 if (!depth_format) {
21890 printf(" No Depth + Stencil format found. Skipped.\n");
21891 return;
21892 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021893
21894 VkAttachmentReference attach[2] = {};
21895 attach[0].attachment = 0;
21896 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21897 attach[1].attachment = 0;
21898 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
21899 VkSubpassDescription subpasses[2] = {};
21900 // First subpass clears DS attach on load
21901 subpasses[0].pDepthStencilAttachment = &attach[0];
21902 // 2nd subpass reads in DS as input attachment
21903 subpasses[1].inputAttachmentCount = 1;
21904 subpasses[1].pInputAttachments = &attach[1];
21905 VkAttachmentDescription attach_desc = {};
Tony Barbourf887b162017-03-09 10:06:46 -070021906 attach_desc.format = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021907 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
21908 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
21909 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
21910 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21911 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21912 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21913 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
21914 VkRenderPassCreateInfo rpci = {};
21915 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
21916 rpci.attachmentCount = 1;
21917 rpci.pAttachments = &attach_desc;
21918 rpci.subpassCount = 2;
21919 rpci.pSubpasses = subpasses;
21920
21921 // Now create RenderPass and verify no errors
21922 VkRenderPass rp;
21923 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
21924 m_errorMonitor->VerifyNotFound();
21925
21926 vkDestroyRenderPass(m_device->device(), rp, NULL);
21927}
21928
Tobin Ehlis01103de2017-02-16 13:22:47 -070021929TEST_F(VkPositiveLayerTest, RenderPassDepthStencilLayoutTransition) {
21930 TEST_DESCRIPTION(
21931 "Create a render pass with depth-stencil attachment where layout transition "
21932 "from UNDEFINED TO DS_READ_ONLY_OPTIMAL is set by render pass and verify that "
21933 "transition has correctly occurred at queue submit time with no validation errors.");
21934
Tony Barbour1fa09702017-03-16 12:09:08 -060021935 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070021936 auto depth_format = find_depth_stencil_format(m_device);
21937 if (!depth_format) {
21938 printf(" No Depth + Stencil format found. Skipped.\n");
21939 return;
21940 }
Tobin Ehlis01103de2017-02-16 13:22:47 -070021941 VkImageFormatProperties format_props;
Tony Barbourf887b162017-03-09 10:06:46 -070021942 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021943 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &format_props);
21944 if (format_props.maxExtent.width < 32 || format_props.maxExtent.height < 32) {
Tony Barbourf887b162017-03-09 10:06:46 -070021945 printf("Depth extent too small, RenderPassDepthStencilLayoutTransition skipped.\n");
Tobin Ehlis01103de2017-02-16 13:22:47 -070021946 return;
21947 }
21948
21949 m_errorMonitor->ExpectSuccess();
Tobin Ehlis01103de2017-02-16 13:22:47 -070021950 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21951
21952 // A renderpass with one depth/stencil attachment.
21953 VkAttachmentDescription attachment = {0,
Tony Barbourf887b162017-03-09 10:06:46 -070021954 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021955 VK_SAMPLE_COUNT_1_BIT,
21956 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21957 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21958 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21959 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21960 VK_IMAGE_LAYOUT_UNDEFINED,
21961 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
21962
21963 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
21964
21965 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
21966
21967 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
21968
21969 VkRenderPass rp;
21970 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21971 ASSERT_VK_SUCCESS(err);
21972 // A compatible ds image.
21973 VkImageObj image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -070021974 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 -070021975 ASSERT_TRUE(image.initialized());
21976
21977 VkImageViewCreateInfo ivci = {
21978 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21979 nullptr,
21980 0,
21981 image.handle(),
21982 VK_IMAGE_VIEW_TYPE_2D,
Tony Barbourf887b162017-03-09 10:06:46 -070021983 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021984 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
21985 VK_COMPONENT_SWIZZLE_IDENTITY},
21986 {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1},
21987 };
21988 VkImageView view;
21989 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21990 ASSERT_VK_SUCCESS(err);
21991
21992 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
21993 VkFramebuffer fb;
21994 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21995 ASSERT_VK_SUCCESS(err);
21996
21997 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
21998 m_commandBuffer->BeginCommandBuffer();
21999 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
22000 vkCmdEndRenderPass(m_commandBuffer->handle());
22001 m_commandBuffer->EndCommandBuffer();
22002 QueueCommandBuffer(false);
22003 m_errorMonitor->VerifyNotFound();
22004
22005 // Cleanup
22006 vkDestroyImageView(m_device->device(), view, NULL);
22007 vkDestroyRenderPass(m_device->device(), rp, NULL);
22008 vkDestroyFramebuffer(m_device->device(), fb, NULL);
22009}
22010
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022011TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022012 TEST_DESCRIPTION(
22013 "Test that pipeline validation accepts matrices passed "
22014 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022015 m_errorMonitor->ExpectSuccess();
22016
Tony Barbour1fa09702017-03-16 12:09:08 -060022017 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022018 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22019
22020 VkVertexInputBindingDescription input_binding;
22021 memset(&input_binding, 0, sizeof(input_binding));
22022
22023 VkVertexInputAttributeDescription input_attribs[2];
22024 memset(input_attribs, 0, sizeof(input_attribs));
22025
22026 for (int i = 0; i < 2; i++) {
22027 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22028 input_attribs[i].location = i;
22029 }
22030
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022031 char const *vsSource =
22032 "#version 450\n"
22033 "\n"
22034 "layout(location=0) in mat2x4 x;\n"
22035 "out gl_PerVertex {\n"
22036 " vec4 gl_Position;\n"
22037 "};\n"
22038 "void main(){\n"
22039 " gl_Position = x[0] + x[1];\n"
22040 "}\n";
22041 char const *fsSource =
22042 "#version 450\n"
22043 "\n"
22044 "layout(location=0) out vec4 color;\n"
22045 "void main(){\n"
22046 " color = vec4(1);\n"
22047 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022048
22049 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22050 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22051
22052 VkPipelineObj pipe(m_device);
22053 pipe.AddColorAttachment();
22054 pipe.AddShader(&vs);
22055 pipe.AddShader(&fs);
22056
22057 pipe.AddVertexInputBindings(&input_binding, 1);
22058 pipe.AddVertexInputAttribs(input_attribs, 2);
22059
22060 VkDescriptorSetObj descriptorSet(m_device);
22061 descriptorSet.AppendDummy();
22062 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22063
22064 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22065
22066 /* expect success */
22067 m_errorMonitor->VerifyNotFound();
22068}
22069
22070TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
22071 m_errorMonitor->ExpectSuccess();
22072
Tony Barbour1fa09702017-03-16 12:09:08 -060022073 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022074 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22075
22076 VkVertexInputBindingDescription input_binding;
22077 memset(&input_binding, 0, sizeof(input_binding));
22078
22079 VkVertexInputAttributeDescription input_attribs[2];
22080 memset(input_attribs, 0, sizeof(input_attribs));
22081
22082 for (int i = 0; i < 2; i++) {
22083 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22084 input_attribs[i].location = i;
22085 }
22086
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022087 char const *vsSource =
22088 "#version 450\n"
22089 "\n"
22090 "layout(location=0) in vec4 x[2];\n"
22091 "out gl_PerVertex {\n"
22092 " vec4 gl_Position;\n"
22093 "};\n"
22094 "void main(){\n"
22095 " gl_Position = x[0] + x[1];\n"
22096 "}\n";
22097 char const *fsSource =
22098 "#version 450\n"
22099 "\n"
22100 "layout(location=0) out vec4 color;\n"
22101 "void main(){\n"
22102 " color = vec4(1);\n"
22103 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022104
22105 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22106 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22107
22108 VkPipelineObj pipe(m_device);
22109 pipe.AddColorAttachment();
22110 pipe.AddShader(&vs);
22111 pipe.AddShader(&fs);
22112
22113 pipe.AddVertexInputBindings(&input_binding, 1);
22114 pipe.AddVertexInputAttribs(input_attribs, 2);
22115
22116 VkDescriptorSetObj descriptorSet(m_device);
22117 descriptorSet.AppendDummy();
22118 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22119
22120 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22121
22122 m_errorMonitor->VerifyNotFound();
22123}
22124
22125TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022126 TEST_DESCRIPTION(
22127 "Test that pipeline validation accepts consuming a vertex attribute "
22128 "through multiple vertex shader inputs, each consuming a different "
22129 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022130 m_errorMonitor->ExpectSuccess();
22131
Tony Barbour1fa09702017-03-16 12:09:08 -060022132 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022133 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22134
22135 VkVertexInputBindingDescription input_binding;
22136 memset(&input_binding, 0, sizeof(input_binding));
22137
22138 VkVertexInputAttributeDescription input_attribs[3];
22139 memset(input_attribs, 0, sizeof(input_attribs));
22140
22141 for (int i = 0; i < 3; i++) {
22142 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22143 input_attribs[i].location = i;
22144 }
22145
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022146 char const *vsSource =
22147 "#version 450\n"
22148 "\n"
22149 "layout(location=0) in vec4 x;\n"
22150 "layout(location=1) in vec3 y1;\n"
22151 "layout(location=1, component=3) in float y2;\n"
22152 "layout(location=2) in vec4 z;\n"
22153 "out gl_PerVertex {\n"
22154 " vec4 gl_Position;\n"
22155 "};\n"
22156 "void main(){\n"
22157 " gl_Position = x + vec4(y1, y2) + z;\n"
22158 "}\n";
22159 char const *fsSource =
22160 "#version 450\n"
22161 "\n"
22162 "layout(location=0) out vec4 color;\n"
22163 "void main(){\n"
22164 " color = vec4(1);\n"
22165 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022166
22167 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22168 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22169
22170 VkPipelineObj pipe(m_device);
22171 pipe.AddColorAttachment();
22172 pipe.AddShader(&vs);
22173 pipe.AddShader(&fs);
22174
22175 pipe.AddVertexInputBindings(&input_binding, 1);
22176 pipe.AddVertexInputAttribs(input_attribs, 3);
22177
22178 VkDescriptorSetObj descriptorSet(m_device);
22179 descriptorSet.AppendDummy();
22180 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22181
22182 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22183
22184 m_errorMonitor->VerifyNotFound();
22185}
22186
22187TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
22188 m_errorMonitor->ExpectSuccess();
22189
Tony Barbour1fa09702017-03-16 12:09:08 -060022190 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022191 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22192
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022193 char const *vsSource =
22194 "#version 450\n"
22195 "out gl_PerVertex {\n"
22196 " vec4 gl_Position;\n"
22197 "};\n"
22198 "void main(){\n"
22199 " gl_Position = vec4(0);\n"
22200 "}\n";
22201 char const *fsSource =
22202 "#version 450\n"
22203 "\n"
22204 "layout(location=0) out vec4 color;\n"
22205 "void main(){\n"
22206 " color = vec4(1);\n"
22207 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022208
22209 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22210 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22211
22212 VkPipelineObj pipe(m_device);
22213 pipe.AddColorAttachment();
22214 pipe.AddShader(&vs);
22215 pipe.AddShader(&fs);
22216
22217 VkDescriptorSetObj descriptorSet(m_device);
22218 descriptorSet.AppendDummy();
22219 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22220
22221 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22222
22223 m_errorMonitor->VerifyNotFound();
22224}
22225
22226TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022227 TEST_DESCRIPTION(
22228 "Test that pipeline validation accepts the relaxed type matching rules "
22229 "set out in 14.1.3: fundamental type must match, and producer side must "
22230 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022231 m_errorMonitor->ExpectSuccess();
22232
22233 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
22234
Tony Barbour1fa09702017-03-16 12:09:08 -060022235 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022236 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22237
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022238 char const *vsSource =
22239 "#version 450\n"
22240 "out gl_PerVertex {\n"
22241 " vec4 gl_Position;\n"
22242 "};\n"
22243 "layout(location=0) out vec3 x;\n"
22244 "layout(location=1) out ivec3 y;\n"
22245 "layout(location=2) out vec3 z;\n"
22246 "void main(){\n"
22247 " gl_Position = vec4(0);\n"
22248 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
22249 "}\n";
22250 char const *fsSource =
22251 "#version 450\n"
22252 "\n"
22253 "layout(location=0) out vec4 color;\n"
22254 "layout(location=0) in float x;\n"
22255 "layout(location=1) flat in int y;\n"
22256 "layout(location=2) in vec2 z;\n"
22257 "void main(){\n"
22258 " color = vec4(1 + x + y + z.x);\n"
22259 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022260
22261 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22262 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22263
22264 VkPipelineObj pipe(m_device);
22265 pipe.AddColorAttachment();
22266 pipe.AddShader(&vs);
22267 pipe.AddShader(&fs);
22268
22269 VkDescriptorSetObj descriptorSet(m_device);
22270 descriptorSet.AppendDummy();
22271 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22272
22273 VkResult err = VK_SUCCESS;
22274 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22275 ASSERT_VK_SUCCESS(err);
22276
22277 m_errorMonitor->VerifyNotFound();
22278}
22279
22280TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022281 TEST_DESCRIPTION(
22282 "Test that pipeline validation accepts per-vertex variables "
22283 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022284 m_errorMonitor->ExpectSuccess();
22285
Tony Barbour1fa09702017-03-16 12:09:08 -060022286 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022287 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22288
22289 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022290 printf(" Device does not support tessellation shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022291 return;
22292 }
22293
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022294 char const *vsSource =
22295 "#version 450\n"
22296 "void main(){}\n";
22297 char const *tcsSource =
22298 "#version 450\n"
22299 "layout(location=0) out int x[];\n"
22300 "layout(vertices=3) out;\n"
22301 "void main(){\n"
22302 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
22303 " gl_TessLevelInner[0] = 1;\n"
22304 " x[gl_InvocationID] = gl_InvocationID;\n"
22305 "}\n";
22306 char const *tesSource =
22307 "#version 450\n"
22308 "layout(triangles, equal_spacing, cw) in;\n"
22309 "layout(location=0) in int x[];\n"
22310 "out gl_PerVertex { vec4 gl_Position; };\n"
22311 "void main(){\n"
22312 " gl_Position.xyz = gl_TessCoord;\n"
22313 " gl_Position.w = x[0] + x[1] + x[2];\n"
22314 "}\n";
22315 char const *fsSource =
22316 "#version 450\n"
22317 "layout(location=0) out vec4 color;\n"
22318 "void main(){\n"
22319 " color = vec4(1);\n"
22320 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022321
22322 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22323 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
22324 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
22325 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22326
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022327 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
22328 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022329
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022330 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022331
22332 VkPipelineObj pipe(m_device);
22333 pipe.SetInputAssembly(&iasci);
22334 pipe.SetTessellation(&tsci);
22335 pipe.AddColorAttachment();
22336 pipe.AddShader(&vs);
22337 pipe.AddShader(&tcs);
22338 pipe.AddShader(&tes);
22339 pipe.AddShader(&fs);
22340
22341 VkDescriptorSetObj descriptorSet(m_device);
22342 descriptorSet.AppendDummy();
22343 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22344
22345 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22346
22347 m_errorMonitor->VerifyNotFound();
22348}
22349
22350TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022351 TEST_DESCRIPTION(
22352 "Test that pipeline validation accepts a user-defined "
22353 "interface block passed into the geometry shader. This "
22354 "is interesting because the 'extra' array level is not "
22355 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022356 m_errorMonitor->ExpectSuccess();
22357
Tony Barbour1fa09702017-03-16 12:09:08 -060022358 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022359 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22360
22361 if (!m_device->phy().features().geometryShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022362 printf(" Device does not support geometry shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022363 return;
22364 }
22365
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022366 char const *vsSource =
22367 "#version 450\n"
22368 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
22369 "void main(){\n"
22370 " vs_out.x = vec4(1);\n"
22371 "}\n";
22372 char const *gsSource =
22373 "#version 450\n"
22374 "layout(triangles) in;\n"
22375 "layout(triangle_strip, max_vertices=3) out;\n"
22376 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
22377 "out gl_PerVertex { vec4 gl_Position; };\n"
22378 "void main() {\n"
22379 " gl_Position = gs_in[0].x;\n"
22380 " EmitVertex();\n"
22381 "}\n";
22382 char const *fsSource =
22383 "#version 450\n"
22384 "layout(location=0) out vec4 color;\n"
22385 "void main(){\n"
22386 " color = vec4(1);\n"
22387 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022388
22389 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22390 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
22391 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22392
22393 VkPipelineObj pipe(m_device);
22394 pipe.AddColorAttachment();
22395 pipe.AddShader(&vs);
22396 pipe.AddShader(&gs);
22397 pipe.AddShader(&fs);
22398
22399 VkDescriptorSetObj descriptorSet(m_device);
22400 descriptorSet.AppendDummy();
22401 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22402
22403 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22404
22405 m_errorMonitor->VerifyNotFound();
22406}
22407
22408TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022409 TEST_DESCRIPTION(
22410 "Test that pipeline validation accepts basic use of 64bit vertex "
22411 "attributes. This is interesting because they consume multiple "
22412 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022413 m_errorMonitor->ExpectSuccess();
22414
Tony Barbour1fa09702017-03-16 12:09:08 -060022415 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022416 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22417
22418 if (!m_device->phy().features().shaderFloat64) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022419 printf(" Device does not support 64bit vertex attributes; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022420 return;
22421 }
22422
22423 VkVertexInputBindingDescription input_bindings[1];
22424 memset(input_bindings, 0, sizeof(input_bindings));
22425
22426 VkVertexInputAttributeDescription input_attribs[4];
22427 memset(input_attribs, 0, sizeof(input_attribs));
22428 input_attribs[0].location = 0;
22429 input_attribs[0].offset = 0;
22430 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22431 input_attribs[1].location = 2;
22432 input_attribs[1].offset = 32;
22433 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22434 input_attribs[2].location = 4;
22435 input_attribs[2].offset = 64;
22436 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22437 input_attribs[3].location = 6;
22438 input_attribs[3].offset = 96;
22439 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22440
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022441 char const *vsSource =
22442 "#version 450\n"
22443 "\n"
22444 "layout(location=0) in dmat4 x;\n"
22445 "out gl_PerVertex {\n"
22446 " vec4 gl_Position;\n"
22447 "};\n"
22448 "void main(){\n"
22449 " gl_Position = vec4(x[0][0]);\n"
22450 "}\n";
22451 char const *fsSource =
22452 "#version 450\n"
22453 "\n"
22454 "layout(location=0) out vec4 color;\n"
22455 "void main(){\n"
22456 " color = vec4(1);\n"
22457 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022458
22459 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22460 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22461
22462 VkPipelineObj pipe(m_device);
22463 pipe.AddColorAttachment();
22464 pipe.AddShader(&vs);
22465 pipe.AddShader(&fs);
22466
22467 pipe.AddVertexInputBindings(input_bindings, 1);
22468 pipe.AddVertexInputAttribs(input_attribs, 4);
22469
22470 VkDescriptorSetObj descriptorSet(m_device);
22471 descriptorSet.AppendDummy();
22472 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22473
22474 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22475
22476 m_errorMonitor->VerifyNotFound();
22477}
22478
22479TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
22480 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
22481 m_errorMonitor->ExpectSuccess();
22482
Tony Barbour1fa09702017-03-16 12:09:08 -060022483 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022484
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022485 char const *vsSource =
22486 "#version 450\n"
22487 "\n"
22488 "out gl_PerVertex {\n"
22489 " vec4 gl_Position;\n"
22490 "};\n"
22491 "void main(){\n"
22492 " gl_Position = vec4(1);\n"
22493 "}\n";
22494 char const *fsSource =
22495 "#version 450\n"
22496 "\n"
22497 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
22498 "layout(location=0) out vec4 color;\n"
22499 "void main() {\n"
22500 " color = subpassLoad(x);\n"
22501 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022502
22503 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22504 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22505
22506 VkPipelineObj pipe(m_device);
22507 pipe.AddShader(&vs);
22508 pipe.AddShader(&fs);
22509 pipe.AddColorAttachment();
22510 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22511
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022512 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
22513 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022514 VkDescriptorSetLayout dsl;
22515 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22516 ASSERT_VK_SUCCESS(err);
22517
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022518 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022519 VkPipelineLayout pl;
22520 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22521 ASSERT_VK_SUCCESS(err);
22522
22523 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022524 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22525 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22526 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
22527 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22528 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 -060022529 };
22530 VkAttachmentReference color = {
22531 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22532 };
22533 VkAttachmentReference input = {
22534 1, VK_IMAGE_LAYOUT_GENERAL,
22535 };
22536
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022537 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022538
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022539 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022540 VkRenderPass rp;
22541 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22542 ASSERT_VK_SUCCESS(err);
22543
22544 // should be OK. would go wrong here if it's going to...
22545 pipe.CreateVKPipeline(pl, rp);
22546
22547 m_errorMonitor->VerifyNotFound();
22548
22549 vkDestroyRenderPass(m_device->device(), rp, nullptr);
22550 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22551 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22552}
22553
22554TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022555 TEST_DESCRIPTION(
22556 "Test that pipeline validation accepts a compute pipeline which declares a "
22557 "descriptor-backed resource which is not provided, but the shader does not "
22558 "statically use it. This is interesting because it requires compute pipelines "
22559 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022560 m_errorMonitor->ExpectSuccess();
22561
Tony Barbour1fa09702017-03-16 12:09:08 -060022562 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022563
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022564 char const *csSource =
22565 "#version 450\n"
22566 "\n"
22567 "layout(local_size_x=1) in;\n"
22568 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
22569 "void main(){\n"
22570 " // x is not used.\n"
22571 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022572
22573 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22574
22575 VkDescriptorSetObj descriptorSet(m_device);
22576 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22577
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022578 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22579 nullptr,
22580 0,
22581 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22582 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22583 descriptorSet.GetPipelineLayout(),
22584 VK_NULL_HANDLE,
22585 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022586
22587 VkPipeline pipe;
22588 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22589
22590 m_errorMonitor->VerifyNotFound();
22591
22592 if (err == VK_SUCCESS) {
22593 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22594 }
22595}
22596
22597TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022598 TEST_DESCRIPTION(
22599 "Test that pipeline validation accepts a shader consuming only the "
22600 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022601 m_errorMonitor->ExpectSuccess();
22602
Tony Barbour1fa09702017-03-16 12:09:08 -060022603 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022604
22605 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022606 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22607 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22608 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022609 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022610 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022611 VkDescriptorSetLayout dsl;
22612 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22613 ASSERT_VK_SUCCESS(err);
22614
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022615 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022616 VkPipelineLayout pl;
22617 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22618 ASSERT_VK_SUCCESS(err);
22619
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022620 char const *csSource =
22621 "#version 450\n"
22622 "\n"
22623 "layout(local_size_x=1) in;\n"
22624 "layout(set=0, binding=0) uniform sampler s;\n"
22625 "layout(set=0, binding=1) uniform texture2D t;\n"
22626 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22627 "void main() {\n"
22628 " x = texture(sampler2D(t, s), vec2(0));\n"
22629 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022630 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22631
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022632 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22633 nullptr,
22634 0,
22635 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22636 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22637 pl,
22638 VK_NULL_HANDLE,
22639 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022640
22641 VkPipeline pipe;
22642 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22643
22644 m_errorMonitor->VerifyNotFound();
22645
22646 if (err == VK_SUCCESS) {
22647 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22648 }
22649
22650 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22651 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22652}
22653
22654TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022655 TEST_DESCRIPTION(
22656 "Test that pipeline validation accepts a shader consuming only the "
22657 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022658 m_errorMonitor->ExpectSuccess();
22659
Tony Barbour1fa09702017-03-16 12:09:08 -060022660 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022661
22662 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022663 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22664 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22665 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022666 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022667 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022668 VkDescriptorSetLayout dsl;
22669 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22670 ASSERT_VK_SUCCESS(err);
22671
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022672 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022673 VkPipelineLayout pl;
22674 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22675 ASSERT_VK_SUCCESS(err);
22676
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022677 char const *csSource =
22678 "#version 450\n"
22679 "\n"
22680 "layout(local_size_x=1) in;\n"
22681 "layout(set=0, binding=0) uniform texture2D t;\n"
22682 "layout(set=0, binding=1) uniform sampler s;\n"
22683 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22684 "void main() {\n"
22685 " x = texture(sampler2D(t, s), vec2(0));\n"
22686 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022687 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22688
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022689 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22690 nullptr,
22691 0,
22692 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22693 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22694 pl,
22695 VK_NULL_HANDLE,
22696 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022697
22698 VkPipeline pipe;
22699 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22700
22701 m_errorMonitor->VerifyNotFound();
22702
22703 if (err == VK_SUCCESS) {
22704 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22705 }
22706
22707 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22708 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22709}
22710
22711TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022712 TEST_DESCRIPTION(
22713 "Test that pipeline validation accepts a shader consuming "
22714 "both the sampler and the image of a combined image+sampler "
22715 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022716 m_errorMonitor->ExpectSuccess();
22717
Tony Barbour1fa09702017-03-16 12:09:08 -060022718 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022719
22720 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022721 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22722 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022723 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022724 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022725 VkDescriptorSetLayout dsl;
22726 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22727 ASSERT_VK_SUCCESS(err);
22728
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022729 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022730 VkPipelineLayout pl;
22731 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22732 ASSERT_VK_SUCCESS(err);
22733
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022734 char const *csSource =
22735 "#version 450\n"
22736 "\n"
22737 "layout(local_size_x=1) in;\n"
22738 "layout(set=0, binding=0) uniform texture2D t;\n"
22739 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
22740 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
22741 "void main() {\n"
22742 " x = texture(sampler2D(t, s), vec2(0));\n"
22743 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022744 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22745
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022746 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22747 nullptr,
22748 0,
22749 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22750 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22751 pl,
22752 VK_NULL_HANDLE,
22753 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022754
22755 VkPipeline pipe;
22756 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22757
22758 m_errorMonitor->VerifyNotFound();
22759
22760 if (err == VK_SUCCESS) {
22761 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22762 }
22763
22764 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22765 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22766}
22767
Tony Barbour3ed87a02017-03-15 16:19:02 -060022768TEST_F(VkPositiveLayerTest, Maintenance1Tests) {
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022769 TEST_DESCRIPTION("Validate various special cases for the Maintenance1_KHR extension");
22770
Tony Barbour3ed87a02017-03-15 16:19:02 -060022771 device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
Tony Barbour73c0f352017-03-16 15:55:38 -060022772 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour3ed87a02017-03-15 16:19:02 -060022773
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022774 // Ensure that extension is available and enabled.
22775 uint32_t extension_count = 0;
22776 bool supports_maintenance1_extension = false;
22777 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22778 ASSERT_VK_SUCCESS(err);
22779 if (extension_count > 0) {
22780 std::vector<VkExtensionProperties> available_extensions(extension_count);
22781
22782 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22783 ASSERT_VK_SUCCESS(err);
22784 for (const auto &extension_props : available_extensions) {
22785 if (strcmp(extension_props.extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME) == 0) {
22786 supports_maintenance1_extension = true;
22787 }
22788 }
22789 }
22790
22791 // Proceed if extension is supported by hardware
22792 if (!supports_maintenance1_extension) {
22793 printf(" Maintenance1 Extension not supported, skipping tests\n");
22794 return;
22795 }
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022796
22797 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060022798 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022799 VkCommandBuffer cmd_buf;
22800 VkCommandBufferAllocateInfo alloc_info;
22801 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22802 alloc_info.pNext = NULL;
22803 alloc_info.commandBufferCount = 1;
Mike Schuchardt06304c22017-03-01 17:09:09 -070022804 alloc_info.commandPool = m_commandPool->handle();
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022805 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22806 vkAllocateCommandBuffers(m_device->device(), &alloc_info, &cmd_buf);
22807
22808 VkCommandBufferBeginInfo cb_binfo;
22809 cb_binfo.pNext = NULL;
22810 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22811 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
22812 cb_binfo.flags = 0;
22813 vkBeginCommandBuffer(cmd_buf, &cb_binfo);
22814 // Set Negative height, should give error if Maintenance 1 is not enabled
22815 VkViewport viewport = {0, 0, 16, -16, 0, 1};
22816 vkCmdSetViewport(cmd_buf, 0, 1, &viewport);
22817 vkEndCommandBuffer(cmd_buf);
22818
22819 m_errorMonitor->VerifyNotFound();
22820}
22821
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022822TEST_F(VkPositiveLayerTest, ValidStructPNext) {
22823 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
22824
Tony Barbour1fa09702017-03-16 12:09:08 -060022825 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022826
22827 // Positive test to check parameter_validation and unique_objects support
22828 // for NV_dedicated_allocation
22829 uint32_t extension_count = 0;
22830 bool supports_nv_dedicated_allocation = false;
22831 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22832 ASSERT_VK_SUCCESS(err);
22833
22834 if (extension_count > 0) {
22835 std::vector<VkExtensionProperties> available_extensions(extension_count);
22836
22837 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22838 ASSERT_VK_SUCCESS(err);
22839
22840 for (const auto &extension_props : available_extensions) {
22841 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
22842 supports_nv_dedicated_allocation = true;
22843 }
22844 }
22845 }
22846
22847 if (supports_nv_dedicated_allocation) {
22848 m_errorMonitor->ExpectSuccess();
22849
22850 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
22851 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
22852 dedicated_buffer_create_info.pNext = nullptr;
22853 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
22854
22855 uint32_t queue_family_index = 0;
22856 VkBufferCreateInfo buffer_create_info = {};
22857 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
22858 buffer_create_info.pNext = &dedicated_buffer_create_info;
22859 buffer_create_info.size = 1024;
22860 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
22861 buffer_create_info.queueFamilyIndexCount = 1;
22862 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
22863
22864 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070022865 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022866 ASSERT_VK_SUCCESS(err);
22867
22868 VkMemoryRequirements memory_reqs;
22869 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
22870
22871 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
22872 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
22873 dedicated_memory_info.pNext = nullptr;
22874 dedicated_memory_info.buffer = buffer;
22875 dedicated_memory_info.image = VK_NULL_HANDLE;
22876
22877 VkMemoryAllocateInfo memory_info = {};
22878 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
22879 memory_info.pNext = &dedicated_memory_info;
22880 memory_info.allocationSize = memory_reqs.size;
22881
22882 bool pass;
22883 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
22884 ASSERT_TRUE(pass);
22885
22886 VkDeviceMemory buffer_memory;
22887 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
22888 ASSERT_VK_SUCCESS(err);
22889
22890 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
22891 ASSERT_VK_SUCCESS(err);
22892
22893 vkDestroyBuffer(m_device->device(), buffer, NULL);
22894 vkFreeMemory(m_device->device(), buffer_memory, NULL);
22895
22896 m_errorMonitor->VerifyNotFound();
22897 }
22898}
22899
22900TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
22901 VkResult err;
22902
22903 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
22904
Tony Barbour1fa09702017-03-16 12:09:08 -060022905 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022906 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22907
22908 std::vector<const char *> device_extension_names;
22909 auto features = m_device->phy().features();
22910 // Artificially disable support for non-solid fill modes
22911 features.fillModeNonSolid = false;
22912 // The sacrificial device object
22913 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
22914
22915 VkRenderpassObj render_pass(&test_device);
22916
22917 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
22918 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
22919 pipeline_layout_ci.setLayoutCount = 0;
22920 pipeline_layout_ci.pSetLayouts = NULL;
22921
22922 VkPipelineLayout pipeline_layout;
22923 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
22924 ASSERT_VK_SUCCESS(err);
22925
22926 VkPipelineRasterizationStateCreateInfo rs_ci = {};
22927 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
22928 rs_ci.pNext = nullptr;
22929 rs_ci.lineWidth = 1.0f;
22930 rs_ci.rasterizerDiscardEnable = true;
22931
22932 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
22933 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22934
22935 // Set polygonMode=FILL. No error is expected
22936 m_errorMonitor->ExpectSuccess();
22937 {
22938 VkPipelineObj pipe(&test_device);
22939 pipe.AddShader(&vs);
22940 pipe.AddShader(&fs);
22941 pipe.AddColorAttachment();
22942 // Set polygonMode to a good value
22943 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
22944 pipe.SetRasterization(&rs_ci);
22945 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
22946 }
22947 m_errorMonitor->VerifyNotFound();
22948
22949 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
22950}
22951
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022952#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022953TEST_F(VkPositiveLayerTest, LongFenceChain)
22954{
22955 m_errorMonitor->ExpectSuccess();
22956
Tony Barbour1fa09702017-03-16 12:09:08 -060022957 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022958 VkResult err;
22959
22960 std::vector<VkFence> fences;
22961
22962 const int chainLength = 32768;
22963
22964 for (int i = 0; i < chainLength; i++) {
22965 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
22966 VkFence fence;
22967 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
22968 ASSERT_VK_SUCCESS(err);
22969
22970 fences.push_back(fence);
22971
22972 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
22973 0, nullptr, 0, nullptr };
22974 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
22975 ASSERT_VK_SUCCESS(err);
22976
22977 }
22978
22979 // BOOM, stack overflow.
22980 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
22981
22982 for (auto fence : fences)
22983 vkDestroyFence(m_device->device(), fence, nullptr);
22984
22985 m_errorMonitor->VerifyNotFound();
22986}
22987#endif
22988
Cody Northrop1242dfd2016-07-13 17:24:59 -060022989#if defined(ANDROID) && defined(VALIDATION_APK)
22990static bool initialized = false;
22991static bool active = false;
22992
22993// Convert Intents to argv
22994// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022995std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060022996 std::vector<std::string> args;
22997 JavaVM &vm = *app.activity->vm;
22998 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022999 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023000
23001 JNIEnv &env = *p_env;
23002 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023003 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023004 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023005 jmethodID get_string_extra_method =
23006 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023007 jvalue get_string_extra_args;
23008 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023009 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060023010
23011 std::string args_str;
23012 if (extra_str) {
23013 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
23014 args_str = extra_utf;
23015 env.ReleaseStringUTFChars(extra_str, extra_utf);
23016 env.DeleteLocalRef(extra_str);
23017 }
23018
23019 env.DeleteLocalRef(get_string_extra_args.l);
23020 env.DeleteLocalRef(intent);
23021 vm.DetachCurrentThread();
23022
23023 // split args_str
23024 std::stringstream ss(args_str);
23025 std::string arg;
23026 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023027 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023028 }
23029
23030 return args;
23031}
23032
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023033static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023034
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023035static void processCommand(struct android_app *app, int32_t cmd) {
23036 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023037 case APP_CMD_INIT_WINDOW: {
23038 if (app->window) {
23039 initialized = true;
23040 }
23041 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023042 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023043 case APP_CMD_GAINED_FOCUS: {
23044 active = true;
23045 break;
23046 }
23047 case APP_CMD_LOST_FOCUS: {
23048 active = false;
23049 break;
23050 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023051 }
23052}
23053
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023054void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023055 app_dummy();
23056
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023057 const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060023058
23059 int vulkanSupport = InitVulkan();
23060 if (vulkanSupport == 0) {
23061 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
23062 return;
23063 }
23064
23065 app->onAppCmd = processCommand;
23066 app->onInputEvent = processInput;
23067
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023068 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023069 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023070 struct android_poll_source *source;
23071 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023072 if (source) {
23073 source->process(app, source);
23074 }
23075
23076 if (app->destroyRequested != 0) {
23077 VkTestFramework::Finish();
23078 return;
23079 }
23080 }
23081
23082 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023083 // Use the following key to send arguments to gtest, i.e.
23084 // --es args "--gtest_filter=-VkLayerTest.foo"
23085 const char key[] = "args";
23086 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023087
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023088 std::string filter = "";
23089 if (args.size() > 0) {
23090 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
23091 filter += args[0];
23092 } else {
23093 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
23094 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023095
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023096 int argc = 2;
23097 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
23098 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023099
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023100 // Route output to files until we can override the gtest output
23101 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
23102 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023103
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023104 ::testing::InitGoogleTest(&argc, argv);
23105 VkTestFramework::InitArgs(&argc, argv);
23106 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023107
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023108 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023109
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023110 if (result != 0) {
23111 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
23112 } else {
23113 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
23114 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023115
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023116 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023117
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023118 fclose(stdout);
23119 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023120
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023121 ANativeActivity_finish(app->activity);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023122 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023123 }
23124 }
23125}
23126#endif
23127
Tony Barbour300a6082015-04-07 13:44:53 -060023128int main(int argc, char **argv) {
23129 int result;
23130
Cody Northrop8e54a402016-03-08 22:25:52 -070023131#ifdef ANDROID
23132 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023133 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070023134#endif
23135
Tony Barbour300a6082015-04-07 13:44:53 -060023136 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060023137 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060023138
23139 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
23140
23141 result = RUN_ALL_TESTS();
23142
Tony Barbour6918cd52015-04-09 12:58:51 -060023143 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060023144 return result;
23145}