blob: 8b7315f70bf40a3ce389df15771f8964970a3a48 [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
Mike Weiblen40b160e2017-02-06 19:21:52 -07002 * Copyright (c) 2015-2017 The Khronos Group Inc.
3 * Copyright (c) 2015-2017 Valve Corporation
4 * Copyright (c) 2015-2017 LunarG, Inc.
5 * Copyright (c) 2015-2017 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
Cody Northrop1242dfd2016-07-13 17:24:59 -060020 * Author: Cody Northrop <cnorthrop@google.com>
Dave Houlton59a20702017-02-02 17:26:23 -070021 * Author: Dave Houlton <daveh@lunarg.com>
Karl Schultz6addd812016-02-02 17:17:23 -070022 */
Tony Barbour65c48b32015-11-17 10:02:56 -070023
Cody Northrop8e54a402016-03-08 22:25:52 -070024#ifdef ANDROID
25#include "vulkan_wrapper.h"
26#else
David Pinedo9316d3b2015-11-06 12:54:48 -070027#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070028#endif
Cody Northrop1242dfd2016-07-13 17:24:59 -060029
30#if defined(ANDROID) && defined(VALIDATION_APK)
31#include <android/log.h>
32#include <android_native_app_glue.h>
33#endif
34
Jon Ashburn7fa7e222016-02-02 12:08:10 -070035#include "icd-spv.h"
Mark Lobodzinskice751c62016-09-08 10:45:35 -060036#include "test_common.h"
37#include "vk_layer_config.h"
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060038#include "vk_validation_error_messages.h"
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060039#include "vkrenderframework.h"
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070040
41#include <algorithm>
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060042#include <limits.h>
43#include <unordered_set>
Tony Barbour300a6082015-04-07 13:44:53 -060044
Mark Lobodzinski3780e142015-05-14 15:08:13 -050045#define GLM_FORCE_RADIANS
46#include "glm/glm.hpp"
47#include <glm/gtc/matrix_transform.hpp>
48
49//--------------------------------------------------------------------------------------
50// Mesh and VertexFormat Data
51//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070052struct Vertex {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070053 float posX, posY, posZ, posW; // Position data
54 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050055};
56
Karl Schultz6addd812016-02-02 17:17:23 -070057#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050058
59typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070060 BsoFailNone = 0x00000000,
61 BsoFailLineWidth = 0x00000001,
62 BsoFailDepthBias = 0x00000002,
63 BsoFailViewport = 0x00000004,
64 BsoFailScissor = 0x00000008,
65 BsoFailBlend = 0x00000010,
66 BsoFailDepthBounds = 0x00000020,
67 BsoFailStencilReadMask = 0x00000040,
68 BsoFailStencilWriteMask = 0x00000080,
69 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060070 BsoFailCmdClearAttachments = 0x00000200,
Tobin Ehlis379ba3b2016-07-19 11:22:29 -060071 BsoFailIndexBuffer = 0x00000400,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050072} BsoFailSelect;
73
74struct vktriangle_vs_uniform {
75 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070076 float mvp[4][4];
77 float position[3][4];
78 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050079};
80
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070081static const char bindStateVertShaderText[] =
82 "#version 450\n"
83 "vec2 vertices[3];\n"
84 "out gl_PerVertex {\n"
85 " vec4 gl_Position;\n"
86 "};\n"
87 "void main() {\n"
88 " vertices[0] = vec2(-1.0, -1.0);\n"
89 " vertices[1] = vec2( 1.0, -1.0);\n"
90 " vertices[2] = vec2( 0.0, 1.0);\n"
91 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
92 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050093
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070094static const char bindStateFragShaderText[] =
95 "#version 450\n"
96 "\n"
97 "layout(location = 0) out vec4 uFragColor;\n"
98 "void main(){\n"
99 " uFragColor = vec4(0,1,0,1);\n"
100 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500101
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600102static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
103 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
104 void *pUserData);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600105
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600106// ErrorMonitor Usage:
107//
Dave Houltonfbf52152017-01-06 12:55:29 -0700108// Call SetDesiredFailureMsg with a string to be compared against all
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600109// encountered log messages, or a validation error enum identifying
110// desired error message. Passing NULL or VALIDATION_ERROR_MAX_ENUM
111// will match all log messages. logMsg will return true for skipCall
112// only if msg is matched or NULL.
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600113//
Dave Houltonfbf52152017-01-06 12:55:29 -0700114// Call VerifyFound to determine if all desired failure messages
115// were encountered. Call VerifyNotFound to determine if any unexpected
116// failure was encountered.
Tony Barbour300a6082015-04-07 13:44:53 -0600117class ErrorMonitor {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700118 public:
Karl Schultz6addd812016-02-02 17:17:23 -0700119 ErrorMonitor() {
Dave Houltonfbf52152017-01-06 12:55:29 -0700120 test_platform_thread_create_mutex(&mutex_);
121 test_platform_thread_lock_mutex(&mutex_);
122 Reset();
123 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600124 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600125
Dave Houltonfbf52152017-01-06 12:55:29 -0700126 ~ErrorMonitor() { test_platform_thread_delete_mutex(&mutex_); }
Dustin Graves48458142016-04-29 16:11:55 -0600127
Dave Houltonfbf52152017-01-06 12:55:29 -0700128 // Set monitor to pristine state
129 void Reset() {
130 message_flags_ = VK_DEBUG_REPORT_ERROR_BIT_EXT;
131 bailout_ = NULL;
132 message_found_ = VK_FALSE;
133 failure_message_strings_.clear();
134 desired_message_strings_.clear();
135 desired_message_ids_.clear();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700136 ignore_message_strings_.clear();
Dave Houltonfbf52152017-01-06 12:55:29 -0700137 other_messages_.clear();
138 message_outstanding_count_ = 0;
139 }
140
141 // ErrorMonitor will look for an error message containing the specified string(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700142 void SetDesiredFailureMsg(const VkFlags msgFlags, const char *const msgString) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700143 test_platform_thread_lock_mutex(&mutex_);
144 desired_message_strings_.insert(msgString);
145 message_flags_ |= msgFlags;
146 message_outstanding_count_++;
147 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600148 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600149
Jeremy Hayesde6d96c2017-02-01 15:22:32 -0700150 // ErrorMonitor will look for an error message containing the specified string(s)
151 template <typename Iter>
152 void SetDesiredFailureMsg(const VkFlags msgFlags, Iter iter, const Iter end) {
153 for (; iter != end; ++iter) {
154 SetDesiredFailureMsg(msgFlags, *iter);
155 }
156 }
157
Dave Houltonfbf52152017-01-06 12:55:29 -0700158 // ErrorMonitor will look for a message ID matching the specified one(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700159 void SetDesiredFailureMsg(const VkFlags msgFlags, const UNIQUE_VALIDATION_ERROR_CODE msg_id) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700160 test_platform_thread_lock_mutex(&mutex_);
161 desired_message_ids_.insert(msg_id);
162 message_flags_ |= msgFlags;
163 message_outstanding_count_++;
164 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600165 }
166
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700167 // Set an error that the error monitor will ignore. Do not use this function if you are creating a new test.
168 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
169 // function and its definition.
170 void SetUnexpectedError(const char *const msg) {
171 test_platform_thread_lock_mutex(&mutex_);
172
173 ignore_message_strings_.emplace_back(msg);
174
175 test_platform_thread_unlock_mutex(&mutex_);
176 }
177
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700178 VkBool32 CheckForDesiredMsg(const uint32_t message_code, const char *const msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600179 VkBool32 result = VK_FALSE;
Dave Houltonfbf52152017-01-06 12:55:29 -0700180 test_platform_thread_lock_mutex(&mutex_);
181 if (bailout_ != NULL) {
182 *bailout_ = true;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600183 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600184 string errorString(msgString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600185 bool found_expected = false;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600186
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700187 if (!IgnoreMessage(errorString)) {
188 for (auto desired_msg : desired_message_strings_) {
189 if (desired_msg.length() == 0) {
190 // An empty desired_msg string "" indicates a positive test - not expecting an error.
191 // Return true to avoid calling layers/driver with this error.
192 // And don't erase the "" string, so it remains if another error is found.
193 result = VK_TRUE;
194 found_expected = true;
195 message_found_ = VK_TRUE;
196 failure_message_strings_.insert(errorString);
197 } else if (errorString.find(desired_msg) != string::npos) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600198 found_expected = true;
Dave Houltonfbf52152017-01-06 12:55:29 -0700199 message_outstanding_count_--;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700200 failure_message_strings_.insert(errorString);
Dave Houltonfbf52152017-01-06 12:55:29 -0700201 message_found_ = VK_TRUE;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700202 result = VK_TRUE;
203 // We only want one match for each expected error so remove from set here
204 // Since we're about the break the loop it's ok to remove from set we're iterating over
205 desired_message_strings_.erase(desired_msg);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600206 break;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600207 }
208 }
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700209 for (auto desired_id : desired_message_ids_) {
210 if (desired_id == VALIDATION_ERROR_MAX_ENUM) {
211 // A message ID set to MAX_ENUM indicates a positive test - not expecting an error.
212 // Return true to avoid calling layers/driver with this error.
213 result = VK_TRUE;
214 } else if (desired_id == message_code) {
215 // Double-check that the string matches the error enum
216 if (errorString.find(validation_error_map[desired_id]) != string::npos) {
217 found_expected = true;
218 message_outstanding_count_--;
219 result = VK_TRUE;
220 message_found_ = VK_TRUE;
221 desired_message_ids_.erase(desired_id);
222 break;
223 } else {
224 // Treat this message as a regular unexpected error, but print a warning jic
225 printf("Message (%s) from MessageID %d does not correspond to expected message from error Database (%s)\n",
226 errorString.c_str(), desired_id, validation_error_map[desired_id]);
227 }
228 }
229 }
230
231 if (!found_expected) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600232 printf("Unexpected: %s\n", msgString);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700233 other_messages_.push_back(errorString);
234 }
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600235 }
236
Dave Houltonfbf52152017-01-06 12:55:29 -0700237 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600238 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600239 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600240
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600241 vector<string> GetOtherFailureMsgs(void) const { return other_messages_; }
242
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700243 VkDebugReportFlagsEXT GetMessageFlags(void) const { return message_flags_; }
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600244
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700245 VkBool32 AnyDesiredMsgFound(void) const { return message_found_; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600246
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700247 VkBool32 AllDesiredMsgsFound(void) const { return (0 == message_outstanding_count_); }
Dave Houltonfbf52152017-01-06 12:55:29 -0700248
249 void SetBailout(bool *bailout) { bailout_ = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600250
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600251 void DumpFailureMsgs(void) const {
252 vector<string> otherMsgs = GetOtherFailureMsgs();
253 if (otherMsgs.size()) {
254 cout << "Other error messages logged for this test were:" << endl;
255 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
256 cout << " " << *iter << endl;
Tony Barbour59b42282016-11-03 13:31:28 -0600257 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600258 }
259 }
260
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600261 // Helpers
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200262
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600263 // ExpectSuccess now takes an optional argument allowing a custom combination of debug flags
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700264 void ExpectSuccess(VkDebugReportFlagsEXT const message_flag_mask = VK_DEBUG_REPORT_ERROR_BIT_EXT) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600265 // Match ANY message matching specified type
266 SetDesiredFailureMsg(message_flag_mask, "");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700267 message_flags_ = message_flag_mask; // override mask handling in SetDesired...
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200268 }
269
270 void VerifyFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600271 // Not seeing the desired message is a failure. /Before/ throwing, dump any other messages.
Dave Houltonfbf52152017-01-06 12:55:29 -0700272 if (!AllDesiredMsgsFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600273 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700274 for (auto desired_msg : desired_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700275 ADD_FAILURE() << "Did not receive expected error '" << desired_msg << "'";
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600276 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700277 for (auto desired_id : desired_message_ids_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700278 ADD_FAILURE() << "Did not receive expected error ENUM '" << desired_id << "'";
Tony Barbour59b42282016-11-03 13:31:28 -0600279 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200280 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700281 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200282 }
283
284 void VerifyNotFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600285 // ExpectSuccess() configured us to match anything. Any error is a failure.
Dave Houltonfbf52152017-01-06 12:55:29 -0700286 if (AnyDesiredMsgFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600287 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700288 for (auto msg : failure_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700289 ADD_FAILURE() << "Expected to succeed but got error: " << msg;
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600290 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200291 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700292 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200293 }
294
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700295 private:
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700296 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
297 // function and its definition.
298 bool IgnoreMessage(std::string const &msg) const {
299 if (ignore_message_strings_.empty()) {
300 return false;
301 }
302
303 return std::find_if(ignore_message_strings_.begin(), ignore_message_strings_.end(), [&msg](std::string const &str) {
304 return msg.find(str) != std::string::npos;
305 }) != ignore_message_strings_.end();
306 }
307
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700308 VkFlags message_flags_;
309 std::unordered_set<uint32_t> desired_message_ids_;
310 std::unordered_set<string> desired_message_strings_;
311 std::unordered_set<string> failure_message_strings_;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700312 std::vector<std::string> ignore_message_strings_;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700313 vector<string> other_messages_;
314 test_platform_thread_mutex mutex_;
315 bool *bailout_;
316 VkBool32 message_found_;
317 int message_outstanding_count_;
Tony Barbour300a6082015-04-07 13:44:53 -0600318};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500319
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600320static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
321 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
322 void *pUserData) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600323 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
324 if (msgFlags & errMonitor->GetMessageFlags()) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600325 return errMonitor->CheckForDesiredMsg(msgCode, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600326 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600327 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600328}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500329
Karl Schultz6addd812016-02-02 17:17:23 -0700330class VkLayerTest : public VkRenderFramework {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700331 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600332 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
333 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet,
Karl Schultz6addd812016-02-02 17:17:23 -0700334 BsoFailSelect failMask);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600335 void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
336 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet, failMask);
Karl Schultz6addd812016-02-02 17:17:23 -0700337 }
Tony Barbour300a6082015-04-07 13:44:53 -0600338
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600339 void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
340 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700341 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600342 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
Karl Schultz6addd812016-02-02 17:17:23 -0700343 uint32_t firstInstance) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600344 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700345 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600346 void QueueCommandBuffer(bool checkSuccess = true) { m_commandBuffer->QueueCommandBuffer(checkSuccess); }
347 void QueueCommandBuffer(const VkFence &fence) { m_commandBuffer->QueueCommandBuffer(fence); }
348 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding) {
Karl Schultz6addd812016-02-02 17:17:23 -0700349 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
350 }
351 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
352 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
353 }
Tony Barbour1fa09702017-03-16 12:09:08 -0600354 void Init(VkPhysicalDeviceFeatures *features = nullptr, const VkCommandPoolCreateFlags flags = 0) {
355 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
356 InitState(features, flags);
357 }
358
Karl Schultz6addd812016-02-02 17:17:23 -0700359
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700360 protected:
Karl Schultz6addd812016-02-02 17:17:23 -0700361 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600362 bool m_enableWSI;
Tony Barbour1fa09702017-03-16 12:09:08 -0600363 std::vector<const char *> instance_layer_names;
364 std::vector<const char *> instance_extension_names;
365 std::vector<const char *> device_extension_names;
Tony Barbour300a6082015-04-07 13:44:53 -0600366
367 virtual void SetUp() {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700368 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600369 /*
370 * Since CreateDbgMsgCallback is an instance level extension call
371 * any extension / layer that utilizes that feature also needs
372 * to be enabled at create instance time.
373 */
Karl Schultz6addd812016-02-02 17:17:23 -0700374 // Use Threading layer first to protect others from
375 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700376 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600377 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800378 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700379 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Ian Elliotte48a1382016-04-28 14:22:58 -0600380 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700381 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600382
Ian Elliott2c1daf52016-05-12 09:41:46 -0600383 if (m_enableWSI) {
384 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
385 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
386#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
387#if defined(VK_USE_PLATFORM_ANDROID_KHR)
388 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700389#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600390#if defined(VK_USE_PLATFORM_MIR_KHR)
391 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700392#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600393#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
394 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700395#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600396#if defined(VK_USE_PLATFORM_WIN32_KHR)
397 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700398#endif // VK_USE_PLATFORM_WIN32_KHR
399#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott2c1daf52016-05-12 09:41:46 -0600400#if defined(VK_USE_PLATFORM_XCB_KHR)
401 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
402#elif defined(VK_USE_PLATFORM_XLIB_KHR)
403 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700404#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600405 }
406
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600407 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600408 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800409 this->app_info.pApplicationName = "layer_tests";
410 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600411 this->app_info.pEngineName = "unittest";
412 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600413 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600414
Tony Barbour15524c32015-04-29 17:34:29 -0600415 m_errorMonitor = new ErrorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600416 }
417
418 virtual void TearDown() {
419 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600420 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600421 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600422 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600423
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600424 VkLayerTest() { m_enableWSI = false; }
Tony Barbour300a6082015-04-07 13:44:53 -0600425};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500426
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600427void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500428 // Create identity matrix
429 int i;
430 struct vktriangle_vs_uniform data;
431
432 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700433 glm::mat4 View = glm::mat4(1.0f);
434 glm::mat4 Model = glm::mat4(1.0f);
435 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500436 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700437 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500438
439 memcpy(&data.mvp, &MVP[0][0], matrixSize);
440
Karl Schultz6addd812016-02-02 17:17:23 -0700441 static const Vertex tri_data[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600442 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)}, {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)}, {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500443 };
444
Karl Schultz6addd812016-02-02 17:17:23 -0700445 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500446 data.position[i][0] = tri_data[i].posX;
447 data.position[i][1] = tri_data[i].posY;
448 data.position[i][2] = tri_data[i].posZ;
449 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700450 data.color[i][0] = tri_data[i].r;
451 data.color[i][1] = tri_data[i].g;
452 data.color[i][2] = tri_data[i].b;
453 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500454 }
455
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500456 ASSERT_NO_FATAL_FAILURE(InitViewport());
457
Chris Forbesbcfaadd2016-09-16 14:13:53 +1200458 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float), (const void *)&data,
459 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500460
Karl Schultz6addd812016-02-02 17:17:23 -0700461 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600462 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500463
464 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800465 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500466 pipelineobj.AddShader(&vs);
467 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600468 if (failMask & BsoFailLineWidth) {
469 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600470 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600471 ia_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600472 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
473 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600474 }
475 if (failMask & BsoFailDepthBias) {
476 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600477 VkPipelineRasterizationStateCreateInfo rs_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600478 rs_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600479 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600480 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600481 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600482 }
Rene Lindsayacbf5e62016-12-15 18:47:11 -0700483 // Viewport and scissors must stay in sync or other errors will occur than
Karl Schultz6addd812016-02-02 17:17:23 -0700484 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600485 if (failMask & BsoFailViewport) {
486 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
487 }
488 if (failMask & BsoFailScissor) {
489 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
490 }
491 if (failMask & BsoFailBlend) {
492 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600493 VkPipelineColorBlendAttachmentState att_state = {};
494 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
495 att_state.blendEnable = VK_TRUE;
496 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600497 }
498 if (failMask & BsoFailDepthBounds) {
499 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
500 }
501 if (failMask & BsoFailStencilReadMask) {
502 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
503 }
504 if (failMask & BsoFailStencilWriteMask) {
505 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
506 }
507 if (failMask & BsoFailStencilReference) {
508 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
509 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500510
511 VkDescriptorSetObj descriptorSet(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600512 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500513
514 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbour552f6c02016-12-21 14:34:07 -0700515 m_commandBuffer->BeginCommandBuffer();
516 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500517
Tony Barbourfe3351b2015-07-28 10:17:20 -0600518 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500519
520 // render triangle
Tobin Ehlis379ba3b2016-07-19 11:22:29 -0600521 if (failMask & BsoFailIndexBuffer) {
522 // Use DrawIndexed w/o an index buffer bound
523 DrawIndexed(3, 1, 0, 0, 0);
524 } else {
525 Draw(3, 1, 0, 0);
526 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500527
Mark Muellerd4914412016-06-13 17:52:06 -0600528 if (failMask & BsoFailCmdClearAttachments) {
529 VkClearAttachment color_attachment = {};
530 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700531 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
Mark Muellerd4914412016-06-13 17:52:06 -0600532 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
533
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600534 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Muellerd4914412016-06-13 17:52:06 -0600535 }
536
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500537 // finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -0700538 m_commandBuffer->EndRenderPass();
539 m_commandBuffer->EndCommandBuffer();
Tony Barbourfe3351b2015-07-28 10:17:20 -0600540 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500541}
542
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600543void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj,
544 VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500545 if (m_depthStencil->Initialized()) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600546 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500547 } else {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600548 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500549 }
550
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800551 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700552 // Make sure depthWriteEnable is set so that Depth fail test will work
553 // correctly
554 // Make sure stencilTestEnable is set so that Stencil fail test will work
555 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600556 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800557 stencil.failOp = VK_STENCIL_OP_KEEP;
558 stencil.passOp = VK_STENCIL_OP_KEEP;
559 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
560 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600561
562 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
563 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600564 ds_ci.pNext = NULL;
565 ds_ci.depthTestEnable = VK_FALSE;
566 ds_ci.depthWriteEnable = VK_TRUE;
567 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
568 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600569 if (failMask & BsoFailDepthBounds) {
570 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600571 ds_ci.maxDepthBounds = 0.0f;
572 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600573 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600574 ds_ci.stencilTestEnable = VK_TRUE;
575 ds_ci.front = stencil;
576 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600577
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600578 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600579 pipelineobj.SetViewport(m_viewports);
580 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800581 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600582 VkResult err = pipelineobj.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600583 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800584 commandBuffer->BindPipeline(pipelineobj);
585 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500586}
587
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600588class VkPositiveLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700589 public:
590 protected:
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600591};
592
Ian Elliott2c1daf52016-05-12 09:41:46 -0600593class VkWsiEnabledLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700594 public:
595 protected:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600596 VkWsiEnabledLayerTest() { m_enableWSI = true; }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600597};
598
Mark Muellerdfe37552016-07-07 14:47:42 -0600599class VkBufferTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700600 public:
Mark Muellerdfe37552016-07-07 14:47:42 -0600601 enum eTestEnFlags {
602 eDoubleDelete,
603 eInvalidDeviceOffset,
604 eInvalidMemoryOffset,
605 eBindNullBuffer,
606 eFreeInvalidHandle,
Mark Mueller4042b652016-09-05 22:52:21 -0600607 eNone,
Mark Muellerdfe37552016-07-07 14:47:42 -0600608 };
609
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600610 enum eTestConditions { eOffsetAlignment = 1 };
Mark Muellerdfe37552016-07-07 14:47:42 -0600611
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600612 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice, eTestEnFlags aTestFlag, VkBufferUsageFlags aBufferUsage = 0) {
613 if (eInvalidDeviceOffset != aTestFlag && eInvalidMemoryOffset != aTestFlag) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600614 return true;
615 }
616 VkDeviceSize offset_limit = 0;
617 if (eInvalidMemoryOffset == aTestFlag) {
618 VkBuffer vulkanBuffer;
619 VkBufferCreateInfo buffer_create_info = {};
620 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
621 buffer_create_info.size = 32;
622 buffer_create_info.usage = aBufferUsage;
623
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600624 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr, &vulkanBuffer);
Mark Mueller4042b652016-09-05 22:52:21 -0600625 VkMemoryRequirements memory_reqs = {};
Mark Muellerdfe37552016-07-07 14:47:42 -0600626
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600627 vkGetBufferMemoryRequirements(aVulkanDevice->device(), vulkanBuffer, &memory_reqs);
Mark Muellerdfe37552016-07-07 14:47:42 -0600628 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
629 offset_limit = memory_reqs.alignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600630 } else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
631 offset_limit = aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600632 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600633 offset_limit = aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600634 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600635 offset_limit = aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600636 }
637 if (eOffsetAlignment < offset_limit) {
638 return true;
639 }
640 return false;
641 }
642
643 // A constructor which performs validation tests within construction.
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600644 VkBufferTest(VkDeviceObj *aVulkanDevice, VkBufferUsageFlags aBufferUsage, eTestEnFlags aTestFlag = eNone)
645 : AllocateCurrent(false), BoundCurrent(false), CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600646 if (eBindNullBuffer == aTestFlag) {
647 VulkanMemory = 0;
648 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
649 } else {
650 VkBufferCreateInfo buffer_create_info = {};
651 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
652 buffer_create_info.size = 32;
653 buffer_create_info.usage = aBufferUsage;
654
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600655 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr, &VulkanBuffer);
Mark Muellerdfe37552016-07-07 14:47:42 -0600656
657 CreateCurrent = true;
658
659 VkMemoryRequirements memory_requirements;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600660 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer, &memory_requirements);
Mark Muellerdfe37552016-07-07 14:47:42 -0600661
662 VkMemoryAllocateInfo memory_allocate_info = {};
663 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Stratton77a0d592017-02-17 13:14:13 -0800664 memory_allocate_info.allocationSize = memory_requirements.size + eOffsetAlignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600665 bool pass = aVulkanDevice->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info,
666 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Muellerdfe37552016-07-07 14:47:42 -0600667 if (!pass) {
668 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
669 return;
670 }
671
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600672 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL, &VulkanMemory);
Mark Muellerdfe37552016-07-07 14:47:42 -0600673 AllocateCurrent = true;
674 // NB: 1 is intentionally an invalid offset value
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600675 const bool offset_en = eInvalidDeviceOffset == aTestFlag || eInvalidMemoryOffset == aTestFlag;
676 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, offset_en ? eOffsetAlignment : 0);
Mark Muellerdfe37552016-07-07 14:47:42 -0600677 BoundCurrent = true;
678
679 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
680 }
681 }
682
683 ~VkBufferTest() {
684 if (CreateCurrent) {
685 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
686 }
687 if (AllocateCurrent) {
688 if (InvalidDeleteEn) {
689 union {
690 VkDeviceMemory device_memory;
691 unsigned long long index_access;
692 } bad_index;
693
694 bad_index.device_memory = VulkanMemory;
695 bad_index.index_access++;
696
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600697 vkFreeMemory(VulkanDevice, bad_index.device_memory, nullptr);
Mark Muellerdfe37552016-07-07 14:47:42 -0600698 }
699 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
700 }
701 }
702
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600703 bool GetBufferCurrent() { return AllocateCurrent && BoundCurrent && CreateCurrent; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600704
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600705 const VkBuffer &GetBuffer() { return VulkanBuffer; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600706
707 void TestDoubleDestroy() {
708 // Destroy the buffer but leave the flag set, which will cause
709 // the buffer to be destroyed again in the destructor.
710 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
711 }
712
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700713 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600714 bool AllocateCurrent;
715 bool BoundCurrent;
716 bool CreateCurrent;
717 bool InvalidDeleteEn;
718
719 VkBuffer VulkanBuffer;
720 VkDevice VulkanDevice;
721 VkDeviceMemory VulkanMemory;
Mark Muellerdfe37552016-07-07 14:47:42 -0600722};
723
724class VkVerticesObj {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700725 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600726 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount, unsigned aBindingCount, unsigned aByteStride,
Mark Muellerdfe37552016-07-07 14:47:42 -0600727 VkDeviceSize aVertexCount, const float *aVerticies)
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700728 : BoundCurrent(false),
729 AttributeCount(aAttributeCount),
730 BindingCount(aBindingCount),
731 BindId(BindIdGenerator),
Mark Muellerdfe37552016-07-07 14:47:42 -0600732 PipelineVertexInputStateCreateInfo(),
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600733 VulkanMemoryBuffer(aVulkanDevice, 1, static_cast<int>(aByteStride * aVertexCount),
734 reinterpret_cast<const void *>(aVerticies), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700735 BindIdGenerator++; // NB: This can wrap w/misuse
Mark Muellerdfe37552016-07-07 14:47:42 -0600736
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600737 VertexInputAttributeDescription = new VkVertexInputAttributeDescription[AttributeCount];
738 VertexInputBindingDescription = new VkVertexInputBindingDescription[BindingCount];
Mark Muellerdfe37552016-07-07 14:47:42 -0600739
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600740 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = VertexInputAttributeDescription;
741 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = AttributeCount;
742 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = VertexInputBindingDescription;
743 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = BindingCount;
744 PipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -0600745
746 unsigned i = 0;
747 do {
748 VertexInputAttributeDescription[i].binding = BindId;
749 VertexInputAttributeDescription[i].location = i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600750 VertexInputAttributeDescription[i].format = VK_FORMAT_R32G32B32_SFLOAT;
751 VertexInputAttributeDescription[i].offset = sizeof(float) * aByteStride;
Mark Muellerdfe37552016-07-07 14:47:42 -0600752 i++;
753 } while (AttributeCount < i);
754
755 i = 0;
756 do {
757 VertexInputBindingDescription[i].binding = BindId;
758 VertexInputBindingDescription[i].stride = aByteStride;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600759 VertexInputBindingDescription[i].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
Mark Muellerdfe37552016-07-07 14:47:42 -0600760 i++;
761 } while (BindingCount < i);
762 }
763
764 ~VkVerticesObj() {
765 if (VertexInputAttributeDescription) {
766 delete[] VertexInputAttributeDescription;
767 }
768 if (VertexInputBindingDescription) {
769 delete[] VertexInputBindingDescription;
770 }
771 }
772
773 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600774 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription, AttributeCount);
775 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription, BindingCount);
Mark Muellerdfe37552016-07-07 14:47:42 -0600776 return true;
777 }
778
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600779 void BindVertexBuffers(VkCommandBuffer aCommandBuffer, unsigned aOffsetCount = 0, VkDeviceSize *aOffsetList = nullptr) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600780 VkDeviceSize *offsetList;
781 unsigned offsetCount;
782
783 if (aOffsetCount) {
784 offsetList = aOffsetList;
785 offsetCount = aOffsetCount;
786 } else {
787 offsetList = new VkDeviceSize[1]();
788 offsetCount = 1;
789 }
790
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600791 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount, &VulkanMemoryBuffer.handle(), offsetList);
Mark Muellerdfe37552016-07-07 14:47:42 -0600792 BoundCurrent = true;
793
794 if (!aOffsetCount) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600795 delete[] offsetList;
Mark Muellerdfe37552016-07-07 14:47:42 -0600796 }
797 }
798
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700799 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600800 static uint32_t BindIdGenerator;
801
802 bool BoundCurrent;
803 unsigned AttributeCount;
804 unsigned BindingCount;
805 uint32_t BindId;
806
807 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
808 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
809 VkVertexInputBindingDescription *VertexInputBindingDescription;
810 VkConstantBufferObj VulkanMemoryBuffer;
811};
812
813uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500814// ********************************************************************************************************************
815// ********************************************************************************************************************
816// ********************************************************************************************************************
817// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600818TEST_F(VkLayerTest, RequiredParameter) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700819 TEST_DESCRIPTION(
820 "Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
821 "pointer, array, and array count parameters");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600822
Tony Barbour1fa09702017-03-16 12:09:08 -0600823 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600824
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600825 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pFeatures specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600826 // Specify NULL for a pointer to a handle
827 // Expected to trigger an error with
828 // parameter_validation::validate_required_pointer
829 vkGetPhysicalDeviceFeatures(gpu(), NULL);
830 m_errorMonitor->VerifyFound();
831
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600832 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
833 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600834 // Specify NULL for pointer to array count
835 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600836 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600837 m_errorMonitor->VerifyFound();
838
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600839 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter viewportCount must be greater than 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600840 // Specify 0 for a required array count
841 // Expected to trigger an error with parameter_validation::validate_array
842 VkViewport view_port = {};
843 m_commandBuffer->SetViewport(0, 0, &view_port);
844 m_errorMonitor->VerifyFound();
845
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pViewports specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600847 // Specify NULL for a required array
848 // Expected to trigger an error with parameter_validation::validate_array
849 m_commandBuffer->SetViewport(0, 1, NULL);
850 m_errorMonitor->VerifyFound();
851
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter memory specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600853 // Specify VK_NULL_HANDLE for a required handle
854 // Expected to trigger an error with
855 // parameter_validation::validate_required_handle
856 vkUnmapMemory(device(), VK_NULL_HANDLE);
857 m_errorMonitor->VerifyFound();
858
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600859 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
860 "required parameter pFences[0] specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600861 // Specify VK_NULL_HANDLE for a required handle array entry
862 // Expected to trigger an error with
863 // parameter_validation::validate_required_handle_array
864 VkFence fence = VK_NULL_HANDLE;
865 vkResetFences(device(), 1, &fence);
866 m_errorMonitor->VerifyFound();
867
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600868 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pAllocateInfo specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600869 // Specify NULL for a required struct pointer
870 // Expected to trigger an error with
871 // parameter_validation::validate_struct_type
872 VkDeviceMemory memory = VK_NULL_HANDLE;
873 vkAllocateMemory(device(), NULL, NULL, &memory);
874 m_errorMonitor->VerifyFound();
875
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600876 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of faceMask must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600877 // Specify 0 for a required VkFlags parameter
878 // Expected to trigger an error with parameter_validation::validate_flags
879 m_commandBuffer->SetStencilReference(0, 0);
880 m_errorMonitor->VerifyFound();
881
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600882 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of pSubmits[0].pWaitDstStageMask[0] must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600883 // Specify 0 for a required VkFlags array entry
884 // Expected to trigger an error with
885 // parameter_validation::validate_flags_array
886 VkSemaphore semaphore = VK_NULL_HANDLE;
887 VkPipelineStageFlags stageFlags = 0;
888 VkSubmitInfo submitInfo = {};
889 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
890 submitInfo.waitSemaphoreCount = 1;
891 submitInfo.pWaitSemaphores = &semaphore;
892 submitInfo.pWaitDstStageMask = &stageFlags;
893 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
894 m_errorMonitor->VerifyFound();
895}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600896
Dustin Gravesfce74c02016-05-10 11:42:58 -0600897TEST_F(VkLayerTest, ReservedParameter) {
898 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
899
Tony Barbour1fa09702017-03-16 12:09:08 -0600900 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -0600901
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600902 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must be 0");
Dustin Gravesfce74c02016-05-10 11:42:58 -0600903 // Specify 0 for a reserved VkFlags parameter
904 // Expected to trigger an error with
905 // parameter_validation::validate_reserved_flags
906 VkEvent event_handle = VK_NULL_HANDLE;
907 VkEventCreateInfo event_info = {};
908 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
909 event_info.flags = 1;
910 vkCreateEvent(device(), &event_info, NULL, &event_handle);
911 m_errorMonitor->VerifyFound();
912}
913
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600914TEST_F(VkLayerTest, InvalidStructSType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700915 TEST_DESCRIPTION(
916 "Specify an invalid VkStructureType for a Vulkan "
917 "structure's sType field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600918
Tony Barbour1fa09702017-03-16 12:09:08 -0600919 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600920
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600921 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pAllocateInfo->sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600922 // Zero struct memory, effectively setting sType to
923 // VK_STRUCTURE_TYPE_APPLICATION_INFO
924 // Expected to trigger an error with
925 // parameter_validation::validate_struct_type
926 VkMemoryAllocateInfo alloc_info = {};
927 VkDeviceMemory memory = VK_NULL_HANDLE;
928 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
929 m_errorMonitor->VerifyFound();
930
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600931 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pSubmits[0].sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600932 // Zero struct memory, effectively setting sType to
933 // VK_STRUCTURE_TYPE_APPLICATION_INFO
934 // Expected to trigger an error with
935 // parameter_validation::validate_struct_type_array
936 VkSubmitInfo submit_info = {};
937 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
938 m_errorMonitor->VerifyFound();
939}
940
941TEST_F(VkLayerTest, InvalidStructPNext) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600942 TEST_DESCRIPTION("Specify an invalid value for a Vulkan structure's pNext field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600943
Tony Barbour1fa09702017-03-16 12:09:08 -0600944 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600945
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "value of pCreateInfo->pNext must be NULL");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600947 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be NULL.
Karl Schultz38b50992016-07-11 16:09:09 -0600948 // Need to pick a function that has no allowed pNext structure types.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600949 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Karl Schultz38b50992016-07-11 16:09:09 -0600950 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600951 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600952 // Zero-initialization will provide the correct sType
953 VkApplicationInfo app_info = {};
954 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
955 event_alloc_info.pNext = &app_info;
956 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
957 m_errorMonitor->VerifyFound();
958
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600959 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
960 " chain includes a structure with unexpected VkStructureType ");
Karl Schultz38b50992016-07-11 16:09:09 -0600961 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
962 // a function that has allowed pNext structure types and specify
963 // a structure type that is not allowed.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600964 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600965 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -0600966 VkMemoryAllocateInfo memory_alloc_info = {};
967 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
968 memory_alloc_info.pNext = &app_info;
969 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600970 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600971}
Dustin Graves5d33d532016-05-09 16:21:12 -0600972
973TEST_F(VkLayerTest, UnrecognizedValue) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600974 TEST_DESCRIPTION("Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
Dustin Graves5d33d532016-05-09 16:21:12 -0600975
Tony Barbour1fa09702017-03-16 12:09:08 -0600976 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Graves5d33d532016-05-09 16:21:12 -0600977
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700978 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
979 "does not fall within the begin..end "
980 "range of the core VkFormat "
981 "enumeration tokens");
Dustin Graves5d33d532016-05-09 16:21:12 -0600982 // Specify an invalid VkFormat value
983 // Expected to trigger an error with
984 // parameter_validation::validate_ranged_enum
985 VkFormatProperties format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600986 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000), &format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -0600987 m_errorMonitor->VerifyFound();
988
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -0600990 // Specify an invalid VkFlags bitmask value
991 // Expected to trigger an error with parameter_validation::validate_flags
992 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600993 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
994 static_cast<VkImageUsageFlags>(1 << 25), 0, &image_format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -0600995 m_errorMonitor->VerifyFound();
996
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600997 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -0600998 // Specify an invalid VkFlags array entry
999 // Expected to trigger an error with
1000 // parameter_validation::validate_flags_array
1001 VkSemaphore semaphore = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001002 VkPipelineStageFlags stage_flags = static_cast<VkPipelineStageFlags>(1 << 25);
Dustin Graves5d33d532016-05-09 16:21:12 -06001003 VkSubmitInfo submit_info = {};
1004 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1005 submit_info.waitSemaphoreCount = 1;
1006 submit_info.pWaitSemaphores = &semaphore;
1007 submit_info.pWaitDstStageMask = &stage_flags;
1008 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1009 m_errorMonitor->VerifyFound();
1010
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is neither VK_TRUE nor VK_FALSE");
Dustin Graves5d33d532016-05-09 16:21:12 -06001012 // Specify an invalid VkBool32 value
1013 // Expected to trigger a warning with
1014 // parameter_validation::validate_bool32
1015 VkSampler sampler = VK_NULL_HANDLE;
1016 VkSamplerCreateInfo sampler_info = {};
1017 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1018 sampler_info.pNext = NULL;
1019 sampler_info.magFilter = VK_FILTER_NEAREST;
1020 sampler_info.minFilter = VK_FILTER_NEAREST;
1021 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1022 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1023 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1024 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1025 sampler_info.mipLodBias = 1.0;
1026 sampler_info.maxAnisotropy = 1;
1027 sampler_info.compareEnable = VK_FALSE;
1028 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1029 sampler_info.minLod = 1.0;
1030 sampler_info.maxLod = 1.0;
1031 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1032 sampler_info.unnormalizedCoordinates = VK_FALSE;
1033 // Not VK_TRUE or VK_FALSE
1034 sampler_info.anisotropyEnable = 3;
1035 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1036 m_errorMonitor->VerifyFound();
1037}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001038
1039TEST_F(VkLayerTest, FailedReturnValue) {
1040 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1041
Tony Barbour1fa09702017-03-16 12:09:08 -06001042 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -06001043
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001044 // Find an unsupported image format
1045 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1046 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1047 VkFormat format = static_cast<VkFormat>(f);
1048 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001049 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001050 unsupported = format;
1051 break;
1052 }
1053 }
1054
1055 if (unsupported != VK_FORMAT_UNDEFINED) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001056 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1057 "the requested format is not supported on this device");
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001058 // Specify an unsupported VkFormat value to generate a
1059 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1060 // Expected to trigger a warning from
1061 // parameter_validation::validate_result
1062 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001063 VkResult err = vkGetPhysicalDeviceImageFormatProperties(gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1064 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001065 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1066 m_errorMonitor->VerifyFound();
1067 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001068}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001069
1070TEST_F(VkLayerTest, UpdateBufferAlignment) {
1071 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001072 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001073
Tony Barbour1fa09702017-03-16 12:09:08 -06001074 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001075
1076 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1077 vk_testing::Buffer buffer;
1078 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1079
Tony Barbour552f6c02016-12-21 14:34:07 -07001080 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001081 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001082 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001083 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1084 m_errorMonitor->VerifyFound();
1085
1086 // Introduce failure by using dataSize that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001087 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001088 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1089 m_errorMonitor->VerifyFound();
1090
1091 // Introduce failure by using dataSize that is < 0
1092 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001093 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001094 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1095 m_errorMonitor->VerifyFound();
1096
1097 // Introduce failure by using dataSize that is > 65536
1098 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001099 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001100 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1101 m_errorMonitor->VerifyFound();
1102
Tony Barbour552f6c02016-12-21 14:34:07 -07001103 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001104}
1105
1106TEST_F(VkLayerTest, FillBufferAlignment) {
1107 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1108
Tony Barbour1fa09702017-03-16 12:09:08 -06001109 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001110
1111 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1112 vk_testing::Buffer buffer;
1113 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1114
Tony Barbour552f6c02016-12-21 14:34:07 -07001115 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001116
1117 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001119 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1120 m_errorMonitor->VerifyFound();
1121
1122 // Introduce failure by using size that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001123 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001124 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1125 m_errorMonitor->VerifyFound();
1126
1127 // Introduce failure by using size that is zero
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001128 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be greater than zero");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001129 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1130 m_errorMonitor->VerifyFound();
1131
Tony Barbour552f6c02016-12-21 14:34:07 -07001132 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001133}
Dustin Graves40f35822016-06-23 11:12:53 -06001134
Cortd889ff92016-07-27 09:51:27 -07001135TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1136 VkResult err;
1137
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001138 TEST_DESCRIPTION(
1139 "Attempt to use a non-solid polygon fill mode in a "
1140 "pipeline when this feature is not enabled.");
Cortd889ff92016-07-27 09:51:27 -07001141
Tony Barbour1fa09702017-03-16 12:09:08 -06001142 ASSERT_NO_FATAL_FAILURE(Init());
Cortd889ff92016-07-27 09:51:27 -07001143 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1144
1145 std::vector<const char *> device_extension_names;
1146 auto features = m_device->phy().features();
1147 // Artificially disable support for non-solid fill modes
1148 features.fillModeNonSolid = false;
1149 // The sacrificial device object
1150 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1151
1152 VkRenderpassObj render_pass(&test_device);
1153
1154 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1155 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1156 pipeline_layout_ci.setLayoutCount = 0;
1157 pipeline_layout_ci.pSetLayouts = NULL;
1158
1159 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001160 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Cortd889ff92016-07-27 09:51:27 -07001161 ASSERT_VK_SUCCESS(err);
1162
1163 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1164 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1165 rs_ci.pNext = nullptr;
1166 rs_ci.lineWidth = 1.0f;
1167 rs_ci.rasterizerDiscardEnable = true;
1168
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001169 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1170 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Cortd889ff92016-07-27 09:51:27 -07001171
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001172 // Set polygonMode to unsupported value POINT, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001173 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1174 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001175 {
1176 VkPipelineObj pipe(&test_device);
1177 pipe.AddShader(&vs);
1178 pipe.AddShader(&fs);
1179 pipe.AddColorAttachment();
1180 // Introduce failure by setting unsupported polygon mode
1181 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1182 pipe.SetRasterization(&rs_ci);
1183 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1184 }
1185 m_errorMonitor->VerifyFound();
1186
1187 // Try again with polygonMode=LINE, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1189 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001190 {
1191 VkPipelineObj pipe(&test_device);
1192 pipe.AddShader(&vs);
1193 pipe.AddShader(&fs);
1194 pipe.AddColorAttachment();
1195 // Introduce failure by setting unsupported polygon mode
1196 rs_ci.polygonMode = VK_POLYGON_MODE_LINE;
1197 pipe.SetRasterization(&rs_ci);
1198 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1199 }
1200 m_errorMonitor->VerifyFound();
1201
Cortd889ff92016-07-27 09:51:27 -07001202 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1203}
1204
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001205#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001206TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001207{
1208 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001209 VkFenceCreateInfo fenceInfo = {};
1210 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1211 fenceInfo.pNext = NULL;
1212 fenceInfo.flags = 0;
1213
Mike Weiblencce7ec72016-10-17 19:33:05 -06001214 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001215
Tony Barbour1fa09702017-03-16 12:09:08 -06001216 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001217
1218 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1219 vk_testing::Buffer buffer;
1220 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001221
Tony Barbourfe3351b2015-07-28 10:17:20 -06001222 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001223 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001224 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001225
1226 testFence.init(*m_device, fenceInfo);
1227
1228 // Bypass framework since it does the waits automatically
1229 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001230 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001231 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1232 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001233 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001234 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001235 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001236 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001237 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001238 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001239 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001240
1241 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001242 ASSERT_VK_SUCCESS( err );
1243
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001244 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001245 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001246
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001247 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001248}
1249
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001250TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001251{
1252 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001253 VkFenceCreateInfo fenceInfo = {};
1254 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1255 fenceInfo.pNext = NULL;
1256 fenceInfo.flags = 0;
1257
Mike Weiblencce7ec72016-10-17 19:33:05 -06001258 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001259
Tony Barbour1fa09702017-03-16 12:09:08 -06001260 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001261 ASSERT_NO_FATAL_FAILURE(InitViewport());
1262 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1263
Tony Barbourfe3351b2015-07-28 10:17:20 -06001264 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001265 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001266 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001267
1268 testFence.init(*m_device, fenceInfo);
1269
1270 // Bypass framework since it does the waits automatically
1271 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001272 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001273 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1274 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001275 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001276 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001277 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001278 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001279 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001280 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001281 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001282
1283 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001284 ASSERT_VK_SUCCESS( err );
1285
Jon Ashburnf19916e2016-01-11 13:12:43 -07001286 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001287 VkCommandBufferBeginInfo info = {};
1288 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1289 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001290 info.renderPass = VK_NULL_HANDLE;
1291 info.subpass = 0;
1292 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001293 info.occlusionQueryEnable = VK_FALSE;
1294 info.queryFlags = 0;
1295 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001296
1297 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001298 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001299
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001300 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001301}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001302#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001303
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001304TEST_F(VkLayerTest, SparseBindingImageBufferCreate) {
1305 TEST_DESCRIPTION("Create buffer/image with sparse attributes but without the sparse_binding bit set");
1306
Tony Barbour1fa09702017-03-16 12:09:08 -06001307 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001308
1309 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00669);
1310 VkBuffer buffer;
1311 VkBufferCreateInfo buf_info = {};
1312 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1313 buf_info.pNext = NULL;
1314 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
1315 buf_info.size = 2048;
1316 buf_info.queueFamilyIndexCount = 0;
1317 buf_info.pQueueFamilyIndices = NULL;
1318 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1319 buf_info.flags = VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
1320 vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1321 m_errorMonitor->VerifyFound();
1322
1323 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02160);
1324 VkImage image;
1325 VkImageCreateInfo image_create_info = {};
1326 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1327 image_create_info.pNext = NULL;
1328 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1329 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1330 image_create_info.extent.width = 512;
1331 image_create_info.extent.height = 64;
1332 image_create_info.extent.depth = 1;
1333 image_create_info.mipLevels = 1;
1334 image_create_info.arrayLayers = 1;
1335 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1336 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1337 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1338 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1339 image_create_info.queueFamilyIndexCount = 0;
1340 image_create_info.pQueueFamilyIndices = NULL;
1341 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1342 image_create_info.flags = VK_BUFFER_CREATE_SPARSE_ALIASED_BIT;
1343 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1344 m_errorMonitor->VerifyFound();
1345}
1346
Dave Houlton829c0d82017-01-24 15:09:17 -07001347TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedTypes) {
1348 TEST_DESCRIPTION("Create images with sparse residency with unsupported types");
Tony Barbour1fa09702017-03-16 12:09:08 -06001349 ASSERT_NO_FATAL_FAILURE(InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton829c0d82017-01-24 15:09:17 -07001350
1351 // Determine which device feature are available
Jamie Madill35127872017-03-15 16:17:46 -04001352 VkPhysicalDeviceFeatures available_features = {};
Dave Houlton829c0d82017-01-24 15:09:17 -07001353 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&available_features));
1354
1355 // Mask out device features we don't want
1356 VkPhysicalDeviceFeatures desired_features = available_features;
1357 desired_features.sparseResidencyImage2D = VK_FALSE;
1358 desired_features.sparseResidencyImage3D = VK_FALSE;
Mark Lobodzinski77e590c2017-03-17 12:05:16 -06001359 ASSERT_NO_FATAL_FAILURE(Init(&desired_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001360
1361 VkImage image = VK_NULL_HANDLE;
1362 VkResult result = VK_RESULT_MAX_ENUM;
1363 VkImageCreateInfo image_create_info = {};
1364 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1365 image_create_info.pNext = NULL;
1366 image_create_info.imageType = VK_IMAGE_TYPE_1D;
1367 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1368 image_create_info.extent.width = 512;
1369 image_create_info.extent.height = 1;
1370 image_create_info.extent.depth = 1;
1371 image_create_info.mipLevels = 1;
1372 image_create_info.arrayLayers = 1;
1373 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1374 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1375 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1376 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1377 image_create_info.queueFamilyIndexCount = 0;
1378 image_create_info.pQueueFamilyIndices = NULL;
1379 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1380 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1381
1382 // 1D image w/ sparse residency is an error
1383 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02352);
1384 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1385 m_errorMonitor->VerifyFound();
1386 if (VK_SUCCESS == result) {
1387 vkDestroyImage(m_device->device(), image, NULL);
1388 image = VK_NULL_HANDLE;
1389 }
1390
1391 // 2D image w/ sparse residency when feature isn't available
1392 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1393 image_create_info.extent.height = 64;
1394 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02144);
1395 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1396 m_errorMonitor->VerifyFound();
1397 if (VK_SUCCESS == result) {
1398 vkDestroyImage(m_device->device(), image, NULL);
1399 image = VK_NULL_HANDLE;
1400 }
1401
1402 // 3D image w/ sparse residency when feature isn't available
1403 image_create_info.imageType = VK_IMAGE_TYPE_3D;
1404 image_create_info.extent.depth = 8;
1405 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02145);
1406 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1407 m_errorMonitor->VerifyFound();
1408 if (VK_SUCCESS == result) {
1409 vkDestroyImage(m_device->device(), image, NULL);
1410 image = VK_NULL_HANDLE;
1411 }
1412}
1413
1414TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedSamples) {
1415 TEST_DESCRIPTION("Create images with sparse residency with unsupported tiling or sample counts");
Tony Barbour1fa09702017-03-16 12:09:08 -06001416 ASSERT_NO_FATAL_FAILURE(InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton829c0d82017-01-24 15:09:17 -07001417
1418 // Determine which device feature are available
Jamie Madill35127872017-03-15 16:17:46 -04001419 VkPhysicalDeviceFeatures available_features = {};
Dave Houlton829c0d82017-01-24 15:09:17 -07001420 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&available_features));
1421
1422 // These tests all require that the device support sparse residency for 2D images
1423 if (VK_TRUE != available_features.sparseResidencyImage2D) {
1424 return;
1425 }
1426
1427 // Mask out device features we don't want
1428 VkPhysicalDeviceFeatures desired_features = available_features;
1429 desired_features.sparseResidency2Samples = VK_FALSE;
1430 desired_features.sparseResidency4Samples = VK_FALSE;
1431 desired_features.sparseResidency8Samples = VK_FALSE;
1432 desired_features.sparseResidency16Samples = VK_FALSE;
Mark Lobodzinski77e590c2017-03-17 12:05:16 -06001433 ASSERT_NO_FATAL_FAILURE(Init(&desired_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001434
1435 VkImage image = VK_NULL_HANDLE;
1436 VkResult result = VK_RESULT_MAX_ENUM;
1437 VkImageCreateInfo image_create_info = {};
1438 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1439 image_create_info.pNext = NULL;
1440 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1441 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1442 image_create_info.extent.width = 64;
1443 image_create_info.extent.height = 64;
1444 image_create_info.extent.depth = 1;
1445 image_create_info.mipLevels = 1;
1446 image_create_info.arrayLayers = 1;
1447 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1448 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1449 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1450 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1451 image_create_info.queueFamilyIndexCount = 0;
1452 image_create_info.pQueueFamilyIndices = NULL;
1453 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1454 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1455
1456 // 2D image w/ sparse residency and linear tiling is an error
1457 m_errorMonitor->SetDesiredFailureMsg(
1458 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1459 "VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT then image tiling of VK_IMAGE_TILING_LINEAR is not supported");
1460 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1461 m_errorMonitor->VerifyFound();
1462 if (VK_SUCCESS == result) {
1463 vkDestroyImage(m_device->device(), image, NULL);
1464 image = VK_NULL_HANDLE;
1465 }
1466 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1467
1468 // Multi-sample image w/ sparse residency when feature isn't available (4 flavors)
1469 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
1470 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02146);
1471 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1472 m_errorMonitor->VerifyFound();
1473 if (VK_SUCCESS == result) {
1474 vkDestroyImage(m_device->device(), image, NULL);
1475 image = VK_NULL_HANDLE;
1476 }
1477
1478 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
1479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02147);
1480 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1481 m_errorMonitor->VerifyFound();
1482 if (VK_SUCCESS == result) {
1483 vkDestroyImage(m_device->device(), image, NULL);
1484 image = VK_NULL_HANDLE;
1485 }
1486
1487 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
1488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02148);
1489 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1490 m_errorMonitor->VerifyFound();
1491 if (VK_SUCCESS == result) {
1492 vkDestroyImage(m_device->device(), image, NULL);
1493 image = VK_NULL_HANDLE;
1494 }
1495
1496 image_create_info.samples = VK_SAMPLE_COUNT_16_BIT;
1497 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02149);
1498 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1499 m_errorMonitor->VerifyFound();
1500 if (VK_SUCCESS == result) {
1501 vkDestroyImage(m_device->device(), image, NULL);
1502 image = VK_NULL_HANDLE;
1503 }
1504}
1505
Tobin Ehlisf11be982016-05-11 13:52:53 -06001506TEST_F(VkLayerTest, InvalidMemoryAliasing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001507 TEST_DESCRIPTION(
1508 "Create a buffer and image, allocate memory, and bind the "
1509 "buffer and image to memory such that they will alias.");
Tobin Ehlisf11be982016-05-11 13:52:53 -06001510 VkResult err;
1511 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001512 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf11be982016-05-11 13:52:53 -06001513
Tobin Ehlis077ded32016-05-12 17:39:13 -06001514 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001515 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001516 VkImage image2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001517 VkDeviceMemory mem; // buffer will be bound first
1518 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001519 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Rene Lindsayd14f5572016-12-16 14:57:18 -07001520 VkMemoryRequirements buff_mem_reqs2, img_mem_reqs2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001521
1522 VkBufferCreateInfo buf_info = {};
1523 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1524 buf_info.pNext = NULL;
1525 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1526 buf_info.size = 256;
1527 buf_info.queueFamilyIndexCount = 0;
1528 buf_info.pQueueFamilyIndices = NULL;
1529 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1530 buf_info.flags = 0;
1531 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1532 ASSERT_VK_SUCCESS(err);
1533
Tobin Ehlis077ded32016-05-12 17:39:13 -06001534 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001535
1536 VkImageCreateInfo image_create_info = {};
1537 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1538 image_create_info.pNext = NULL;
1539 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1540 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1541 image_create_info.extent.width = 64;
1542 image_create_info.extent.height = 64;
1543 image_create_info.extent.depth = 1;
1544 image_create_info.mipLevels = 1;
1545 image_create_info.arrayLayers = 1;
1546 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001547 // Image tiling must be optimal to trigger error when aliasing linear buffer
1548 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001549 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1550 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1551 image_create_info.queueFamilyIndexCount = 0;
1552 image_create_info.pQueueFamilyIndices = NULL;
1553 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1554 image_create_info.flags = 0;
1555
Tobin Ehlisf11be982016-05-11 13:52:53 -06001556 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1557 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001558 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
1559 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001560
Tobin Ehlis077ded32016-05-12 17:39:13 -06001561 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1562
1563 VkMemoryAllocateInfo alloc_info = {};
1564 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1565 alloc_info.pNext = NULL;
1566 alloc_info.memoryTypeIndex = 0;
1567 // Ensure memory is big enough for both bindings
1568 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001569 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1570 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001571 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001572 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001573 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinskid2d2d4c2017-02-16 11:51:58 -07001574 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001575 return;
1576 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001577 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1578 ASSERT_VK_SUCCESS(err);
1579 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1580 ASSERT_VK_SUCCESS(err);
1581
Rene Lindsayd14f5572016-12-16 14:57:18 -07001582 vkGetImageMemoryRequirements(m_device->device(), image2, &img_mem_reqs2);
1583
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001584 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001585 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001586 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1587 m_errorMonitor->VerifyFound();
1588
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001589 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001590 // aliasing buffer2
1591 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1592 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001593 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1594 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001595 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001596 ASSERT_VK_SUCCESS(err);
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001597 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is aliased with non-linear image 0x");
Rene Lindsayd14f5572016-12-16 14:57:18 -07001598 vkGetBufferMemoryRequirements(m_device->device(), buffer2, &buff_mem_reqs2);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001599 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001600 m_errorMonitor->VerifyFound();
1601
1602 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001603 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001604 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001605 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001606 vkFreeMemory(m_device->device(), mem, NULL);
1607 vkFreeMemory(m_device->device(), mem_img, NULL);
1608}
1609
Tobin Ehlis35372522016-05-12 08:32:31 -06001610TEST_F(VkLayerTest, InvalidMemoryMapping) {
1611 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1612 VkResult err;
1613 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001614 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis35372522016-05-12 08:32:31 -06001615
1616 VkBuffer buffer;
1617 VkDeviceMemory mem;
1618 VkMemoryRequirements mem_reqs;
1619
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001620 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
1621
Tobin Ehlis35372522016-05-12 08:32:31 -06001622 VkBufferCreateInfo buf_info = {};
1623 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1624 buf_info.pNext = NULL;
1625 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1626 buf_info.size = 256;
1627 buf_info.queueFamilyIndexCount = 0;
1628 buf_info.pQueueFamilyIndices = NULL;
1629 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1630 buf_info.flags = 0;
1631 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1632 ASSERT_VK_SUCCESS(err);
1633
1634 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1635 VkMemoryAllocateInfo alloc_info = {};
1636 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1637 alloc_info.pNext = NULL;
1638 alloc_info.memoryTypeIndex = 0;
1639
1640 // Ensure memory is big enough for both bindings
1641 static const VkDeviceSize allocation_size = 0x10000;
1642 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001643 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001644 if (!pass) {
1645 vkDestroyBuffer(m_device->device(), buffer, NULL);
1646 return;
1647 }
1648 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1649 ASSERT_VK_SUCCESS(err);
1650
1651 uint8_t *pData;
1652 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VkMapMemory: Attempting to map memory range of size zero");
Tobin Ehlis35372522016-05-12 08:32:31 -06001654 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1655 m_errorMonitor->VerifyFound();
1656 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001657 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001658 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001659 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1660 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1661 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001662 m_errorMonitor->VerifyFound();
1663
1664 // Unmap the memory to avoid re-map error
1665 vkUnmapMemory(m_device->device(), mem);
1666 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001667 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1668 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1669 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001670 m_errorMonitor->VerifyFound();
1671 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001672 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
1673 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001674 m_errorMonitor->VerifyFound();
1675 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001676 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06001677 vkUnmapMemory(m_device->device(), mem);
1678 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001679
Tobin Ehlis35372522016-05-12 08:32:31 -06001680 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001681 err = vkMapMemory(m_device->device(), mem, 4 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001682 ASSERT_VK_SUCCESS(err);
1683 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001684 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001685 mmr.memory = mem;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001686 mmr.offset = atom_size; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001687 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
Tobin Ehlis35372522016-05-12 08:32:31 -06001688 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1689 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001690
Tobin Ehlis35372522016-05-12 08:32:31 -06001691 // Now flush range that oversteps mapped range
1692 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001693 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001694 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001695 mmr.offset = atom_size;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001696 mmr.size = 4 * atom_size; // Flushing bounds exceed mapped bounds
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001697 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
1698 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1699 m_errorMonitor->VerifyFound();
1700
1701 // Now flush range with VK_WHOLE_SIZE that oversteps offset
1702 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001703 err = vkMapMemory(m_device->device(), mem, 2 * atom_size, 4 * atom_size, 0, (void **)&pData);
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001704 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001705 mmr.offset = atom_size;
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001706 mmr.size = VK_WHOLE_SIZE;
1707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00643);
Tobin Ehlis35372522016-05-12 08:32:31 -06001708 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1709 m_errorMonitor->VerifyFound();
1710
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001711#if 0 // Planning discussion with working group on this validation check.
Mark Lobodzinski3826a4f2016-11-15 09:38:51 -07001712 // Some platforms have an atomsize of 1 which makes the test meaningless
1713 if (atom_size > 3) {
1714 // Now with an offset NOT a multiple of the device limit
1715 vkUnmapMemory(m_device->device(), mem);
1716 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1717 ASSERT_VK_SUCCESS(err);
1718 mmr.offset = 3; // Not a multiple of atom_size
1719 mmr.size = VK_WHOLE_SIZE;
1720 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00644);
1721 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1722 m_errorMonitor->VerifyFound();
1723
1724 // Now with a size NOT a multiple of the device limit
1725 vkUnmapMemory(m_device->device(), mem);
1726 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1727 ASSERT_VK_SUCCESS(err);
1728 mmr.offset = atom_size;
1729 mmr.size = 2 * atom_size + 1; // Not a multiple of atom_size
1730 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00645);
1731 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1732 m_errorMonitor->VerifyFound();
1733 }
Tony Barboure3975eb2016-12-15 14:52:44 -07001734#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001735 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1736 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001737 if (!pass) {
1738 vkFreeMemory(m_device->device(), mem, NULL);
1739 vkDestroyBuffer(m_device->device(), buffer, NULL);
1740 return;
1741 }
1742 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1743 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1744
1745 vkDestroyBuffer(m_device->device(), buffer, NULL);
1746 vkFreeMemory(m_device->device(), mem, NULL);
1747}
1748
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001749#if 0 // disabled until PV gets real extension enable checks
Ian Elliott1c32c772016-04-28 14:47:13 -06001750TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1751 VkResult err;
1752 bool pass;
1753
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001754 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
1755 // following declaration (which is temporarily being moved below):
1756 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001757 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001758 VkSwapchainCreateInfoKHR swapchain_create_info = {VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR};
Ian Elliott1c32c772016-04-28 14:47:13 -06001759 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001760 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06001761 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001762 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001763
Tony Barbour1fa09702017-03-16 12:09:08 -06001764 ASSERT_NO_FATAL_FAILURE(Init());
Ian Elliott1c32c772016-04-28 14:47:13 -06001765
Ian Elliott3f06ce52016-04-29 14:46:21 -06001766#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1767#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1768 // Use the functions from the VK_KHR_android_surface extension without
1769 // enabling that extension:
1770
1771 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001772 VkAndroidSurfaceCreateInfoKHR android_create_info = {VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001773 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1774 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001775 pass = (err != VK_SUCCESS);
1776 ASSERT_TRUE(pass);
1777 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001778#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001779
Ian Elliott3f06ce52016-04-29 14:46:21 -06001780#if defined(VK_USE_PLATFORM_MIR_KHR)
1781 // Use the functions from the VK_KHR_mir_surface extension without enabling
1782 // that extension:
1783
1784 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001785 VkMirSurfaceCreateInfoKHR mir_create_info = {VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001786 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001787 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1788 pass = (err != VK_SUCCESS);
1789 ASSERT_TRUE(pass);
1790 m_errorMonitor->VerifyFound();
1791
1792 // Tell whether an mir_connection supports presentation:
1793 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001794 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1795 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001796 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001797#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001798
Ian Elliott3f06ce52016-04-29 14:46:21 -06001799#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1800 // Use the functions from the VK_KHR_wayland_surface extension without
1801 // enabling that extension:
1802
1803 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001804 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1806 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001807 pass = (err != VK_SUCCESS);
1808 ASSERT_TRUE(pass);
1809 m_errorMonitor->VerifyFound();
1810
1811 // Tell whether an wayland_display supports presentation:
1812 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001813 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1814 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001815 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001816#endif // VK_USE_PLATFORM_WAYLAND_KHR
1817#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001818
Ian Elliott3f06ce52016-04-29 14:46:21 -06001819#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001820 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1821 // TO NON-LINUX PLATFORMS:
1822 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001823 // Use the functions from the VK_KHR_win32_surface extension without
1824 // enabling that extension:
1825
1826 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001827 VkWin32SurfaceCreateInfoKHR win32_create_info = {VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001828 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1829 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001830 pass = (err != VK_SUCCESS);
1831 ASSERT_TRUE(pass);
1832 m_errorMonitor->VerifyFound();
1833
1834 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001835 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001836 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001837 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001838// Set this (for now, until all platforms are supported and tested):
1839#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001840#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001841#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001842 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1843 // TO NON-LINUX PLATFORMS:
1844 VkSurfaceKHR surface = VK_NULL_HANDLE;
Tony Barbour2e7bd402016-11-14 14:46:33 -07001845#endif
1846#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott1c32c772016-04-28 14:47:13 -06001847 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1848 // that extension:
1849
1850 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001851 VkXcbSurfaceCreateInfoKHR xcb_create_info = {VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001853 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1854 pass = (err != VK_SUCCESS);
1855 ASSERT_TRUE(pass);
1856 m_errorMonitor->VerifyFound();
1857
1858 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001859 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001860 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001861 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1862 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06001863 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001864// Set this (for now, until all platforms are supported and tested):
1865#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001866#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott1c32c772016-04-28 14:47:13 -06001867
Ian Elliott12630812016-04-29 14:35:43 -06001868#if defined(VK_USE_PLATFORM_XLIB_KHR)
1869 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1870 // that extension:
1871
1872 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001873 VkXlibSurfaceCreateInfoKHR xlib_create_info = {VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001875 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1876 pass = (err != VK_SUCCESS);
1877 ASSERT_TRUE(pass);
1878 m_errorMonitor->VerifyFound();
1879
1880 // Tell whether an Xlib VisualID supports presentation:
1881 Display *dpy = NULL;
1882 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001884 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1885 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001886// Set this (for now, until all platforms are supported and tested):
1887#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001888#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott12630812016-04-29 14:35:43 -06001889
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001890// Use the functions from the VK_KHR_surface extension without enabling
1891// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001892
Ian Elliott489eec02016-05-05 14:12:44 -06001893#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001894 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001895 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001896 vkDestroySurfaceKHR(instance(), surface, NULL);
1897 m_errorMonitor->VerifyFound();
1898
1899 // Check if surface supports presentation:
1900 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001901 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001902 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1903 pass = (err != VK_SUCCESS);
1904 ASSERT_TRUE(pass);
1905 m_errorMonitor->VerifyFound();
1906
1907 // Check surface capabilities:
1908 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1910 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06001911 pass = (err != VK_SUCCESS);
1912 ASSERT_TRUE(pass);
1913 m_errorMonitor->VerifyFound();
1914
1915 // Check surface formats:
1916 uint32_t format_count = 0;
1917 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001918 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1919 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06001920 pass = (err != VK_SUCCESS);
1921 ASSERT_TRUE(pass);
1922 m_errorMonitor->VerifyFound();
1923
1924 // Check surface present modes:
1925 uint32_t present_mode_count = 0;
1926 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001927 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1928 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06001929 pass = (err != VK_SUCCESS);
1930 ASSERT_TRUE(pass);
1931 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001932#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001933
Ian Elliott1c32c772016-04-28 14:47:13 -06001934 // Use the functions from the VK_KHR_swapchain extension without enabling
1935 // that extension:
1936
1937 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001939 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1940 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001941 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06001942 pass = (err != VK_SUCCESS);
1943 ASSERT_TRUE(pass);
1944 m_errorMonitor->VerifyFound();
1945
1946 // Get the images from the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1948 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06001949 pass = (err != VK_SUCCESS);
1950 ASSERT_TRUE(pass);
1951 m_errorMonitor->VerifyFound();
1952
Chris Forbeseb7d5502016-09-13 18:19:21 +12001953 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
1954 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
1955 VkFence fence;
1956 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
1957
Ian Elliott1c32c772016-04-28 14:47:13 -06001958 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001959 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12001960 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06001961 pass = (err != VK_SUCCESS);
1962 ASSERT_TRUE(pass);
1963 m_errorMonitor->VerifyFound();
1964
Chris Forbeseb7d5502016-09-13 18:19:21 +12001965 vkDestroyFence(m_device->device(), fence, nullptr);
1966
Ian Elliott1c32c772016-04-28 14:47:13 -06001967 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001968 //
1969 // NOTE: Currently can't test this because a real swapchain is needed (as
1970 // opposed to the fake one we created) in order for the layer to lookup the
1971 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001972
1973 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001975 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1976 m_errorMonitor->VerifyFound();
1977}
Chris Forbes09368e42016-10-13 11:59:22 +13001978#endif
Ian Elliott1c32c772016-04-28 14:47:13 -06001979
Karl Schultz6addd812016-02-02 17:17:23 -07001980TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1981 VkResult err;
1982 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001983
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001984 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1985 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001986
Tony Barbour1fa09702017-03-16 12:09:08 -06001987 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001988
1989 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001990 VkImage image;
1991 VkDeviceMemory mem;
1992 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001993
Karl Schultz6addd812016-02-02 17:17:23 -07001994 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1995 const int32_t tex_width = 32;
1996 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001997
Tony Barboureb254902015-07-15 12:50:33 -06001998 VkImageCreateInfo image_create_info = {};
1999 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002000 image_create_info.pNext = NULL;
2001 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2002 image_create_info.format = tex_format;
2003 image_create_info.extent.width = tex_width;
2004 image_create_info.extent.height = tex_height;
2005 image_create_info.extent.depth = 1;
2006 image_create_info.mipLevels = 1;
2007 image_create_info.arrayLayers = 1;
2008 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2009 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2010 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2011 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12002012 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002013
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002014 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002015 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002016 mem_alloc.pNext = NULL;
2017 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002018
Chia-I Wuf7458c52015-10-26 21:10:41 +08002019 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002020 ASSERT_VK_SUCCESS(err);
2021
Karl Schultz6addd812016-02-02 17:17:23 -07002022 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002023
Mark Lobodzinski23065352015-05-29 09:32:35 -05002024 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002025
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002026 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002027 if (!pass) { // If we can't find any unmappable memory this test doesn't
2028 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002029 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002030 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002031 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002032
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002033 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002034 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002035 ASSERT_VK_SUCCESS(err);
2036
2037 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002038 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002039 ASSERT_VK_SUCCESS(err);
2040
2041 // Map memory as if to initialize the image
2042 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002043 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002044
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002045 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002046
Chia-I Wuf7458c52015-10-26 21:10:41 +08002047 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002048 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002049}
2050
Karl Schultz6addd812016-02-02 17:17:23 -07002051TEST_F(VkLayerTest, RebindMemory) {
2052 VkResult err;
2053 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002054
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002055 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002056
Tony Barbour1fa09702017-03-16 12:09:08 -06002057 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002058
2059 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002060 VkImage image;
2061 VkDeviceMemory mem1;
2062 VkDeviceMemory mem2;
2063 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002064
Karl Schultz6addd812016-02-02 17:17:23 -07002065 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2066 const int32_t tex_width = 32;
2067 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002068
Tony Barboureb254902015-07-15 12:50:33 -06002069 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002070 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2071 image_create_info.pNext = NULL;
2072 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2073 image_create_info.format = tex_format;
2074 image_create_info.extent.width = tex_width;
2075 image_create_info.extent.height = tex_height;
2076 image_create_info.extent.depth = 1;
2077 image_create_info.mipLevels = 1;
2078 image_create_info.arrayLayers = 1;
2079 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2080 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2081 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2082 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002083
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002084 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002085 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2086 mem_alloc.pNext = NULL;
2087 mem_alloc.allocationSize = 0;
2088 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002089
Karl Schultz6addd812016-02-02 17:17:23 -07002090 // Introduce failure, do NOT set memProps to
2091 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002092 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002093 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002094 ASSERT_VK_SUCCESS(err);
2095
Karl Schultz6addd812016-02-02 17:17:23 -07002096 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002097
2098 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002099 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002100 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002101
2102 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002103 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002104 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002105 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002106 ASSERT_VK_SUCCESS(err);
2107
2108 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002109 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002110 ASSERT_VK_SUCCESS(err);
2111
Karl Schultz6addd812016-02-02 17:17:23 -07002112 // Introduce validation failure, try to bind a different memory object to
2113 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002114 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002115
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002116 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002117
Chia-I Wuf7458c52015-10-26 21:10:41 +08002118 vkDestroyImage(m_device->device(), image, NULL);
2119 vkFreeMemory(m_device->device(), mem1, NULL);
2120 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002121}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002122
Karl Schultz6addd812016-02-02 17:17:23 -07002123TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002124 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002125
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002126 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2127 "submitted in SIGNALED state. Fences "
2128 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002129
2130 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002131 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2132 fenceInfo.pNext = NULL;
2133 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002134
Tony Barbour1fa09702017-03-16 12:09:08 -06002135 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour300a6082015-04-07 13:44:53 -06002136 ASSERT_NO_FATAL_FAILURE(InitViewport());
2137 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2138
Tony Barbour552f6c02016-12-21 14:34:07 -07002139 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002140 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07002141 m_commandBuffer->EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002142
2143 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002144
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002145 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002146 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2147 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002148 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002149 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002150 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002151 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002152 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002153 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002154 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002155
2156 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002157 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002158
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002159 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002160}
Chris Forbes4e44c912016-06-16 10:20:00 +12002161
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002162TEST_F(VkLayerTest, InvalidUsageBits) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002163 TEST_DESCRIPTION(
2164 "Specify wrong usage for image then create conflicting view of image "
2165 "Initialize buffer with wrong usage then perform copy expecting errors "
2166 "from both the image and the buffer (2 calls)");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002167 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002168
Tony Barbour1fa09702017-03-16 12:09:08 -06002169 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002170
Tony Barbourf887b162017-03-09 10:06:46 -07002171 auto format = find_depth_stencil_format(m_device);
2172 if (!format) {
2173 printf(" No Depth + Stencil format found. Skipped.\n");
2174 return;
2175 }
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002176
Tony Barbourf92621a2016-05-02 14:28:12 -06002177 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06002178 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002179 image.init(128, 128, format, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002180 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06002181
Tony Barbourf92621a2016-05-02 14:28:12 -06002182 VkImageView dsv;
2183 VkImageViewCreateInfo dsvci = {};
2184 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2185 dsvci.image = image.handle();
2186 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002187 dsvci.format = format;
Tony Barbourf92621a2016-05-02 14:28:12 -06002188 dsvci.subresourceRange.layerCount = 1;
2189 dsvci.subresourceRange.baseMipLevel = 0;
2190 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002191 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002192
Tony Barbourf92621a2016-05-02 14:28:12 -06002193 // Create a view with depth / stencil aspect for image with different usage
2194 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002195
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002196 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002197
2198 // Initialize buffer with TRANSFER_DST usage
2199 vk_testing::Buffer buffer;
2200 VkMemoryPropertyFlags reqs = 0;
2201 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2202 VkBufferImageCopy region = {};
2203 region.bufferRowLength = 128;
2204 region.bufferImageHeight = 128;
Mark Lobodzinski80871462017-02-16 10:37:27 -07002205 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Tony Barbourf92621a2016-05-02 14:28:12 -06002206 region.imageSubresource.layerCount = 1;
2207 region.imageExtent.height = 16;
2208 region.imageExtent.width = 16;
2209 region.imageExtent.depth = 1;
2210
Mark Lobodzinski80871462017-02-16 10:37:27 -07002211 // Buffer usage not set to TRANSFER_SRC and image usage not set to TRANSFER_DST
Tony Barbour552f6c02016-12-21 14:34:07 -07002212 m_commandBuffer->BeginCommandBuffer();
Tony Barbourf92621a2016-05-02 14:28:12 -06002213
Chris Forbesda581202016-10-06 18:25:26 +13002214 // two separate errors from this call:
2215 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "image should have VK_IMAGE_USAGE_TRANSFER_DST_BIT");
2216 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "buffer should have VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
2217
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002218 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
2219 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06002220 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002221}
Tony Barbour75d79f02016-08-30 09:39:07 -06002222
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002223TEST_F(VkLayerTest, LeakAnObject) {
2224 VkResult err;
2225
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002226 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002227
2228 // Note that we have to create a new device since destroying the
2229 // framework's device causes Teardown() to fail and just calling Teardown
2230 // will destroy the errorMonitor.
2231
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002232 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002233
Tony Barbour1fa09702017-03-16 12:09:08 -06002234 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002235
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002236 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002237 std::vector<VkDeviceQueueCreateInfo> queue_info;
2238 queue_info.reserve(queue_props.size());
2239 std::vector<std::vector<float>> queue_priorities;
2240 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2241 VkDeviceQueueCreateInfo qi = {};
2242 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2243 qi.pNext = NULL;
2244 qi.queueFamilyIndex = i;
2245 qi.queueCount = queue_props[i].queueCount;
2246 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2247 qi.pQueuePriorities = queue_priorities[i].data();
2248 queue_info.push_back(qi);
2249 }
2250
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002251 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002252
2253 // The sacrificial device object
2254 VkDevice testDevice;
2255 VkDeviceCreateInfo device_create_info = {};
2256 auto features = m_device->phy().features();
2257 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2258 device_create_info.pNext = NULL;
2259 device_create_info.queueCreateInfoCount = queue_info.size();
2260 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06002261 device_create_info.enabledLayerCount = 0;
2262 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002263 device_create_info.pEnabledFeatures = &features;
2264 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2265 ASSERT_VK_SUCCESS(err);
2266
2267 VkFence fence;
2268 VkFenceCreateInfo fence_create_info = {};
2269 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2270 fence_create_info.pNext = NULL;
2271 fence_create_info.flags = 0;
2272 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2273 ASSERT_VK_SUCCESS(err);
2274
2275 // Induce failure by not calling vkDestroyFence
2276 vkDestroyDevice(testDevice, NULL);
2277 m_errorMonitor->VerifyFound();
2278}
2279
2280TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002281 TEST_DESCRIPTION(
2282 "Allocate command buffers from one command pool and "
2283 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002284
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002285 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002286
Tony Barbour1fa09702017-03-16 12:09:08 -06002287 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002288 VkCommandPool command_pool_one;
2289 VkCommandPool command_pool_two;
2290
2291 VkCommandPoolCreateInfo pool_create_info{};
2292 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2293 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2294 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2295
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002296 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002297
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002298 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002299
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002300 VkCommandBuffer cb;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002301 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002302 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002303 command_buffer_allocate_info.commandPool = command_pool_one;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002304 command_buffer_allocate_info.commandBufferCount = 1;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002305 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002306 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002307
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002308 vkFreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002309
2310 m_errorMonitor->VerifyFound();
2311
2312 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2313 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2314}
2315
2316TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2317 VkResult err;
2318
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002319 TEST_DESCRIPTION(
2320 "Allocate descriptor sets from one DS pool and "
2321 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002322
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002323 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002324
Tony Barbour1fa09702017-03-16 12:09:08 -06002325 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002326 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2327
2328 VkDescriptorPoolSize ds_type_count = {};
2329 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2330 ds_type_count.descriptorCount = 1;
2331
2332 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2333 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2334 ds_pool_ci.pNext = NULL;
2335 ds_pool_ci.flags = 0;
2336 ds_pool_ci.maxSets = 1;
2337 ds_pool_ci.poolSizeCount = 1;
2338 ds_pool_ci.pPoolSizes = &ds_type_count;
2339
2340 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002341 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002342 ASSERT_VK_SUCCESS(err);
2343
2344 // Create a second descriptor pool
2345 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002346 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002347 ASSERT_VK_SUCCESS(err);
2348
2349 VkDescriptorSetLayoutBinding dsl_binding = {};
2350 dsl_binding.binding = 0;
2351 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2352 dsl_binding.descriptorCount = 1;
2353 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2354 dsl_binding.pImmutableSamplers = NULL;
2355
2356 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2357 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2358 ds_layout_ci.pNext = NULL;
2359 ds_layout_ci.bindingCount = 1;
2360 ds_layout_ci.pBindings = &dsl_binding;
2361
2362 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002363 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002364 ASSERT_VK_SUCCESS(err);
2365
2366 VkDescriptorSet descriptorSet;
2367 VkDescriptorSetAllocateInfo alloc_info = {};
2368 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2369 alloc_info.descriptorSetCount = 1;
2370 alloc_info.descriptorPool = ds_pool_one;
2371 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002372 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002373 ASSERT_VK_SUCCESS(err);
2374
2375 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2376
2377 m_errorMonitor->VerifyFound();
2378
2379 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2380 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2381 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2382}
2383
2384TEST_F(VkLayerTest, CreateUnknownObject) {
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002385 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00788);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002386
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002387 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002388
Tony Barbour1fa09702017-03-16 12:09:08 -06002389 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002390
2391 // Pass bogus handle into GetImageMemoryRequirements
2392 VkMemoryRequirements mem_reqs;
2393 uint64_t fakeImageHandle = 0xCADECADE;
2394 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2395
2396 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2397
2398 m_errorMonitor->VerifyFound();
2399}
2400
Mike Schuchardt17838902017-02-21 09:48:06 -07002401TEST_F(VkLayerTest, UseObjectWithWrongDevice) {
2402 TEST_DESCRIPTION(
2403 "Try to destroy a render pass object using a device other than the one it was created on. "
2404 "This should generate a distinct error from the invalid handle error.");
2405 // Create first device and renderpass
Tony Barbour1fa09702017-03-16 12:09:08 -06002406 ASSERT_NO_FATAL_FAILURE(Init());
Mike Schuchardt17838902017-02-21 09:48:06 -07002407 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2408
2409 // Create second device
2410 float priorities[] = {1.0f};
2411 VkDeviceQueueCreateInfo queue_info{};
2412 queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2413 queue_info.pNext = NULL;
2414 queue_info.flags = 0;
2415 queue_info.queueFamilyIndex = 0;
2416 queue_info.queueCount = 1;
2417 queue_info.pQueuePriorities = &priorities[0];
2418
2419 VkDeviceCreateInfo device_create_info = {};
2420 auto features = m_device->phy().features();
2421 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2422 device_create_info.pNext = NULL;
2423 device_create_info.queueCreateInfoCount = 1;
2424 device_create_info.pQueueCreateInfos = &queue_info;
2425 device_create_info.enabledLayerCount = 0;
2426 device_create_info.ppEnabledLayerNames = NULL;
2427 device_create_info.pEnabledFeatures = &features;
2428
2429 VkDevice second_device;
2430 ASSERT_VK_SUCCESS(vkCreateDevice(gpu(), &device_create_info, NULL, &second_device));
2431
2432 // Try to destroy the renderpass from the first device using the second device
2433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00399);
2434 vkDestroyRenderPass(second_device, m_renderPass, NULL);
2435 m_errorMonitor->VerifyFound();
2436
2437 vkDestroyDevice(second_device, NULL);
2438}
2439
Karl Schultz6addd812016-02-02 17:17:23 -07002440TEST_F(VkLayerTest, PipelineNotBound) {
2441 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002442
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002443 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002444
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002445 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002446
Tony Barbour1fa09702017-03-16 12:09:08 -06002447 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002448 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002449
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002450 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002451 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2452 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002453
2454 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002455 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2456 ds_pool_ci.pNext = NULL;
2457 ds_pool_ci.maxSets = 1;
2458 ds_pool_ci.poolSizeCount = 1;
2459 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002460
2461 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002462 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002463 ASSERT_VK_SUCCESS(err);
2464
2465 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002466 dsl_binding.binding = 0;
2467 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2468 dsl_binding.descriptorCount = 1;
2469 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2470 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002471
2472 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002473 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2474 ds_layout_ci.pNext = NULL;
2475 ds_layout_ci.bindingCount = 1;
2476 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002477
2478 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002479 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002480 ASSERT_VK_SUCCESS(err);
2481
2482 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002483 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002484 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002485 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002486 alloc_info.descriptorPool = ds_pool;
2487 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002488 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002489 ASSERT_VK_SUCCESS(err);
2490
2491 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002492 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2493 pipeline_layout_ci.pNext = NULL;
2494 pipeline_layout_ci.setLayoutCount = 1;
2495 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002496
2497 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002498 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002499 ASSERT_VK_SUCCESS(err);
2500
Mark Youngad779052016-01-06 14:26:04 -07002501 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002502
Tony Barbour552f6c02016-12-21 14:34:07 -07002503 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002504 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002505
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002506 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002507
Chia-I Wuf7458c52015-10-26 21:10:41 +08002508 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2509 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2510 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002511}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002512
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002513TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
2514 VkResult err;
2515
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002516 TEST_DESCRIPTION(
2517 "Test validation check for an invalid memory type index "
2518 "during bind[Buffer|Image]Memory time");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002519
Tony Barbour1fa09702017-03-16 12:09:08 -06002520 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002521
2522 // Create an image, allocate memory, set a bad typeIndex and then try to
2523 // bind it
2524 VkImage image;
2525 VkDeviceMemory mem;
2526 VkMemoryRequirements mem_reqs;
2527 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2528 const int32_t tex_width = 32;
2529 const int32_t tex_height = 32;
2530
2531 VkImageCreateInfo image_create_info = {};
2532 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2533 image_create_info.pNext = NULL;
2534 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2535 image_create_info.format = tex_format;
2536 image_create_info.extent.width = tex_width;
2537 image_create_info.extent.height = tex_height;
2538 image_create_info.extent.depth = 1;
2539 image_create_info.mipLevels = 1;
2540 image_create_info.arrayLayers = 1;
2541 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2542 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2543 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2544 image_create_info.flags = 0;
2545
2546 VkMemoryAllocateInfo mem_alloc = {};
2547 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2548 mem_alloc.pNext = NULL;
2549 mem_alloc.allocationSize = 0;
2550 mem_alloc.memoryTypeIndex = 0;
2551
2552 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2553 ASSERT_VK_SUCCESS(err);
2554
2555 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
2556 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002557
2558 // Introduce Failure, select invalid TypeIndex
2559 VkPhysicalDeviceMemoryProperties memory_info;
2560
2561 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
2562 unsigned int i;
2563 for (i = 0; i < memory_info.memoryTypeCount; i++) {
2564 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
2565 mem_alloc.memoryTypeIndex = i;
2566 break;
2567 }
2568 }
2569 if (i >= memory_info.memoryTypeCount) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002570 printf(" No invalid memory type index could be found; skipped.\n");
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002571 vkDestroyImage(m_device->device(), image, NULL);
2572 return;
2573 }
2574
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002575 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002576
2577 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
2578 ASSERT_VK_SUCCESS(err);
2579
2580 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2581 (void)err;
2582
2583 m_errorMonitor->VerifyFound();
2584
2585 vkDestroyImage(m_device->device(), image, NULL);
2586 vkFreeMemory(m_device->device(), mem, NULL);
2587}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002588
Karl Schultz6addd812016-02-02 17:17:23 -07002589TEST_F(VkLayerTest, BindInvalidMemory) {
2590 VkResult err;
2591 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002592
Tony Barbour1fa09702017-03-16 12:09:08 -06002593 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002594
Cortf801b982017-01-17 18:10:21 -08002595 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
Cort Strattonde748202017-02-17 12:50:01 -08002596 const int32_t tex_width = 256;
2597 const int32_t tex_height = 256;
Tobin Ehlisec598302015-09-15 15:02:17 -06002598
2599 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002600 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2601 image_create_info.pNext = NULL;
2602 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2603 image_create_info.format = tex_format;
2604 image_create_info.extent.width = tex_width;
2605 image_create_info.extent.height = tex_height;
2606 image_create_info.extent.depth = 1;
2607 image_create_info.mipLevels = 1;
2608 image_create_info.arrayLayers = 1;
2609 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002610 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -07002611 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2612 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002613
Cortf801b982017-01-17 18:10:21 -08002614 VkBufferCreateInfo buffer_create_info = {};
2615 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2616 buffer_create_info.pNext = NULL;
2617 buffer_create_info.flags = 0;
Cort Strattonde748202017-02-17 12:50:01 -08002618 buffer_create_info.size = 4 * 1024 * 1024;
2619 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
Cortf801b982017-01-17 18:10:21 -08002620 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tobin Ehlisec598302015-09-15 15:02:17 -06002621
Cortf801b982017-01-17 18:10:21 -08002622 // Create an image/buffer, allocate memory, free it, and then try to bind it
2623 {
2624 VkImage image = VK_NULL_HANDLE;
2625 VkBuffer buffer = VK_NULL_HANDLE;
2626 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2627 ASSERT_VK_SUCCESS(err);
2628 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2629 ASSERT_VK_SUCCESS(err);
2630 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2631 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2632 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002633
Cortf801b982017-01-17 18:10:21 -08002634 VkMemoryAllocateInfo image_mem_alloc = {}, buffer_mem_alloc = {};
2635 image_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2636 image_mem_alloc.allocationSize = image_mem_reqs.size;
2637 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_mem_alloc, 0);
2638 ASSERT_TRUE(pass);
2639 buffer_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2640 buffer_mem_alloc.allocationSize = buffer_mem_reqs.size;
2641 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_mem_alloc, 0);
2642 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002643
Cortf801b982017-01-17 18:10:21 -08002644 VkDeviceMemory image_mem = VK_NULL_HANDLE, buffer_mem = VK_NULL_HANDLE;
2645 err = vkAllocateMemory(device(), &image_mem_alloc, NULL, &image_mem);
2646 ASSERT_VK_SUCCESS(err);
2647 err = vkAllocateMemory(device(), &buffer_mem_alloc, NULL, &buffer_mem);
2648 ASSERT_VK_SUCCESS(err);
Tobin Ehlisec598302015-09-15 15:02:17 -06002649
Cortf801b982017-01-17 18:10:21 -08002650 vkFreeMemory(device(), image_mem, NULL);
2651 vkFreeMemory(device(), buffer_mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002652
Cortf801b982017-01-17 18:10:21 -08002653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00809);
2654 err = vkBindImageMemory(device(), image, image_mem, 0);
2655 (void)err; // This may very well return an error.
2656 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002657
Cortf801b982017-01-17 18:10:21 -08002658 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00800);
2659 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2660 (void)err; // This may very well return an error.
2661 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002662
Cortf801b982017-01-17 18:10:21 -08002663 vkDestroyImage(m_device->device(), image, NULL);
2664 vkDestroyBuffer(m_device->device(), buffer, NULL);
2665 }
Cort Strattonc21601b2017-01-28 14:16:16 -08002666
2667 // Try to bind memory to an object that already has a memory binding
2668 {
2669 VkImage image = VK_NULL_HANDLE;
2670 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2671 ASSERT_VK_SUCCESS(err);
2672 VkBuffer buffer = VK_NULL_HANDLE;
2673 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2674 ASSERT_VK_SUCCESS(err);
2675 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2676 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2677 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2678 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2679 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2680 image_alloc_info.allocationSize = image_mem_reqs.size;
2681 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2682 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
2683 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2684 ASSERT_TRUE(pass);
2685 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2686 ASSERT_TRUE(pass);
2687 VkDeviceMemory image_mem, buffer_mem;
2688 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2689 ASSERT_VK_SUCCESS(err);
2690 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2691 ASSERT_VK_SUCCESS(err);
2692
2693 err = vkBindImageMemory(device(), image, image_mem, 0);
2694 ASSERT_VK_SUCCESS(err);
2695 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00803);
2696 err = vkBindImageMemory(device(), image, image_mem, 0);
2697 (void)err; // This may very well return an error.
2698 m_errorMonitor->VerifyFound();
2699
2700 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2701 ASSERT_VK_SUCCESS(err);
2702 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00791);
2703 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2704 (void)err; // This may very well return an error.
2705 m_errorMonitor->VerifyFound();
2706
2707 vkFreeMemory(device(), image_mem, NULL);
2708 vkFreeMemory(device(), buffer_mem, NULL);
2709 vkDestroyImage(device(), image, NULL);
2710 vkDestroyBuffer(device(), buffer, NULL);
2711 }
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002712
Cort Strattonde748202017-02-17 12:50:01 -08002713 // Try to bind memory to an object with an invalid memoryOffset
Cort6c7dff72017-01-27 18:34:50 -08002714 {
2715 VkImage image = VK_NULL_HANDLE;
2716 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2717 ASSERT_VK_SUCCESS(err);
2718 VkBuffer buffer = VK_NULL_HANDLE;
2719 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2720 ASSERT_VK_SUCCESS(err);
2721 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2722 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2723 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2724 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2725 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002726 // Leave some extra space for alignment wiggle room
2727 image_alloc_info.allocationSize = image_mem_reqs.size + image_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002728 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002729 buffer_alloc_info.allocationSize = buffer_mem_reqs.size + buffer_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002730 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2731 ASSERT_TRUE(pass);
2732 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2733 ASSERT_TRUE(pass);
2734 VkDeviceMemory image_mem, buffer_mem;
2735 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2736 ASSERT_VK_SUCCESS(err);
2737 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2738 ASSERT_VK_SUCCESS(err);
2739
Cort Strattonde748202017-02-17 12:50:01 -08002740 // Test unaligned memory offset
2741 {
2742 if (image_mem_reqs.alignment > 1) {
2743 VkDeviceSize image_offset = 1;
2744 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02178);
2745 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2746 (void)err; // This may very well return an error.
2747 m_errorMonitor->VerifyFound();
2748 }
Cort6c7dff72017-01-27 18:34:50 -08002749
Cort Strattonde748202017-02-17 12:50:01 -08002750 if (buffer_mem_reqs.alignment > 1) {
2751 VkDeviceSize buffer_offset = 1;
2752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02174);
2753 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2754 (void)err; // This may very well return an error.
2755 m_errorMonitor->VerifyFound();
2756 }
2757 }
2758
2759 // Test memory offsets outside the memory allocation
2760 {
2761 VkDeviceSize image_offset =
2762 (image_alloc_info.allocationSize + image_mem_reqs.alignment) & ~(image_mem_reqs.alignment - 1);
2763 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00805);
2764 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2765 (void)err; // This may very well return an error.
2766 m_errorMonitor->VerifyFound();
2767
2768 VkDeviceSize buffer_offset =
2769 (buffer_alloc_info.allocationSize + buffer_mem_reqs.alignment) & ~(buffer_mem_reqs.alignment - 1);
2770 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00793);
2771 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2772 (void)err; // This may very well return an error.
2773 m_errorMonitor->VerifyFound();
2774 }
2775
2776 // Test memory offsets within the memory allocation, but which leave too little memory for
2777 // the resource.
2778 {
2779 VkDeviceSize image_offset = (image_mem_reqs.size - 1) & ~(image_mem_reqs.alignment - 1);
2780 if (image_offset > 0) {
2781 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02179);
2782 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2783 (void)err; // This may very well return an error.
2784 m_errorMonitor->VerifyFound();
2785 }
2786
2787 VkDeviceSize buffer_offset = (buffer_mem_reqs.size - 1) & ~(buffer_mem_reqs.alignment - 1);
2788 if (buffer_offset > 0) {
2789 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02175);
2790 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2791 (void)err; // This may very well return an error.
2792 m_errorMonitor->VerifyFound();
2793 }
2794 }
Cort6c7dff72017-01-27 18:34:50 -08002795
2796 vkFreeMemory(device(), image_mem, NULL);
2797 vkFreeMemory(device(), buffer_mem, NULL);
2798 vkDestroyImage(device(), image, NULL);
2799 vkDestroyBuffer(device(), buffer, NULL);
2800 }
2801
Cort Stratton4c38bb52017-01-28 13:33:10 -08002802 // Try to bind memory to an object with an invalid memory type
2803 {
2804 VkImage image = VK_NULL_HANDLE;
2805 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2806 ASSERT_VK_SUCCESS(err);
2807 VkBuffer buffer = VK_NULL_HANDLE;
2808 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2809 ASSERT_VK_SUCCESS(err);
2810 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2811 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2812 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2813 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2814 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2815 image_alloc_info.allocationSize = image_mem_reqs.size;
2816 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2817 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
Cort Strattonccc90e32017-02-04 13:47:42 -08002818 // Create a mask of available memory types *not* supported by these resources,
2819 // and try to use one of them.
Cort Stratton4c38bb52017-01-28 13:33:10 -08002820 VkPhysicalDeviceMemoryProperties memory_properties = {};
2821 vkGetPhysicalDeviceMemoryProperties(m_device->phy().handle(), &memory_properties);
Cort Strattonccc90e32017-02-04 13:47:42 -08002822 VkDeviceMemory image_mem, buffer_mem;
2823
Cort Stratton4c38bb52017-01-28 13:33:10 -08002824 uint32_t image_unsupported_mem_type_bits = ((1 << memory_properties.memoryTypeCount) - 1) & ~image_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002825 if (image_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002826 pass = m_device->phy().set_memory_type(image_unsupported_mem_type_bits, &image_alloc_info, 0);
2827 ASSERT_TRUE(pass);
2828 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2829 ASSERT_VK_SUCCESS(err);
2830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00806);
2831 err = vkBindImageMemory(device(), image, image_mem, 0);
2832 (void)err; // This may very well return an error.
2833 m_errorMonitor->VerifyFound();
2834 vkFreeMemory(device(), image_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002835 }
2836
Cort Stratton4c38bb52017-01-28 13:33:10 -08002837 uint32_t buffer_unsupported_mem_type_bits =
2838 ((1 << memory_properties.memoryTypeCount) - 1) & ~buffer_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002839 if (buffer_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002840 pass = m_device->phy().set_memory_type(buffer_unsupported_mem_type_bits, &buffer_alloc_info, 0);
2841 ASSERT_TRUE(pass);
2842 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2843 ASSERT_VK_SUCCESS(err);
2844 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00797);
2845 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2846 (void)err; // This may very well return an error.
2847 m_errorMonitor->VerifyFound();
2848 vkFreeMemory(device(), buffer_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002849 }
Cort Stratton4c38bb52017-01-28 13:33:10 -08002850
Cort Stratton4c38bb52017-01-28 13:33:10 -08002851 vkDestroyImage(device(), image, NULL);
2852 vkDestroyBuffer(device(), buffer, NULL);
2853 }
2854
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002855 // Try to bind memory to an image created with sparse memory flags
2856 {
2857 VkImageCreateInfo sparse_image_create_info = image_create_info;
2858 sparse_image_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2859 VkImageFormatProperties image_format_properties = {};
2860 err = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), sparse_image_create_info.format,
2861 sparse_image_create_info.imageType, sparse_image_create_info.tiling,
2862 sparse_image_create_info.usage, sparse_image_create_info.flags,
2863 &image_format_properties);
2864 if (!m_device->phy().features().sparseResidencyImage2D || err == VK_ERROR_FORMAT_NOT_SUPPORTED) {
2865 // most likely means sparse formats aren't supported here; skip this test.
2866 } else {
2867 ASSERT_VK_SUCCESS(err);
2868 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002869 printf(" Sparse image format not supported; skipped.\n");
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002870 return;
2871 } else {
2872 VkImage sparse_image = VK_NULL_HANDLE;
2873 err = vkCreateImage(m_device->device(), &sparse_image_create_info, NULL, &sparse_image);
2874 ASSERT_VK_SUCCESS(err);
2875 VkMemoryRequirements sparse_mem_reqs = {};
2876 vkGetImageMemoryRequirements(m_device->device(), sparse_image, &sparse_mem_reqs);
2877 if (sparse_mem_reqs.memoryTypeBits != 0) {
2878 VkMemoryAllocateInfo sparse_mem_alloc = {};
2879 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2880 sparse_mem_alloc.pNext = NULL;
2881 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2882 sparse_mem_alloc.memoryTypeIndex = 0;
2883 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2884 ASSERT_TRUE(pass);
2885 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2886 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2887 ASSERT_VK_SUCCESS(err);
2888 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00804);
2889 err = vkBindImageMemory(m_device->device(), sparse_image, sparse_mem, 0);
2890 // This may very well return an error.
2891 (void)err;
2892 m_errorMonitor->VerifyFound();
2893 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2894 }
2895 vkDestroyImage(m_device->device(), sparse_image, NULL);
2896 }
2897 }
2898 }
2899
2900 // Try to bind memory to a buffer created with sparse memory flags
2901 {
2902 VkBufferCreateInfo sparse_buffer_create_info = buffer_create_info;
2903 sparse_buffer_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2904 if (!m_device->phy().features().sparseResidencyBuffer) {
2905 // most likely means sparse formats aren't supported here; skip this test.
2906 } else {
2907 VkBuffer sparse_buffer = VK_NULL_HANDLE;
2908 err = vkCreateBuffer(m_device->device(), &sparse_buffer_create_info, NULL, &sparse_buffer);
2909 ASSERT_VK_SUCCESS(err);
2910 VkMemoryRequirements sparse_mem_reqs = {};
2911 vkGetBufferMemoryRequirements(m_device->device(), sparse_buffer, &sparse_mem_reqs);
2912 if (sparse_mem_reqs.memoryTypeBits != 0) {
2913 VkMemoryAllocateInfo sparse_mem_alloc = {};
2914 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2915 sparse_mem_alloc.pNext = NULL;
2916 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2917 sparse_mem_alloc.memoryTypeIndex = 0;
2918 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2919 ASSERT_TRUE(pass);
2920 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2921 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2922 ASSERT_VK_SUCCESS(err);
2923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00792);
2924 err = vkBindBufferMemory(m_device->device(), sparse_buffer, sparse_mem, 0);
2925 // This may very well return an error.
2926 (void)err;
2927 m_errorMonitor->VerifyFound();
2928 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2929 }
2930 vkDestroyBuffer(m_device->device(), sparse_buffer, NULL);
2931 }
2932 }
Tobin Ehlisec598302015-09-15 15:02:17 -06002933}
2934
Karl Schultz6addd812016-02-02 17:17:23 -07002935TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2936 VkResult err;
2937 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002938
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002939 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002940
Tony Barbour1fa09702017-03-16 12:09:08 -06002941 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002942
Karl Schultz6addd812016-02-02 17:17:23 -07002943 // Create an image object, allocate memory, destroy the object and then try
2944 // to bind it
2945 VkImage image;
2946 VkDeviceMemory mem;
2947 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002948
Karl Schultz6addd812016-02-02 17:17:23 -07002949 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2950 const int32_t tex_width = 32;
2951 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002952
2953 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002954 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2955 image_create_info.pNext = NULL;
2956 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2957 image_create_info.format = tex_format;
2958 image_create_info.extent.width = tex_width;
2959 image_create_info.extent.height = tex_height;
2960 image_create_info.extent.depth = 1;
2961 image_create_info.mipLevels = 1;
2962 image_create_info.arrayLayers = 1;
2963 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2964 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2965 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2966 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002967
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002968 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002969 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2970 mem_alloc.pNext = NULL;
2971 mem_alloc.allocationSize = 0;
2972 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002973
Chia-I Wuf7458c52015-10-26 21:10:41 +08002974 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002975 ASSERT_VK_SUCCESS(err);
2976
Karl Schultz6addd812016-02-02 17:17:23 -07002977 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002978
2979 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002980 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002981 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002982
2983 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002984 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002985 ASSERT_VK_SUCCESS(err);
2986
2987 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002988 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002989 ASSERT_VK_SUCCESS(err);
2990
2991 // Now Try to bind memory to this destroyed object
2992 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2993 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07002994 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06002995
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002996 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002997
Chia-I Wuf7458c52015-10-26 21:10:41 +08002998 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002999}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003000
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003001TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
3002 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
3003
Tony Barbour1fa09702017-03-16 12:09:08 -06003004 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003005 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3006
3007 VkVertexInputBindingDescription input_binding;
3008 memset(&input_binding, 0, sizeof(input_binding));
3009
3010 VkVertexInputAttributeDescription input_attribs;
3011 memset(&input_attribs, 0, sizeof(input_attribs));
3012
3013 // Pick a really bad format for this purpose and make sure it should fail
3014 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
3015 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
3016 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07003017 printf(" Format unsuitable for test; skipped.\n");
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003018 return;
3019 }
3020
3021 input_attribs.location = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003022 char const *vsSource =
3023 "#version 450\n"
3024 "\n"
3025 "out gl_PerVertex {\n"
3026 " vec4 gl_Position;\n"
3027 "};\n"
3028 "void main(){\n"
3029 " gl_Position = vec4(1);\n"
3030 "}\n";
3031 char const *fsSource =
3032 "#version 450\n"
3033 "\n"
3034 "layout(location=0) out vec4 color;\n"
3035 "void main(){\n"
3036 " color = vec4(1);\n"
3037 "}\n";
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003038
3039 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
3040 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3041 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3042
3043 VkPipelineObj pipe(m_device);
3044 pipe.AddColorAttachment();
3045 pipe.AddShader(&vs);
3046 pipe.AddShader(&fs);
3047
3048 pipe.AddVertexInputBindings(&input_binding, 1);
3049 pipe.AddVertexInputAttribs(&input_attribs, 1);
3050
3051 VkDescriptorSetObj descriptorSet(m_device);
3052 descriptorSet.AppendDummy();
3053 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
3054
3055 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
3056
3057 m_errorMonitor->VerifyFound();
3058}
3059
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003060TEST_F(VkLayerTest, ImageSampleCounts) {
Jeremy Hayes0d104082017-02-21 10:24:16 -07003061 TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger validation errors.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003062 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003063
3064 VkMemoryPropertyFlags reqs = 0;
3065 VkImageCreateInfo image_create_info = {};
3066 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3067 image_create_info.pNext = NULL;
3068 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3069 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3070 image_create_info.extent.width = 256;
3071 image_create_info.extent.height = 256;
3072 image_create_info.extent.depth = 1;
3073 image_create_info.mipLevels = 1;
3074 image_create_info.arrayLayers = 1;
3075 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3076 image_create_info.flags = 0;
3077
3078 VkImageBlit blit_region = {};
3079 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3080 blit_region.srcSubresource.baseArrayLayer = 0;
3081 blit_region.srcSubresource.layerCount = 1;
3082 blit_region.srcSubresource.mipLevel = 0;
3083 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3084 blit_region.dstSubresource.baseArrayLayer = 0;
3085 blit_region.dstSubresource.layerCount = 1;
3086 blit_region.dstSubresource.mipLevel = 0;
3087
3088 // Create two images, the source with sampleCount = 2, and attempt to blit
3089 // between them
3090 {
3091 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003092 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003093 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003094 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003095 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003096 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003097 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003098 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003099 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003100 m_errorMonitor->SetDesiredFailureMsg(
3101 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3102 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003103 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3104 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003105 m_errorMonitor->VerifyFound();
3106 m_commandBuffer->EndCommandBuffer();
3107 }
3108
3109 // Create two images, the dest with sampleCount = 4, and attempt to blit
3110 // between them
3111 {
3112 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003113 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003114 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003115 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003116 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003117 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003118 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003119 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003120 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003121 m_errorMonitor->SetDesiredFailureMsg(
3122 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3123 "was created with a sample count of VK_SAMPLE_COUNT_4_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003124 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3125 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003126 m_errorMonitor->VerifyFound();
3127 m_commandBuffer->EndCommandBuffer();
3128 }
3129
3130 VkBufferImageCopy copy_region = {};
3131 copy_region.bufferRowLength = 128;
3132 copy_region.bufferImageHeight = 128;
3133 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3134 copy_region.imageSubresource.layerCount = 1;
3135 copy_region.imageExtent.height = 64;
3136 copy_region.imageExtent.width = 64;
3137 copy_region.imageExtent.depth = 1;
3138
3139 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
3140 // buffer to image
3141 {
3142 vk_testing::Buffer src_buffer;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003143 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
3144 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003145 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003146 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003147 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003148 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003149 m_errorMonitor->SetDesiredFailureMsg(
3150 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3151 "was created with a sample count of VK_SAMPLE_COUNT_8_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003152 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
3153 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003154 m_errorMonitor->VerifyFound();
3155 m_commandBuffer->EndCommandBuffer();
3156 }
3157
3158 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
3159 // image to buffer
3160 {
3161 vk_testing::Buffer dst_buffer;
3162 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
3163 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003164 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003165 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003166 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003167 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003168 m_errorMonitor->SetDesiredFailureMsg(
3169 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3170 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003171 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003172 dst_buffer.handle(), 1, &copy_region);
3173 m_errorMonitor->VerifyFound();
3174 m_commandBuffer->EndCommandBuffer();
3175 }
3176}
3177
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003178TEST_F(VkLayerTest, BlitImageFormats) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003179 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003180
3181 VkImageObj src_image(m_device);
3182 src_image.init(64, 64, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
3183 VkImageObj dst_image(m_device);
3184 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
3185 VkImageObj dst_image2(m_device);
Mike Stroyan131f3e72016-10-18 11:10:23 -06003186 dst_image2.init(64, 64, VK_FORMAT_R8G8B8A8_SINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003187
3188 VkImageBlit blitRegion = {};
3189 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3190 blitRegion.srcSubresource.baseArrayLayer = 0;
3191 blitRegion.srcSubresource.layerCount = 1;
3192 blitRegion.srcSubresource.mipLevel = 0;
3193 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3194 blitRegion.dstSubresource.baseArrayLayer = 0;
3195 blitRegion.dstSubresource.layerCount = 1;
3196 blitRegion.dstSubresource.mipLevel = 0;
3197
Dave Houlton34df4cb2016-12-01 16:43:06 -07003198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
3199
3200 // TODO: there are 9 permutations of signed, unsigned, & other for source and dest
3201 // this test is only checking 2 of them at the moment
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003202
3203 // Unsigned int vs not an int
Tony Barbour552f6c02016-12-21 14:34:07 -07003204 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003205 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image.image(), dst_image.layout(), 1,
3206 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003207
3208 m_errorMonitor->VerifyFound();
3209
Dave Houlton34df4cb2016-12-01 16:43:06 -07003210 // Test should generate 2 VU failures
3211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02190);
3212 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003213
3214 // Unsigned int vs signed int
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003215 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image2.image(), dst_image2.layout(), 1,
3216 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003217
Dave Houlton34df4cb2016-12-01 16:43:06 -07003218 // TODO: Note that this only verifies that at least one of the VU enums was found
3219 // Also, if any were not seen, they'll remain in the target list (Soln TBD, JIRA task: VL-72)
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003220 m_errorMonitor->VerifyFound();
3221
Tony Barbour552f6c02016-12-21 14:34:07 -07003222 m_commandBuffer->EndCommandBuffer();
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003223}
3224
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003225TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
3226 VkResult err;
3227 bool pass;
3228
3229 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003230 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003231
3232 // If w/d/h granularity is 1, test is not meaningful
3233 // TODO: When virtual device limits are available, create a set of limits for this test that
3234 // will always have a granularity of > 1 for w, h, and d
3235 auto index = m_device->graphics_queue_node_index_;
3236 auto queue_family_properties = m_device->phy().queue_properties();
3237
3238 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
3239 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
3240 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
3241 return;
3242 }
3243
3244 // Create two images of different types and try to copy between them
3245 VkImage srcImage;
3246 VkImage dstImage;
3247 VkDeviceMemory srcMem;
3248 VkDeviceMemory destMem;
3249 VkMemoryRequirements memReqs;
3250
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003251 VkImageCreateInfo image_create_info = {};
3252 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3253 image_create_info.pNext = NULL;
3254 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3255 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3256 image_create_info.extent.width = 32;
3257 image_create_info.extent.height = 32;
3258 image_create_info.extent.depth = 1;
3259 image_create_info.mipLevels = 1;
3260 image_create_info.arrayLayers = 4;
3261 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3262 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3263 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3264 image_create_info.flags = 0;
3265
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003266 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003267 ASSERT_VK_SUCCESS(err);
3268
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003269 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003270 ASSERT_VK_SUCCESS(err);
3271
3272 // Allocate memory
3273 VkMemoryAllocateInfo memAlloc = {};
3274 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3275 memAlloc.pNext = NULL;
3276 memAlloc.allocationSize = 0;
3277 memAlloc.memoryTypeIndex = 0;
3278
3279 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
3280 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003281 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003282 ASSERT_TRUE(pass);
3283 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
3284 ASSERT_VK_SUCCESS(err);
3285
3286 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
3287 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003288 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003289 ASSERT_VK_SUCCESS(err);
3290 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
3291 ASSERT_VK_SUCCESS(err);
3292
3293 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
3294 ASSERT_VK_SUCCESS(err);
3295 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
3296 ASSERT_VK_SUCCESS(err);
3297
Tony Barbour552f6c02016-12-21 14:34:07 -07003298 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003299 VkImageCopy copyRegion;
3300 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3301 copyRegion.srcSubresource.mipLevel = 0;
3302 copyRegion.srcSubresource.baseArrayLayer = 0;
3303 copyRegion.srcSubresource.layerCount = 1;
3304 copyRegion.srcOffset.x = 0;
3305 copyRegion.srcOffset.y = 0;
3306 copyRegion.srcOffset.z = 0;
3307 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3308 copyRegion.dstSubresource.mipLevel = 0;
3309 copyRegion.dstSubresource.baseArrayLayer = 0;
3310 copyRegion.dstSubresource.layerCount = 1;
3311 copyRegion.dstOffset.x = 0;
3312 copyRegion.dstOffset.y = 0;
3313 copyRegion.dstOffset.z = 0;
3314 copyRegion.extent.width = 1;
3315 copyRegion.extent.height = 1;
3316 copyRegion.extent.depth = 1;
3317
3318 // Introduce failure by setting srcOffset to a bad granularity value
3319 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003320 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3321 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003322 m_errorMonitor->VerifyFound();
3323
3324 // Introduce failure by setting extent to a bad granularity value
3325 copyRegion.srcOffset.y = 0;
3326 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003327 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3328 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003329 m_errorMonitor->VerifyFound();
3330
3331 // Now do some buffer/image copies
3332 vk_testing::Buffer buffer;
3333 VkMemoryPropertyFlags reqs = 0;
3334 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3335 VkBufferImageCopy region = {};
3336 region.bufferOffset = 0;
3337 region.bufferRowLength = 3;
3338 region.bufferImageHeight = 128;
3339 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3340 region.imageSubresource.layerCount = 1;
3341 region.imageExtent.height = 16;
3342 region.imageExtent.width = 16;
3343 region.imageExtent.depth = 1;
3344 region.imageOffset.x = 0;
3345 region.imageOffset.y = 0;
3346 region.imageOffset.z = 0;
3347
3348 // Introduce failure by setting bufferRowLength to a bad granularity value
3349 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003350 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3351 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3352 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003353 m_errorMonitor->VerifyFound();
3354 region.bufferRowLength = 128;
3355
3356 // Introduce failure by setting bufferOffset to a bad granularity value
3357 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003358 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3359 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3360 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003361 m_errorMonitor->VerifyFound();
3362 region.bufferOffset = 0;
3363
3364 // Introduce failure by setting bufferImageHeight to a bad granularity value
3365 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3367 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3368 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003369 m_errorMonitor->VerifyFound();
3370 region.bufferImageHeight = 128;
3371
3372 // Introduce failure by setting imageExtent to a bad granularity value
3373 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003374 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3375 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3376 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003377 m_errorMonitor->VerifyFound();
3378 region.imageExtent.width = 16;
3379
3380 // Introduce failure by setting imageOffset to a bad granularity value
3381 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003382 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3383 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3384 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003385 m_errorMonitor->VerifyFound();
3386
Tony Barbour552f6c02016-12-21 14:34:07 -07003387 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003388
3389 vkDestroyImage(m_device->device(), srcImage, NULL);
3390 vkDestroyImage(m_device->device(), dstImage, NULL);
3391 vkFreeMemory(m_device->device(), srcMem, NULL);
3392 vkFreeMemory(m_device->device(), destMem, NULL);
3393}
3394
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003395TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003396 TEST_DESCRIPTION(
3397 "Submit command buffer created using one queue family and "
3398 "attempt to submit them on a queue created in a different "
3399 "queue family.");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003400
Tony Barbour1fa09702017-03-16 12:09:08 -06003401 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07003402
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003403 // This test is meaningless unless we have multiple queue families
3404 auto queue_family_properties = m_device->phy().queue_properties();
3405 if (queue_family_properties.size() < 2) {
3406 return;
3407 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003408 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003409 // Get safe index of another queue family
3410 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
Tony Barbour1fa09702017-03-16 12:09:08 -06003411 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003412 // Create a second queue using a different queue family
3413 VkQueue other_queue;
3414 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3415
3416 // Record an empty cmd buffer
3417 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3418 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3419 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3420 vkEndCommandBuffer(m_commandBuffer->handle());
3421
3422 // And submit on the wrong queue
3423 VkSubmitInfo submit_info = {};
3424 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3425 submit_info.commandBufferCount = 1;
3426 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003427 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003428
3429 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003430}
3431
Chris Forbes4c24a922016-11-16 08:59:10 +13003432TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003433 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4c24a922016-11-16 08:59:10 +13003434
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003435 // There are no attachments, but refer to attachment 0.
3436 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13003437 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003438 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13003439 };
3440
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003441 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, subpasses, 0, nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13003442 VkRenderPass rp;
3443
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003444 // "... must be less than the total number of attachments ..."
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003445 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13003446 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3447 m_errorMonitor->VerifyFound();
3448}
3449
Chris Forbesa58c4522016-09-28 15:19:39 +13003450TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
3451 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
Tony Barbour1fa09702017-03-16 12:09:08 -06003452 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa58c4522016-09-28 15:19:39 +13003453
3454 // A renderpass with two subpasses, both writing the same attachment.
3455 VkAttachmentDescription attach[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003456 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3457 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
3458 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesa58c4522016-09-28 15:19:39 +13003459 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003460 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbesa58c4522016-09-28 15:19:39 +13003461 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003462 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
3463 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbesa58c4522016-09-28 15:19:39 +13003464 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003465 VkSubpassDependency dep = {0,
3466 1,
3467 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3468 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3469 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3470 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3471 VK_DEPENDENCY_BY_REGION_BIT};
3472 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 1, &dep};
Chris Forbesa58c4522016-09-28 15:19:39 +13003473 VkRenderPass rp;
3474 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3475 ASSERT_VK_SUCCESS(err);
3476
3477 VkImageObj image(m_device);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003478 image.init_no_layout(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Chris Forbesa58c4522016-09-28 15:19:39 +13003479 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
3480
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003481 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
Chris Forbesa58c4522016-09-28 15:19:39 +13003482 VkFramebuffer fb;
3483 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
3484 ASSERT_VK_SUCCESS(err);
3485
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003486 char const *vsSource =
3487 "#version 450\n"
3488 "void main() { gl_Position = vec4(1); }\n";
3489 char const *fsSource =
3490 "#version 450\n"
3491 "layout(location=0) out vec4 color;\n"
3492 "void main() { color = vec4(1); }\n";
Chris Forbesa58c4522016-09-28 15:19:39 +13003493
3494 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3495 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3496 VkPipelineObj pipe(m_device);
3497 pipe.AddColorAttachment();
3498 pipe.AddShader(&vs);
3499 pipe.AddShader(&fs);
3500 VkViewport view_port = {};
3501 m_viewports.push_back(view_port);
3502 pipe.SetViewport(m_viewports);
3503 VkRect2D rect = {};
3504 m_scissors.push_back(rect);
3505 pipe.SetScissor(m_scissors);
3506
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003507 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 0, nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003508 VkPipelineLayout pl;
3509 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
3510 ASSERT_VK_SUCCESS(err);
3511 pipe.CreateVKPipeline(pl, rp);
3512
Tony Barbour552f6c02016-12-21 14:34:07 -07003513 m_commandBuffer->BeginCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003514
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003515 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
3516 nullptr,
3517 rp,
3518 fb,
3519 {{
3520 0, 0,
3521 },
3522 {32, 32}},
3523 0,
3524 nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003525
3526 // subtest 1: bind in the wrong subpass
3527 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3528 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003529 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003530 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3531 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3532 m_errorMonitor->VerifyFound();
3533
3534 vkCmdEndRenderPass(m_commandBuffer->handle());
3535
3536 // subtest 2: bind in correct subpass, then transition to next subpass
3537 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3538 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3539 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003540 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003541 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3542 m_errorMonitor->VerifyFound();
3543
3544 vkCmdEndRenderPass(m_commandBuffer->handle());
3545
Tony Barbour552f6c02016-12-21 14:34:07 -07003546 m_commandBuffer->EndCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003547
3548 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3549 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3550 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3551}
3552
Tony Barbour4e919972016-08-09 13:27:40 -06003553TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003554 TEST_DESCRIPTION(
3555 "Generate INVALID_RENDER_AREA error by beginning renderpass"
3556 "with extent outside of framebuffer");
Tony Barbour1fa09702017-03-16 12:09:08 -06003557 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003558 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3559
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003560 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3561 "Cannot execute a render pass with renderArea "
3562 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003563
3564 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3565 m_renderPassBeginInfo.renderArea.extent.width = 257;
3566 m_renderPassBeginInfo.renderArea.extent.height = 257;
Tony Barbour552f6c02016-12-21 14:34:07 -07003567 m_commandBuffer->BeginCommandBuffer();
3568 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour4e919972016-08-09 13:27:40 -06003569 m_errorMonitor->VerifyFound();
3570}
3571
3572TEST_F(VkLayerTest, DisabledIndependentBlend) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003573 TEST_DESCRIPTION(
3574 "Generate INDEPENDENT_BLEND by disabling independent "
3575 "blend and then specifying different blend states for two "
3576 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003577 VkPhysicalDeviceFeatures features = {};
3578 features.independentBlend = VK_FALSE;
Tony Barbour1fa09702017-03-16 12:09:08 -06003579 ASSERT_NO_FATAL_FAILURE(Init(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003580
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003581 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3582 "Invalid Pipeline CreateInfo: If independent blend feature not "
3583 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003584
Cody Northropc31a84f2016-08-22 10:41:47 -06003585 VkDescriptorSetObj descriptorSet(m_device);
3586 descriptorSet.AppendDummy();
3587 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003588
Cody Northropc31a84f2016-08-22 10:41:47 -06003589 VkPipelineObj pipeline(m_device);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003590 // Create a renderPass with two color attachments
3591 VkAttachmentReference attachments[2] = {};
3592 attachments[0].layout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003593 attachments[1].attachment = 1;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003594 attachments[1].layout = VK_IMAGE_LAYOUT_GENERAL;
3595
3596 VkSubpassDescription subpass = {};
3597 subpass.pColorAttachments = attachments;
3598 subpass.colorAttachmentCount = 2;
3599
3600 VkRenderPassCreateInfo rpci = {};
3601 rpci.subpassCount = 1;
3602 rpci.pSubpasses = &subpass;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003603 rpci.attachmentCount = 2;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003604
Tony Barbourffd60bd2017-03-09 12:04:55 -07003605 VkAttachmentDescription attach_desc[2] = {};
3606 attach_desc[0].format = VK_FORMAT_B8G8R8A8_UNORM;
3607 attach_desc[0].samples = VK_SAMPLE_COUNT_1_BIT;
3608 attach_desc[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3609 attach_desc[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
3610 attach_desc[1].format = VK_FORMAT_B8G8R8A8_UNORM;
3611 attach_desc[1].samples = VK_SAMPLE_COUNT_1_BIT;
3612 attach_desc[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3613 attach_desc[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003614
Tony Barbourffd60bd2017-03-09 12:04:55 -07003615 rpci.pAttachments = attach_desc;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003616 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3617
3618 VkRenderPass renderpass;
3619 vkCreateRenderPass(m_device->device(), &rpci, NULL, &renderpass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003620 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003621 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003622
Cody Northropc31a84f2016-08-22 10:41:47 -06003623 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3624 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3625 att_state1.blendEnable = VK_TRUE;
3626 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3627 att_state2.blendEnable = VK_FALSE;
3628 pipeline.AddColorAttachment(0, &att_state1);
3629 pipeline.AddColorAttachment(1, &att_state2);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003630 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass);
Cody Northropc31a84f2016-08-22 10:41:47 -06003631 m_errorMonitor->VerifyFound();
Tony Barbour0ace59a2017-02-06 13:38:36 -07003632 vkDestroyRenderPass(m_device->device(), renderpass, NULL);
Tony Barbour4e919972016-08-09 13:27:40 -06003633}
3634
Mike Weiblen40b160e2017-02-06 19:21:52 -07003635// Is the Pipeline compatible with the expectations of the Renderpass/subpasses?
3636TEST_F(VkLayerTest, PipelineRenderpassCompatibility) {
3637 TEST_DESCRIPTION(
3638 "Create a graphics pipeline that is incompatible with the requirements "
3639 "of its contained Renderpass/subpasses.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003640 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen40b160e2017-02-06 19:21:52 -07003641
3642 VkDescriptorSetObj ds_obj(m_device);
3643 ds_obj.AppendDummy();
3644 ds_obj.CreateVKDescriptorSet(m_commandBuffer);
3645
3646 VkShaderObj vs_obj(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
3647
3648 VkPipelineColorBlendAttachmentState att_state1 = {};
3649 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3650 att_state1.blendEnable = VK_TRUE;
3651
3652 VkRenderpassObj rp_obj(m_device);
3653
3654 {
3655 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02116);
3656 VkPipelineObj pipeline(m_device);
3657 pipeline.AddShader(&vs_obj);
3658 pipeline.AddColorAttachment(0, &att_state1);
3659
3660 VkGraphicsPipelineCreateInfo info = {};
3661 pipeline.InitGraphicsPipelineCreateInfo(&info);
3662 info.pColorBlendState = nullptr;
3663
3664 pipeline.CreateVKPipeline(ds_obj.GetPipelineLayout(), rp_obj.handle(), &info);
3665 m_errorMonitor->VerifyFound();
3666 }
3667}
3668
Chris Forbes26ec2122016-11-29 08:58:33 +13003669#if 0
Tony Barbour4e919972016-08-09 13:27:40 -06003670TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
3671 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
3672 "depth attachments in subpass");
Tony Barbour1fa09702017-03-16 12:09:08 -06003673 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003674
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003675 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3676 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
Tony Barbour4e919972016-08-09 13:27:40 -06003677
3678 // Create a renderPass with a single color attachment
3679 VkAttachmentReference attach = {};
3680 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3681 VkSubpassDescription subpass = {};
3682 VkRenderPassCreateInfo rpci = {};
3683 rpci.subpassCount = 1;
3684 rpci.pSubpasses = &subpass;
3685 rpci.attachmentCount = 1;
3686 VkAttachmentDescription attach_desc = {};
3687 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3688 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3689 rpci.pAttachments = &attach_desc;
3690 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3691 VkRenderPass rp;
3692 subpass.pDepthStencilAttachment = &attach;
3693 subpass.pColorAttachments = NULL;
3694 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3695 m_errorMonitor->VerifyFound();
3696}
Chris Forbes26ec2122016-11-29 08:58:33 +13003697#endif
Tony Barbour4e919972016-08-09 13:27:40 -06003698
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003699TEST_F(VkLayerTest, UnusedPreserveAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003700 TEST_DESCRIPTION(
3701 "Create a framebuffer where a subpass has a preserve "
3702 "attachment reference of VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003703
Tony Barbour1fa09702017-03-16 12:09:08 -06003704 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003705 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3706
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must not be VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003708
3709 VkAttachmentReference color_attach = {};
3710 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3711 color_attach.attachment = 0;
3712 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
3713 VkSubpassDescription subpass = {};
3714 subpass.colorAttachmentCount = 1;
3715 subpass.pColorAttachments = &color_attach;
3716 subpass.preserveAttachmentCount = 1;
3717 subpass.pPreserveAttachments = &preserve_attachment;
3718
3719 VkRenderPassCreateInfo rpci = {};
3720 rpci.subpassCount = 1;
3721 rpci.pSubpasses = &subpass;
3722 rpci.attachmentCount = 1;
3723 VkAttachmentDescription attach_desc = {};
3724 attach_desc.format = VK_FORMAT_UNDEFINED;
3725 rpci.pAttachments = &attach_desc;
3726 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3727 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003728 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003729
3730 m_errorMonitor->VerifyFound();
3731
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003732 if (result == VK_SUCCESS) {
3733 vkDestroyRenderPass(m_device->device(), rp, NULL);
3734 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003735}
3736
Chris Forbesc5389742016-06-29 11:49:23 +12003737TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003738 TEST_DESCRIPTION(
3739 "Ensure that CreateRenderPass produces a validation error "
3740 "when the source of a subpass multisample resolve "
3741 "does not have multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003742
Tony Barbour1fa09702017-03-16 12:09:08 -06003743 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003744
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003745 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3746 "Subpass 0 requests multisample resolve from attachment 0 which has "
3747 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003748
3749 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003750 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3751 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3752 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3753 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3754 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3755 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003756 };
3757
3758 VkAttachmentReference color = {
3759 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3760 };
3761
3762 VkAttachmentReference resolve = {
3763 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3764 };
3765
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003766 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003767
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003768 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003769
3770 VkRenderPass rp;
3771 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3772
3773 m_errorMonitor->VerifyFound();
3774
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003775 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003776}
3777
3778TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003779 TEST_DESCRIPTION(
3780 "Ensure CreateRenderPass produces a validation error "
3781 "when a subpass multisample resolve operation is "
3782 "requested, and the destination of that resolve has "
3783 "multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003784
Tony Barbour1fa09702017-03-16 12:09:08 -06003785 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003786
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003787 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3788 "Subpass 0 requests multisample resolve into attachment 1, which "
3789 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003790
3791 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003792 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3793 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3794 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3795 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3796 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3797 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003798 };
3799
3800 VkAttachmentReference color = {
3801 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3802 };
3803
3804 VkAttachmentReference resolve = {
3805 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3806 };
3807
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003808 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003809
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003810 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003811
3812 VkRenderPass rp;
3813 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3814
3815 m_errorMonitor->VerifyFound();
3816
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003817 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003818}
3819
Chris Forbes3f128ef2016-06-29 14:58:53 +12003820TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003821 TEST_DESCRIPTION(
3822 "Ensure CreateRenderPass produces a validation error "
3823 "when the color and depth attachments used by a subpass "
3824 "have inconsistent sample counts");
Chris Forbes6655bb32016-07-01 18:27:30 +12003825
Tony Barbour1fa09702017-03-16 12:09:08 -06003826 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3f128ef2016-06-29 14:58:53 +12003827
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003828 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3829 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
Chris Forbes3f128ef2016-06-29 14:58:53 +12003830
3831 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003832 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3833 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3834 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3835 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3836 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3837 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbes3f128ef2016-06-29 14:58:53 +12003838 };
3839
3840 VkAttachmentReference color[] = {
3841 {
3842 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3843 },
3844 {
3845 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3846 },
3847 };
3848
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003849 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, color, nullptr, nullptr, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003850
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003851 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003852
3853 VkRenderPass rp;
3854 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3855
3856 m_errorMonitor->VerifyFound();
3857
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003858 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbes3f128ef2016-06-29 14:58:53 +12003859}
3860
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003861TEST_F(VkLayerTest, FramebufferCreateErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003862 TEST_DESCRIPTION(
3863 "Hit errors when attempting to create a framebuffer :\n"
3864 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
3865 " 2. Use a color image as depthStencil attachment\n"
3866 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3867 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3868 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3869 " 6. Framebuffer attachment where dimensions don't match\n"
3870 " 7. Framebuffer attachment w/o identity swizzle\n"
3871 " 8. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003872
Tony Barbour1fa09702017-03-16 12:09:08 -06003873 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003874 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3875
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003876 m_errorMonitor->SetDesiredFailureMsg(
3877 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3878 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003879
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003880 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003881 VkAttachmentReference attach = {};
3882 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3883 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003884 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003885 VkRenderPassCreateInfo rpci = {};
3886 rpci.subpassCount = 1;
3887 rpci.pSubpasses = &subpass;
3888 rpci.attachmentCount = 1;
3889 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003890 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003891 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003892 rpci.pAttachments = &attach_desc;
3893 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3894 VkRenderPass rp;
3895 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3896 ASSERT_VK_SUCCESS(err);
3897
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003898 VkImageView ivs[2];
3899 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3900 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003901 VkFramebufferCreateInfo fb_info = {};
3902 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3903 fb_info.pNext = NULL;
3904 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003905 // Set mis-matching attachmentCount
3906 fb_info.attachmentCount = 2;
3907 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003908 fb_info.width = 100;
3909 fb_info.height = 100;
3910 fb_info.layers = 1;
3911
3912 VkFramebuffer fb;
3913 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3914
3915 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003916 if (err == VK_SUCCESS) {
3917 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3918 }
3919 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003920
3921 // Create a renderPass with a depth-stencil attachment created with
3922 // IMAGE_USAGE_COLOR_ATTACHMENT
3923 // Add our color attachment to pDepthStencilAttachment
3924 subpass.pDepthStencilAttachment = &attach;
3925 subpass.pColorAttachments = NULL;
3926 VkRenderPass rp_ds;
3927 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3928 ASSERT_VK_SUCCESS(err);
3929 // Set correct attachment count, but attachment has COLOR usage bit set
3930 fb_info.attachmentCount = 1;
3931 fb_info.renderPass = rp_ds;
3932
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003933 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " conflicts with the image's IMAGE_USAGE flags ");
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003934 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3935
3936 m_errorMonitor->VerifyFound();
3937 if (err == VK_SUCCESS) {
3938 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3939 }
3940 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003941
3942 // Create new renderpass with alternate attachment format from fb
3943 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3944 subpass.pDepthStencilAttachment = NULL;
3945 subpass.pColorAttachments = &attach;
3946 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3947 ASSERT_VK_SUCCESS(err);
3948
3949 // Cause error due to mis-matched formats between rp & fb
3950 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3951 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3953 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003954 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3955
3956 m_errorMonitor->VerifyFound();
3957 if (err == VK_SUCCESS) {
3958 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3959 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003960 vkDestroyRenderPass(m_device->device(), rp, NULL);
3961
3962 // Create new renderpass with alternate sample count from fb
3963 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3964 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3965 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3966 ASSERT_VK_SUCCESS(err);
3967
3968 // Cause error due to mis-matched sample count between rp & fb
3969 fb_info.renderPass = rp;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003971 " has VK_SAMPLE_COUNT_1_BIT samples that do not match the VK_SAMPLE_COUNT_4_BIT ");
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003972 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3973
3974 m_errorMonitor->VerifyFound();
3975 if (err == VK_SUCCESS) {
3976 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3977 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003978
3979 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003980
3981 // Create a custom imageView with non-1 mip levels
3982 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003983 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003984 ASSERT_TRUE(image.initialized());
3985
3986 VkImageView view;
3987 VkImageViewCreateInfo ivci = {};
3988 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3989 ivci.image = image.handle();
3990 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3991 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3992 ivci.subresourceRange.layerCount = 1;
3993 ivci.subresourceRange.baseMipLevel = 0;
3994 // Set level count 2 (only 1 is allowed for FB attachment)
3995 ivci.subresourceRange.levelCount = 2;
3996 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3997 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3998 ASSERT_VK_SUCCESS(err);
3999 // Re-create renderpass to have matching sample count
4000 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4001 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4002 ASSERT_VK_SUCCESS(err);
4003
4004 fb_info.renderPass = rp;
4005 fb_info.pAttachments = &view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004006 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has mip levelCount of 2 but only ");
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004007 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4008
4009 m_errorMonitor->VerifyFound();
4010 if (err == VK_SUCCESS) {
4011 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4012 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004013 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004014 // Update view to original color buffer and grow FB dimensions too big
4015 fb_info.pAttachments = ivs;
4016 fb_info.height = 1024;
4017 fb_info.width = 1024;
4018 fb_info.layers = 2;
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004019 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " Attachment dimensions must be at least as large. ");
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004020 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4021
4022 m_errorMonitor->VerifyFound();
4023 if (err == VK_SUCCESS) {
4024 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4025 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004026 // Create view attachment with non-identity swizzle
4027 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4028 ivci.image = image.handle();
4029 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4030 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4031 ivci.subresourceRange.layerCount = 1;
4032 ivci.subresourceRange.baseMipLevel = 0;
4033 ivci.subresourceRange.levelCount = 1;
4034 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4035 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4036 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4037 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4038 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4039 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4040 ASSERT_VK_SUCCESS(err);
4041
4042 fb_info.pAttachments = &view;
4043 fb_info.height = 100;
4044 fb_info.width = 100;
4045 fb_info.layers = 1;
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004046 m_errorMonitor->SetDesiredFailureMsg(
4047 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4048 " has non-identy swizzle. All framebuffer attachments must have been created with the identity swizzle. ");
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004049 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4050
4051 m_errorMonitor->VerifyFound();
4052 if (err == VK_SUCCESS) {
4053 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4054 }
4055 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004056 // reset attachment to color attachment
4057 fb_info.pAttachments = ivs;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004058
4059 // Request fb that exceeds max width
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004060 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004061 fb_info.height = 100;
4062 fb_info.layers = 1;
4063 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00413);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004064 m_errorMonitor->SetDesiredFailureMsg(
4065 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004066 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4067 "Here are the respective dimensions for attachment");
4068
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004069 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4070
4071 m_errorMonitor->VerifyFound();
4072 if (err == VK_SUCCESS) {
4073 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4074 }
4075
4076 // Request fb that exceeds max height
4077 fb_info.width = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004078 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004079 fb_info.layers = 1;
4080 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00414);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004081 m_errorMonitor->SetDesiredFailureMsg(
4082 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004083 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4084 "Here are the respective dimensions for attachment");
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004085 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4086
4087 m_errorMonitor->VerifyFound();
4088 if (err == VK_SUCCESS) {
4089 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4090 }
4091
4092 // Request fb that exceeds max layers
4093 fb_info.width = 100;
4094 fb_info.height = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004095 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004096 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00415);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004097 m_errorMonitor->SetDesiredFailureMsg(
4098 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004099 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4100 "Here are the respective dimensions for attachment");
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004101 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4102
4103 m_errorMonitor->VerifyFound();
4104 if (err == VK_SUCCESS) {
4105 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4106 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004107
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004108 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004109}
4110
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004111TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004112 TEST_DESCRIPTION(
4113 "Run a simple draw calls to validate failure when Depth Bias dynamic "
4114 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004115
Tony Barbour1fa09702017-03-16 12:09:08 -06004116 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004117 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
4119 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004120 m_errorMonitor->VerifyFound();
4121}
4122
4123TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004124 TEST_DESCRIPTION(
4125 "Run a simple draw calls to validate failure when Line Width dynamic "
4126 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004127
Tony Barbour1fa09702017-03-16 12:09:08 -06004128 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004129 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
4131 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004132 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004133}
4134
4135TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004136 TEST_DESCRIPTION(
4137 "Run a simple draw calls to validate failure when Viewport dynamic "
4138 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004139
Tony Barbour1fa09702017-03-16 12:09:08 -06004140 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004141 // Dynamic viewport state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004142 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4143 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004144 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004145 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004146}
4147
4148TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004149 TEST_DESCRIPTION(
4150 "Run a simple draw calls to validate failure when Scissor dynamic "
4151 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004152
Tony Barbour1fa09702017-03-16 12:09:08 -06004153 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004154 // Dynamic scissor state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004155 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4156 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004157 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004158 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004159}
4160
Cortd713fe82016-07-27 09:51:27 -07004161TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004162 TEST_DESCRIPTION(
4163 "Run a simple draw calls to validate failure when Blend Constants "
4164 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004165
Tony Barbour1fa09702017-03-16 12:09:08 -06004166 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004167 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004168 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4169 "Dynamic blend constants state not set for this command buffer");
4170 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06004171 m_errorMonitor->VerifyFound();
4172}
4173
4174TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004175 TEST_DESCRIPTION(
4176 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
4177 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004178
Tony Barbour1fa09702017-03-16 12:09:08 -06004179 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004180 if (!m_device->phy().features().depthBounds) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07004181 printf(" Device does not support depthBounds test; skipped.\n");
Tobin Ehlis21c88352016-05-26 06:15:45 -06004182 return;
4183 }
4184 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4186 "Dynamic depth bounds state not set for this command buffer");
4187 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004188 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004189}
4190
4191TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004192 TEST_DESCRIPTION(
4193 "Run a simple draw calls to validate failure when Stencil Read dynamic "
4194 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004195
Tony Barbour1fa09702017-03-16 12:09:08 -06004196 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004197 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4199 "Dynamic stencil read mask state not set for this command buffer");
4200 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004201 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004202}
4203
4204TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004205 TEST_DESCRIPTION(
4206 "Run a simple draw calls to validate failure when Stencil Write dynamic"
4207 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004208
Tony Barbour1fa09702017-03-16 12:09:08 -06004209 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004210 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4212 "Dynamic stencil write mask state not set for this command buffer");
4213 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004214 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004215}
4216
4217TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004218 TEST_DESCRIPTION(
4219 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
4220 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004221
Tony Barbour1fa09702017-03-16 12:09:08 -06004222 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004223 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4225 "Dynamic stencil reference state not set for this command buffer");
4226 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004227 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06004228}
4229
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004230TEST_F(VkLayerTest, IndexBufferNotBound) {
4231 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004232
Tony Barbour1fa09702017-03-16 12:09:08 -06004233 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004234 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4235 "Index buffer object not bound to this command buffer when Indexed ");
4236 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004237 m_errorMonitor->VerifyFound();
4238}
4239
Karl Schultz6addd812016-02-02 17:17:23 -07004240TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4242 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
4243 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004244
Tony Barbour1fa09702017-03-16 12:09:08 -06004245 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004246 ASSERT_NO_FATAL_FAILURE(InitViewport());
4247 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4248
Karl Schultz6addd812016-02-02 17:17:23 -07004249 // We luck out b/c by default the framework creates CB w/ the
4250 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tony Barbour552f6c02016-12-21 14:34:07 -07004251 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004252 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07004253 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004254
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004255 // Bypass framework since it does the waits automatically
4256 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004257 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08004258 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4259 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004260 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004261 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07004262 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004263 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004264 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08004265 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004266 submit_info.pSignalSemaphores = NULL;
4267
Chris Forbes40028e22016-06-13 09:59:34 +12004268 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07004269 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004270 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004271
Karl Schultz6addd812016-02-02 17:17:23 -07004272 // Cause validation error by re-submitting cmd buffer that should only be
4273 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12004274 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004275 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004276
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004277 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004278}
4279
Karl Schultz6addd812016-02-02 17:17:23 -07004280TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004281 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07004282 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004283
Tony Barbour1fa09702017-03-16 12:09:08 -06004284 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004285 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004286
Karl Schultz6addd812016-02-02 17:17:23 -07004287 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
4288 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004289 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004290 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004291 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004292
4293 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004294 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4295 ds_pool_ci.pNext = NULL;
4296 ds_pool_ci.flags = 0;
4297 ds_pool_ci.maxSets = 1;
4298 ds_pool_ci.poolSizeCount = 1;
4299 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004300
4301 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004302 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004303 ASSERT_VK_SUCCESS(err);
4304
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004305 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
4306 dsl_binding_samp.binding = 0;
4307 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4308 dsl_binding_samp.descriptorCount = 1;
4309 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
4310 dsl_binding_samp.pImmutableSamplers = NULL;
4311
4312 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4313 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4314 ds_layout_ci.pNext = NULL;
4315 ds_layout_ci.bindingCount = 1;
4316 ds_layout_ci.pBindings = &dsl_binding_samp;
4317
4318 VkDescriptorSetLayout ds_layout_samp;
4319 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
4320 ASSERT_VK_SUCCESS(err);
4321
4322 // Try to allocate 2 sets when pool only has 1 set
4323 VkDescriptorSet descriptor_sets[2];
4324 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
4325 VkDescriptorSetAllocateInfo alloc_info = {};
4326 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4327 alloc_info.descriptorSetCount = 2;
4328 alloc_info.descriptorPool = ds_pool;
4329 alloc_info.pSetLayouts = set_layouts;
4330 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
4331 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
4332 m_errorMonitor->VerifyFound();
4333
4334 alloc_info.descriptorSetCount = 1;
4335 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004336 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004337 dsl_binding.binding = 0;
4338 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4339 dsl_binding.descriptorCount = 1;
4340 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4341 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004342
Karl Schultz6addd812016-02-02 17:17:23 -07004343 ds_layout_ci.bindingCount = 1;
4344 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004345
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004346 VkDescriptorSetLayout ds_layout_ub;
4347 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004348 ASSERT_VK_SUCCESS(err);
4349
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004350 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004351 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004352 alloc_info.pSetLayouts = &ds_layout_ub;
4353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
4354 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004355
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004356 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004357
Karl Schultz2825ab92016-12-02 08:23:14 -07004358 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004359 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08004360 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004361}
4362
Karl Schultz6addd812016-02-02 17:17:23 -07004363TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
4364 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06004365
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00922);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004367
Tony Barbour1fa09702017-03-16 12:09:08 -06004368 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise735c692015-10-08 13:13:50 -06004369 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06004370
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004371 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004372 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4373 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06004374
4375 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004376 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4377 ds_pool_ci.pNext = NULL;
4378 ds_pool_ci.maxSets = 1;
4379 ds_pool_ci.poolSizeCount = 1;
4380 ds_pool_ci.flags = 0;
4381 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
4382 // app can only call vkResetDescriptorPool on this pool.;
4383 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06004384
4385 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004386 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06004387 ASSERT_VK_SUCCESS(err);
4388
4389 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004390 dsl_binding.binding = 0;
4391 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4392 dsl_binding.descriptorCount = 1;
4393 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4394 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06004395
4396 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004397 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4398 ds_layout_ci.pNext = NULL;
4399 ds_layout_ci.bindingCount = 1;
4400 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06004401
4402 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004403 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06004404 ASSERT_VK_SUCCESS(err);
4405
4406 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004407 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004408 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004409 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004410 alloc_info.descriptorPool = ds_pool;
4411 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004412 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06004413 ASSERT_VK_SUCCESS(err);
4414
4415 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004416 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06004417
Chia-I Wuf7458c52015-10-26 21:10:41 +08004418 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4419 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06004420}
4421
Karl Schultz6addd812016-02-02 17:17:23 -07004422TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004423 // Attempt to clear Descriptor Pool with bad object.
4424 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06004425
Tony Barbour1fa09702017-03-16 12:09:08 -06004426 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004427 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004428 uint64_t fake_pool_handle = 0xbaad6001;
4429 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
4430 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06004431 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004432}
4433
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004434TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004435 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
4436 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004437 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06004438 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004439
4440 uint64_t fake_set_handle = 0xbaad6001;
4441 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06004442 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004443 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06004444
Tony Barbour1fa09702017-03-16 12:09:08 -06004445 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004446
4447 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
4448 layout_bindings[0].binding = 0;
4449 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4450 layout_bindings[0].descriptorCount = 1;
4451 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
4452 layout_bindings[0].pImmutableSamplers = NULL;
4453
4454 VkDescriptorSetLayout descriptor_set_layout;
4455 VkDescriptorSetLayoutCreateInfo dslci = {};
4456 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4457 dslci.pNext = NULL;
4458 dslci.bindingCount = 1;
4459 dslci.pBindings = layout_bindings;
4460 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004461 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004462
4463 VkPipelineLayout pipeline_layout;
4464 VkPipelineLayoutCreateInfo plci = {};
4465 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4466 plci.pNext = NULL;
4467 plci.setLayoutCount = 1;
4468 plci.pSetLayouts = &descriptor_set_layout;
4469 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004470 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004471
Tony Barbour552f6c02016-12-21 14:34:07 -07004472 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004473 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
4474 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06004475 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07004476 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -06004477 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
4478 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004479}
4480
Karl Schultz6addd812016-02-02 17:17:23 -07004481TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004482 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
4483 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004484 uint64_t fake_layout_handle = 0xbaad6001;
4485 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Tony Barbour1fa09702017-03-16 12:09:08 -06004487 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004488 VkPipelineLayout pipeline_layout;
4489 VkPipelineLayoutCreateInfo plci = {};
4490 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4491 plci.pNext = NULL;
4492 plci.setLayoutCount = 1;
4493 plci.pSetLayouts = &bad_layout;
4494 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
4495
4496 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004497}
4498
Mark Muellerd4914412016-06-13 17:52:06 -06004499TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004500 TEST_DESCRIPTION(
4501 "This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
4502 "1) A uniform buffer update must have a valid buffer index."
4503 "2) When using an array of descriptors in a single WriteDescriptor,"
4504 " the descriptor types and stageflags must all be the same."
4505 "3) Immutable Sampler state must match across descriptors");
Mark Muellerd4914412016-06-13 17:52:06 -06004506
Mike Weiblena6666382017-01-05 15:16:11 -07004507 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00941);
Mark Muellerd4914412016-06-13 17:52:06 -06004508
Tony Barbour1fa09702017-03-16 12:09:08 -06004509 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerd4914412016-06-13 17:52:06 -06004510 VkDescriptorPoolSize ds_type_count[4] = {};
4511 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4512 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004513 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004514 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004515 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004516 ds_type_count[2].descriptorCount = 1;
4517 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4518 ds_type_count[3].descriptorCount = 1;
4519
4520 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4521 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4522 ds_pool_ci.maxSets = 1;
4523 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
4524 ds_pool_ci.pPoolSizes = ds_type_count;
4525
4526 VkDescriptorPool ds_pool;
4527 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4528 ASSERT_VK_SUCCESS(err);
4529
Mark Muellerb9896722016-06-16 09:54:29 -06004530 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004531 layout_binding[0].binding = 0;
4532 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4533 layout_binding[0].descriptorCount = 1;
4534 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4535 layout_binding[0].pImmutableSamplers = NULL;
4536
4537 layout_binding[1].binding = 1;
4538 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4539 layout_binding[1].descriptorCount = 1;
4540 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4541 layout_binding[1].pImmutableSamplers = NULL;
4542
4543 VkSamplerCreateInfo sampler_ci = {};
4544 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4545 sampler_ci.pNext = NULL;
4546 sampler_ci.magFilter = VK_FILTER_NEAREST;
4547 sampler_ci.minFilter = VK_FILTER_NEAREST;
4548 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4549 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4550 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4551 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4552 sampler_ci.mipLodBias = 1.0;
4553 sampler_ci.anisotropyEnable = VK_FALSE;
4554 sampler_ci.maxAnisotropy = 1;
4555 sampler_ci.compareEnable = VK_FALSE;
4556 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4557 sampler_ci.minLod = 1.0;
4558 sampler_ci.maxLod = 1.0;
4559 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4560 sampler_ci.unnormalizedCoordinates = VK_FALSE;
4561 VkSampler sampler;
4562
4563 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
4564 ASSERT_VK_SUCCESS(err);
4565
4566 layout_binding[2].binding = 2;
4567 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4568 layout_binding[2].descriptorCount = 1;
4569 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4570 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
4571
Mark Muellerd4914412016-06-13 17:52:06 -06004572 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4573 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4574 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
4575 ds_layout_ci.pBindings = layout_binding;
4576 VkDescriptorSetLayout ds_layout;
4577 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4578 ASSERT_VK_SUCCESS(err);
4579
4580 VkDescriptorSetAllocateInfo alloc_info = {};
4581 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4582 alloc_info.descriptorSetCount = 1;
4583 alloc_info.descriptorPool = ds_pool;
4584 alloc_info.pSetLayouts = &ds_layout;
4585 VkDescriptorSet descriptorSet;
4586 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4587 ASSERT_VK_SUCCESS(err);
4588
4589 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4590 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4591 pipeline_layout_ci.pNext = NULL;
4592 pipeline_layout_ci.setLayoutCount = 1;
4593 pipeline_layout_ci.pSetLayouts = &ds_layout;
4594
4595 VkPipelineLayout pipeline_layout;
4596 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4597 ASSERT_VK_SUCCESS(err);
4598
Mark Mueller5c838ce2016-06-16 09:54:29 -06004599 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004600 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4601 descriptor_write.dstSet = descriptorSet;
4602 descriptor_write.dstBinding = 0;
4603 descriptor_write.descriptorCount = 1;
4604 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4605
Mark Mueller5c838ce2016-06-16 09:54:29 -06004606 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004607 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4608 m_errorMonitor->VerifyFound();
4609
4610 // Create a buffer to update the descriptor with
4611 uint32_t qfi = 0;
4612 VkBufferCreateInfo buffCI = {};
4613 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4614 buffCI.size = 1024;
4615 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4616 buffCI.queueFamilyIndexCount = 1;
4617 buffCI.pQueueFamilyIndices = &qfi;
4618
4619 VkBuffer dyub;
4620 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4621 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004622
Tony Barboure132c5f2016-12-12 11:50:20 -07004623 VkDeviceMemory mem;
4624 VkMemoryRequirements mem_reqs;
4625 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4626
4627 VkMemoryAllocateInfo mem_alloc_info = {};
4628 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4629 mem_alloc_info.allocationSize = mem_reqs.size;
4630 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4631 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4632 ASSERT_VK_SUCCESS(err);
4633
4634 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4635 ASSERT_VK_SUCCESS(err);
4636
4637 VkDescriptorBufferInfo buffInfo[2] = {};
4638 buffInfo[0].buffer = dyub;
4639 buffInfo[0].offset = 0;
4640 buffInfo[0].range = 1024;
4641 buffInfo[1].buffer = dyub;
4642 buffInfo[1].offset = 0;
4643 buffInfo[1].range = 1024;
4644 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004645 descriptor_write.descriptorCount = 2;
4646
Mark Mueller5c838ce2016-06-16 09:54:29 -06004647 // 2) The stateFlags don't match between the first and second descriptor
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004649 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4650 m_errorMonitor->VerifyFound();
4651
Mark Mueller5c838ce2016-06-16 09:54:29 -06004652 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4653 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004654 descriptor_write.dstBinding = 1;
4655 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004656
Mark Mueller5c838ce2016-06-16 09:54:29 -06004657 // Make pImageInfo index non-null to avoid complaints of it missing
4658 VkDescriptorImageInfo imageInfo = {};
4659 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4660 descriptor_write.pImageInfo = &imageInfo;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004662 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4663 m_errorMonitor->VerifyFound();
4664
Mark Muellerd4914412016-06-13 17:52:06 -06004665 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004666 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004667 vkDestroySampler(m_device->device(), sampler, NULL);
4668 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4669 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4670 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4671}
4672
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004673TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004674 TEST_DESCRIPTION(
4675 "Attempt to draw with a command buffer that is invalid "
4676 "due to a buffer dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004677 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004678
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004679 VkBuffer buffer;
4680 VkDeviceMemory mem;
4681 VkMemoryRequirements mem_reqs;
4682
4683 VkBufferCreateInfo buf_info = {};
4684 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004685 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004686 buf_info.size = 256;
4687 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4688 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4689 ASSERT_VK_SUCCESS(err);
4690
4691 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4692
4693 VkMemoryAllocateInfo alloc_info = {};
4694 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4695 alloc_info.allocationSize = 256;
4696 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004697 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004698 if (!pass) {
4699 vkDestroyBuffer(m_device->device(), buffer, NULL);
4700 return;
4701 }
4702 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4703 ASSERT_VK_SUCCESS(err);
4704
4705 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4706 ASSERT_VK_SUCCESS(err);
4707
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004708 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004709 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004710 m_commandBuffer->EndCommandBuffer();
4711
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004712 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004713 // Destroy buffer dependency prior to submit to cause ERROR
4714 vkDestroyBuffer(m_device->device(), buffer, NULL);
4715
4716 VkSubmitInfo submit_info = {};
4717 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4718 submit_info.commandBufferCount = 1;
4719 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4720 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4721
4722 m_errorMonitor->VerifyFound();
Rene Lindsayab6c5cd2016-12-20 14:05:37 -07004723 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004724 vkFreeMemory(m_device->handle(), mem, NULL);
4725}
4726
Tobin Ehlisea413442016-09-28 10:23:59 -06004727TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4728 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4729
Tony Barbour1fa09702017-03-16 12:09:08 -06004730 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisea413442016-09-28 10:23:59 -06004731 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4732
4733 VkDescriptorPoolSize ds_type_count;
4734 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4735 ds_type_count.descriptorCount = 1;
4736
4737 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4738 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4739 ds_pool_ci.maxSets = 1;
4740 ds_pool_ci.poolSizeCount = 1;
4741 ds_pool_ci.pPoolSizes = &ds_type_count;
4742
4743 VkDescriptorPool ds_pool;
4744 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4745 ASSERT_VK_SUCCESS(err);
4746
4747 VkDescriptorSetLayoutBinding layout_binding;
4748 layout_binding.binding = 0;
4749 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4750 layout_binding.descriptorCount = 1;
4751 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4752 layout_binding.pImmutableSamplers = NULL;
4753
4754 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4755 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4756 ds_layout_ci.bindingCount = 1;
4757 ds_layout_ci.pBindings = &layout_binding;
4758 VkDescriptorSetLayout ds_layout;
4759 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4760 ASSERT_VK_SUCCESS(err);
4761
4762 VkDescriptorSetAllocateInfo alloc_info = {};
4763 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4764 alloc_info.descriptorSetCount = 1;
4765 alloc_info.descriptorPool = ds_pool;
4766 alloc_info.pSetLayouts = &ds_layout;
4767 VkDescriptorSet descriptor_set;
4768 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4769 ASSERT_VK_SUCCESS(err);
4770
4771 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4772 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4773 pipeline_layout_ci.pNext = NULL;
4774 pipeline_layout_ci.setLayoutCount = 1;
4775 pipeline_layout_ci.pSetLayouts = &ds_layout;
4776
4777 VkPipelineLayout pipeline_layout;
4778 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4779 ASSERT_VK_SUCCESS(err);
4780
4781 VkBuffer buffer;
4782 uint32_t queue_family_index = 0;
4783 VkBufferCreateInfo buffer_create_info = {};
4784 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4785 buffer_create_info.size = 1024;
4786 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4787 buffer_create_info.queueFamilyIndexCount = 1;
4788 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4789
4790 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4791 ASSERT_VK_SUCCESS(err);
4792
4793 VkMemoryRequirements memory_reqs;
4794 VkDeviceMemory buffer_memory;
4795
4796 VkMemoryAllocateInfo memory_info = {};
4797 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4798 memory_info.allocationSize = 0;
4799 memory_info.memoryTypeIndex = 0;
4800
4801 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4802 memory_info.allocationSize = memory_reqs.size;
4803 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4804 ASSERT_TRUE(pass);
4805
4806 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4807 ASSERT_VK_SUCCESS(err);
4808 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4809 ASSERT_VK_SUCCESS(err);
4810
4811 VkBufferView view;
4812 VkBufferViewCreateInfo bvci = {};
4813 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4814 bvci.buffer = buffer;
4815 bvci.format = VK_FORMAT_R8_UNORM;
4816 bvci.range = VK_WHOLE_SIZE;
4817
4818 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4819 ASSERT_VK_SUCCESS(err);
4820
4821 VkWriteDescriptorSet descriptor_write = {};
4822 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4823 descriptor_write.dstSet = descriptor_set;
4824 descriptor_write.dstBinding = 0;
4825 descriptor_write.descriptorCount = 1;
4826 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4827 descriptor_write.pTexelBufferView = &view;
4828
4829 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4830
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004831 char const *vsSource =
4832 "#version 450\n"
4833 "\n"
4834 "out gl_PerVertex { \n"
4835 " vec4 gl_Position;\n"
4836 "};\n"
4837 "void main(){\n"
4838 " gl_Position = vec4(1);\n"
4839 "}\n";
4840 char const *fsSource =
4841 "#version 450\n"
4842 "\n"
4843 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4844 "layout(location=0) out vec4 x;\n"
4845 "void main(){\n"
4846 " x = imageLoad(s, 0);\n"
4847 "}\n";
Tobin Ehlisea413442016-09-28 10:23:59 -06004848 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4849 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4850 VkPipelineObj pipe(m_device);
4851 pipe.AddShader(&vs);
4852 pipe.AddShader(&fs);
4853 pipe.AddColorAttachment();
4854 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4855
Tobin Ehlisea413442016-09-28 10:23:59 -06004856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer view ");
4857
Tony Barbour552f6c02016-12-21 14:34:07 -07004858 m_commandBuffer->BeginCommandBuffer();
4859 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4860
Tobin Ehlisea413442016-09-28 10:23:59 -06004861 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4862 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4863 VkRect2D scissor = {{0, 0}, {16, 16}};
4864 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4865 // Bind pipeline to cmd buffer
4866 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4867 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4868 &descriptor_set, 0, nullptr);
4869 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07004870 m_commandBuffer->EndRenderPass();
4871 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisea413442016-09-28 10:23:59 -06004872
4873 // Delete BufferView in order to invalidate cmd buffer
4874 vkDestroyBufferView(m_device->device(), view, NULL);
4875 // Now attempt submit of cmd buffer
4876 VkSubmitInfo submit_info = {};
4877 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4878 submit_info.commandBufferCount = 1;
4879 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4880 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4881 m_errorMonitor->VerifyFound();
4882
4883 // Clean-up
4884 vkDestroyBuffer(m_device->device(), buffer, NULL);
4885 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4886 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4887 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4888 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4889}
4890
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004891TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004892 TEST_DESCRIPTION(
4893 "Attempt to draw with a command buffer that is invalid "
4894 "due to an image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004895 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004896
4897 VkImage image;
4898 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4899 VkImageCreateInfo image_create_info = {};
4900 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4901 image_create_info.pNext = NULL;
4902 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4903 image_create_info.format = tex_format;
4904 image_create_info.extent.width = 32;
4905 image_create_info.extent.height = 32;
4906 image_create_info.extent.depth = 1;
4907 image_create_info.mipLevels = 1;
4908 image_create_info.arrayLayers = 1;
4909 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4910 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004911 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004912 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004913 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004914 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004915 // Have to bind memory to image before recording cmd in cmd buffer using it
4916 VkMemoryRequirements mem_reqs;
4917 VkDeviceMemory image_mem;
4918 bool pass;
4919 VkMemoryAllocateInfo mem_alloc = {};
4920 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4921 mem_alloc.pNext = NULL;
4922 mem_alloc.memoryTypeIndex = 0;
4923 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4924 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004925 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004926 ASSERT_TRUE(pass);
4927 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4928 ASSERT_VK_SUCCESS(err);
4929 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4930 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004931
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004932 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004933 VkClearColorValue ccv;
4934 ccv.float32[0] = 1.0f;
4935 ccv.float32[1] = 1.0f;
4936 ccv.float32[2] = 1.0f;
4937 ccv.float32[3] = 1.0f;
4938 VkImageSubresourceRange isr = {};
4939 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004940 isr.baseArrayLayer = 0;
4941 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004942 isr.layerCount = 1;
4943 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004944 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004945 m_commandBuffer->EndCommandBuffer();
4946
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004948 // Destroy image dependency prior to submit to cause ERROR
4949 vkDestroyImage(m_device->device(), image, NULL);
4950
4951 VkSubmitInfo submit_info = {};
4952 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4953 submit_info.commandBufferCount = 1;
4954 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4955 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4956
4957 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004958 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004959}
4960
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004961TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004962 TEST_DESCRIPTION(
4963 "Attempt to draw with a command buffer that is invalid "
4964 "due to a framebuffer image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004965 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004966 VkFormatProperties format_properties;
4967 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004968 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4969 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004970 return;
4971 }
4972
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004973 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4974
4975 VkImageCreateInfo image_ci = {};
4976 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4977 image_ci.pNext = NULL;
4978 image_ci.imageType = VK_IMAGE_TYPE_2D;
4979 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4980 image_ci.extent.width = 32;
4981 image_ci.extent.height = 32;
4982 image_ci.extent.depth = 1;
4983 image_ci.mipLevels = 1;
4984 image_ci.arrayLayers = 1;
4985 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
4986 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004987 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004988 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4989 image_ci.flags = 0;
4990 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004991 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004992
4993 VkMemoryRequirements memory_reqs;
4994 VkDeviceMemory image_memory;
4995 bool pass;
4996 VkMemoryAllocateInfo memory_info = {};
4997 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4998 memory_info.pNext = NULL;
4999 memory_info.allocationSize = 0;
5000 memory_info.memoryTypeIndex = 0;
5001 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5002 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005003 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005004 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005005 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005006 ASSERT_VK_SUCCESS(err);
5007 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5008 ASSERT_VK_SUCCESS(err);
5009
5010 VkImageViewCreateInfo ivci = {
5011 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5012 nullptr,
5013 0,
5014 image,
5015 VK_IMAGE_VIEW_TYPE_2D,
5016 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005017 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005018 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5019 };
5020 VkImageView view;
5021 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5022 ASSERT_VK_SUCCESS(err);
5023
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005024 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005025 VkFramebuffer fb;
5026 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5027 ASSERT_VK_SUCCESS(err);
5028
5029 // Just use default renderpass with our framebuffer
5030 m_renderPassBeginInfo.framebuffer = fb;
Jeremy Hayesba817e12017-03-03 15:51:11 -07005031 m_renderPassBeginInfo.renderArea.extent.width = 32;
5032 m_renderPassBeginInfo.renderArea.extent.height = 32;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005033 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005034 m_commandBuffer->BeginCommandBuffer();
5035 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5036 m_commandBuffer->EndRenderPass();
5037 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005038 // Destroy image attached to framebuffer to invalidate cmd buffer
5039 vkDestroyImage(m_device->device(), image, NULL);
5040 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005041 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005042 QueueCommandBuffer(false);
5043 m_errorMonitor->VerifyFound();
5044
5045 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5046 vkDestroyImageView(m_device->device(), view, nullptr);
5047 vkFreeMemory(m_device->device(), image_memory, nullptr);
5048}
5049
Tobin Ehlisb329f992016-10-12 13:20:29 -06005050TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
5051 TEST_DESCRIPTION("Delete in-use framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005052 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb329f992016-10-12 13:20:29 -06005053 VkFormatProperties format_properties;
5054 VkResult err = VK_SUCCESS;
5055 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5056
Tobin Ehlisb329f992016-10-12 13:20:29 -06005057 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5058
5059 VkImageObj image(m_device);
5060 image.init(256, 256, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
5061 ASSERT_TRUE(image.initialized());
5062 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5063
5064 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5065 VkFramebuffer fb;
5066 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5067 ASSERT_VK_SUCCESS(err);
5068
5069 // Just use default renderpass with our framebuffer
5070 m_renderPassBeginInfo.framebuffer = fb;
5071 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005072 m_commandBuffer->BeginCommandBuffer();
5073 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5074 m_commandBuffer->EndRenderPass();
5075 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisb329f992016-10-12 13:20:29 -06005076 // Submit cmd buffer to put it in-flight
5077 VkSubmitInfo submit_info = {};
5078 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5079 submit_info.commandBufferCount = 1;
5080 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5081 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5082 // Destroy framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005083 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00422);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005084 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5085 m_errorMonitor->VerifyFound();
5086 // Wait for queue to complete so we can safely destroy everything
5087 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005088 m_errorMonitor->SetUnexpectedError("If framebuffer is not VK_NULL_HANDLE, framebuffer must be a valid VkFramebuffer handle");
5089 m_errorMonitor->SetUnexpectedError("Unable to remove Framebuffer obj");
Tobin Ehlisb329f992016-10-12 13:20:29 -06005090 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5091}
5092
Tobin Ehlis88becd72016-09-21 14:33:41 -06005093TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
5094 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005095 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis88becd72016-09-21 14:33:41 -06005096 VkFormatProperties format_properties;
5097 VkResult err = VK_SUCCESS;
5098 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005099
Tobin Ehlis88becd72016-09-21 14:33:41 -06005100 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5101
5102 VkImageCreateInfo image_ci = {};
5103 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5104 image_ci.pNext = NULL;
5105 image_ci.imageType = VK_IMAGE_TYPE_2D;
5106 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5107 image_ci.extent.width = 256;
5108 image_ci.extent.height = 256;
5109 image_ci.extent.depth = 1;
5110 image_ci.mipLevels = 1;
5111 image_ci.arrayLayers = 1;
5112 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5113 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06005114 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06005115 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5116 image_ci.flags = 0;
5117 VkImage image;
5118 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
5119
5120 VkMemoryRequirements memory_reqs;
5121 VkDeviceMemory image_memory;
5122 bool pass;
5123 VkMemoryAllocateInfo memory_info = {};
5124 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5125 memory_info.pNext = NULL;
5126 memory_info.allocationSize = 0;
5127 memory_info.memoryTypeIndex = 0;
5128 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5129 memory_info.allocationSize = memory_reqs.size;
5130 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5131 ASSERT_TRUE(pass);
5132 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5133 ASSERT_VK_SUCCESS(err);
5134 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5135 ASSERT_VK_SUCCESS(err);
5136
5137 VkImageViewCreateInfo ivci = {
5138 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5139 nullptr,
5140 0,
5141 image,
5142 VK_IMAGE_VIEW_TYPE_2D,
5143 VK_FORMAT_B8G8R8A8_UNORM,
5144 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
5145 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5146 };
5147 VkImageView view;
5148 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5149 ASSERT_VK_SUCCESS(err);
5150
5151 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5152 VkFramebuffer fb;
5153 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5154 ASSERT_VK_SUCCESS(err);
5155
5156 // Just use default renderpass with our framebuffer
5157 m_renderPassBeginInfo.framebuffer = fb;
5158 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005159 m_commandBuffer->BeginCommandBuffer();
5160 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5161 m_commandBuffer->EndRenderPass();
5162 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis88becd72016-09-21 14:33:41 -06005163 // Submit cmd buffer to put it (and attached imageView) in-flight
5164 VkSubmitInfo submit_info = {};
5165 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5166 submit_info.commandBufferCount = 1;
5167 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5168 // Submit cmd buffer to put framebuffer and children in-flight
5169 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5170 // Destroy image attached to framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00743);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005172 vkDestroyImage(m_device->device(), image, NULL);
5173 m_errorMonitor->VerifyFound();
5174 // Wait for queue to complete so we can safely destroy image and other objects
5175 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005176 m_errorMonitor->SetUnexpectedError("If image is not VK_NULL_HANDLE, image must be a valid VkImage handle");
5177 m_errorMonitor->SetUnexpectedError("Unable to remove Image obj");
Tobin Ehlis88becd72016-09-21 14:33:41 -06005178 vkDestroyImage(m_device->device(), image, NULL);
5179 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5180 vkDestroyImageView(m_device->device(), view, nullptr);
5181 vkFreeMemory(m_device->device(), image_memory, nullptr);
5182}
5183
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005184TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
5185 TEST_DESCRIPTION("Delete in-use renderPass.");
5186
Tony Barbour1fa09702017-03-16 12:09:08 -06005187 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005188 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5189
5190 // Create simple renderpass
5191 VkAttachmentReference attach = {};
5192 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
5193 VkSubpassDescription subpass = {};
Dave Houlton756e6742017-03-23 14:33:22 -06005194 subpass.colorAttachmentCount = 1;
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005195 subpass.pColorAttachments = &attach;
5196 VkRenderPassCreateInfo rpci = {};
5197 rpci.subpassCount = 1;
5198 rpci.pSubpasses = &subpass;
5199 rpci.attachmentCount = 1;
5200 VkAttachmentDescription attach_desc = {};
5201 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
5202 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
5203 rpci.pAttachments = &attach_desc;
5204 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5205 VkRenderPass rp;
5206 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5207 ASSERT_VK_SUCCESS(err);
5208
5209 // Create a pipeline that uses the given renderpass
5210 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5211 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5212
5213 VkPipelineLayout pipeline_layout;
5214 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5215 ASSERT_VK_SUCCESS(err);
5216
5217 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5218 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5219 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005220 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005221 vp_state_ci.pViewports = &vp;
5222 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005223 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005224 vp_state_ci.pScissors = &scissors;
5225
5226 VkPipelineShaderStageCreateInfo shaderStages[2];
5227 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5228
5229 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005230 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005231 // but add it to be able to run on more devices
5232 shaderStages[0] = vs.GetStageCreateInfo();
5233 shaderStages[1] = fs.GetStageCreateInfo();
5234
5235 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5236 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5237
5238 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5239 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5240 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5241
5242 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5243 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5244 rs_ci.rasterizerDiscardEnable = true;
5245 rs_ci.lineWidth = 1.0f;
5246
5247 VkPipelineColorBlendAttachmentState att = {};
5248 att.blendEnable = VK_FALSE;
5249 att.colorWriteMask = 0xf;
5250
5251 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5252 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5253 cb_ci.attachmentCount = 1;
5254 cb_ci.pAttachments = &att;
5255
5256 VkGraphicsPipelineCreateInfo gp_ci = {};
5257 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5258 gp_ci.stageCount = 2;
5259 gp_ci.pStages = shaderStages;
5260 gp_ci.pVertexInputState = &vi_ci;
5261 gp_ci.pInputAssemblyState = &ia_ci;
5262 gp_ci.pViewportState = &vp_state_ci;
5263 gp_ci.pRasterizationState = &rs_ci;
5264 gp_ci.pColorBlendState = &cb_ci;
5265 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5266 gp_ci.layout = pipeline_layout;
5267 gp_ci.renderPass = rp;
5268
5269 VkPipelineCacheCreateInfo pc_ci = {};
5270 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5271
Dave Houlton756e6742017-03-23 14:33:22 -06005272 m_errorMonitor->ExpectSuccess();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005273 VkPipeline pipeline;
5274 VkPipelineCache pipe_cache;
5275 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
5276 ASSERT_VK_SUCCESS(err);
5277
5278 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
5279 ASSERT_VK_SUCCESS(err);
Dave Houlton756e6742017-03-23 14:33:22 -06005280
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005281 // Bind pipeline to cmd buffer, will also bind renderpass
5282 m_commandBuffer->BeginCommandBuffer();
5283 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5284 m_commandBuffer->EndCommandBuffer();
5285
5286 VkSubmitInfo submit_info = {};
5287 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5288 submit_info.commandBufferCount = 1;
5289 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5290 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houlton756e6742017-03-23 14:33:22 -06005291 m_errorMonitor->VerifyNotFound();
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005292
5293 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
5294 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5295 m_errorMonitor->VerifyFound();
5296
5297 // Wait for queue to complete so we can safely destroy everything
5298 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005299 m_errorMonitor->SetUnexpectedError("If renderPass is not VK_NULL_HANDLE, renderPass must be a valid VkRenderPass handle");
5300 m_errorMonitor->SetUnexpectedError("Unable to remove Render Pass obj");
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005301 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5302 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5303 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
5304 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
5305}
5306
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005307TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005308 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005309 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005310
5311 VkImage image;
5312 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5313 VkImageCreateInfo image_create_info = {};
5314 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5315 image_create_info.pNext = NULL;
5316 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5317 image_create_info.format = tex_format;
5318 image_create_info.extent.width = 32;
5319 image_create_info.extent.height = 32;
5320 image_create_info.extent.depth = 1;
5321 image_create_info.mipLevels = 1;
5322 image_create_info.arrayLayers = 1;
5323 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5324 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005325 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005326 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005327 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005328 ASSERT_VK_SUCCESS(err);
5329 // Have to bind memory to image before recording cmd in cmd buffer using it
5330 VkMemoryRequirements mem_reqs;
5331 VkDeviceMemory image_mem;
5332 bool pass;
5333 VkMemoryAllocateInfo mem_alloc = {};
5334 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5335 mem_alloc.pNext = NULL;
5336 mem_alloc.memoryTypeIndex = 0;
5337 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
5338 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005339 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005340 ASSERT_TRUE(pass);
5341 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
5342 ASSERT_VK_SUCCESS(err);
5343
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005344 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
5345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005346 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005347
5348 m_commandBuffer->BeginCommandBuffer();
5349 VkClearColorValue ccv;
5350 ccv.float32[0] = 1.0f;
5351 ccv.float32[1] = 1.0f;
5352 ccv.float32[2] = 1.0f;
5353 ccv.float32[3] = 1.0f;
5354 VkImageSubresourceRange isr = {};
5355 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5356 isr.baseArrayLayer = 0;
5357 isr.baseMipLevel = 0;
5358 isr.layerCount = 1;
5359 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005360 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005361 m_commandBuffer->EndCommandBuffer();
5362
5363 m_errorMonitor->VerifyFound();
5364 vkDestroyImage(m_device->device(), image, NULL);
5365 vkFreeMemory(m_device->device(), image_mem, nullptr);
5366}
5367
5368TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005369 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005370 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005371
5372 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005373 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005374 VK_IMAGE_TILING_OPTIMAL, 0);
5375 ASSERT_TRUE(image.initialized());
5376
5377 VkBuffer buffer;
5378 VkDeviceMemory mem;
5379 VkMemoryRequirements mem_reqs;
5380
5381 VkBufferCreateInfo buf_info = {};
5382 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12005383 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005384 buf_info.size = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005385 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5386 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
5387 ASSERT_VK_SUCCESS(err);
5388
5389 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
5390
5391 VkMemoryAllocateInfo alloc_info = {};
5392 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005393 alloc_info.allocationSize = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005394 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005395 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005396 if (!pass) {
5397 vkDestroyBuffer(m_device->device(), buffer, NULL);
5398 return;
5399 }
5400 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
5401 ASSERT_VK_SUCCESS(err);
5402
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005403 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5404 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005405 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005406 VkBufferImageCopy region = {};
Mark Lobodzinski80871462017-02-16 10:37:27 -07005407 region.bufferRowLength = 16;
5408 region.bufferImageHeight = 16;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005409 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5410
5411 region.imageSubresource.layerCount = 1;
5412 region.imageExtent.height = 4;
5413 region.imageExtent.width = 4;
5414 region.imageExtent.depth = 1;
5415 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005416 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5417 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005418 m_commandBuffer->EndCommandBuffer();
5419
5420 m_errorMonitor->VerifyFound();
5421
5422 vkDestroyBuffer(m_device->device(), buffer, NULL);
5423 vkFreeMemory(m_device->handle(), mem, NULL);
5424}
5425
Tobin Ehlis85940f52016-07-07 16:57:21 -06005426TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005427 TEST_DESCRIPTION(
5428 "Attempt to draw with a command buffer that is invalid "
5429 "due to an event dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005430 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85940f52016-07-07 16:57:21 -06005431
5432 VkEvent event;
5433 VkEventCreateInfo evci = {};
5434 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5435 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
5436 ASSERT_VK_SUCCESS(result);
5437
5438 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005439 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06005440 m_commandBuffer->EndCommandBuffer();
5441
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005442 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005443 // Destroy event dependency prior to submit to cause ERROR
5444 vkDestroyEvent(m_device->device(), event, NULL);
5445
5446 VkSubmitInfo submit_info = {};
5447 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5448 submit_info.commandBufferCount = 1;
5449 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5450 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5451
5452 m_errorMonitor->VerifyFound();
5453}
5454
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005455TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005456 TEST_DESCRIPTION(
5457 "Attempt to draw with a command buffer that is invalid "
5458 "due to a query pool dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005459 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005460
5461 VkQueryPool query_pool;
5462 VkQueryPoolCreateInfo qpci{};
5463 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5464 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
5465 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005466 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005467 ASSERT_VK_SUCCESS(result);
5468
5469 m_commandBuffer->BeginCommandBuffer();
5470 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
5471 m_commandBuffer->EndCommandBuffer();
5472
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005473 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound query pool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005474 // Destroy query pool dependency prior to submit to cause ERROR
5475 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
5476
5477 VkSubmitInfo submit_info = {};
5478 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5479 submit_info.commandBufferCount = 1;
5480 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5481 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5482
5483 m_errorMonitor->VerifyFound();
5484}
5485
Tobin Ehlis24130d92016-07-08 15:50:53 -06005486TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005487 TEST_DESCRIPTION(
5488 "Attempt to draw with a command buffer that is invalid "
5489 "due to a pipeline dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005490 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis24130d92016-07-08 15:50:53 -06005491 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5492
5493 VkResult err;
5494
5495 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5496 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5497
5498 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005499 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005500 ASSERT_VK_SUCCESS(err);
5501
5502 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5503 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5504 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005505 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06005506 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005507 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005508 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis24130d92016-07-08 15:50:53 -06005509 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005510
5511 VkPipelineShaderStageCreateInfo shaderStages[2];
5512 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5513
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005514 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005515 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005516 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06005517 shaderStages[0] = vs.GetStageCreateInfo();
5518 shaderStages[1] = fs.GetStageCreateInfo();
5519
5520 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5521 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5522
5523 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5524 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5525 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5526
5527 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5528 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12005529 rs_ci.rasterizerDiscardEnable = true;
5530 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005531
5532 VkPipelineColorBlendAttachmentState att = {};
5533 att.blendEnable = VK_FALSE;
5534 att.colorWriteMask = 0xf;
5535
5536 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5537 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5538 cb_ci.attachmentCount = 1;
5539 cb_ci.pAttachments = &att;
5540
5541 VkGraphicsPipelineCreateInfo gp_ci = {};
5542 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5543 gp_ci.stageCount = 2;
5544 gp_ci.pStages = shaderStages;
5545 gp_ci.pVertexInputState = &vi_ci;
5546 gp_ci.pInputAssemblyState = &ia_ci;
5547 gp_ci.pViewportState = &vp_state_ci;
5548 gp_ci.pRasterizationState = &rs_ci;
5549 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005550 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5551 gp_ci.layout = pipeline_layout;
5552 gp_ci.renderPass = renderPass();
5553
5554 VkPipelineCacheCreateInfo pc_ci = {};
5555 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5556
5557 VkPipeline pipeline;
5558 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005559 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005560 ASSERT_VK_SUCCESS(err);
5561
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005562 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005563 ASSERT_VK_SUCCESS(err);
5564
5565 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005566 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005567 m_commandBuffer->EndCommandBuffer();
5568 // Now destroy pipeline in order to cause error when submitting
5569 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5570
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005571 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005572
5573 VkSubmitInfo submit_info = {};
5574 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5575 submit_info.commandBufferCount = 1;
5576 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5577 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5578
5579 m_errorMonitor->VerifyFound();
5580 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5581 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5582}
5583
Tobin Ehlis31289162016-08-17 14:57:58 -06005584TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005585 TEST_DESCRIPTION(
5586 "Attempt to draw with a command buffer that is invalid "
5587 "due to a bound descriptor set with a buffer dependency "
5588 "being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005589 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis31289162016-08-17 14:57:58 -06005590 ASSERT_NO_FATAL_FAILURE(InitViewport());
5591 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5592
5593 VkDescriptorPoolSize ds_type_count = {};
5594 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5595 ds_type_count.descriptorCount = 1;
5596
5597 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5598 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5599 ds_pool_ci.pNext = NULL;
5600 ds_pool_ci.maxSets = 1;
5601 ds_pool_ci.poolSizeCount = 1;
5602 ds_pool_ci.pPoolSizes = &ds_type_count;
5603
5604 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005605 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06005606 ASSERT_VK_SUCCESS(err);
5607
5608 VkDescriptorSetLayoutBinding dsl_binding = {};
5609 dsl_binding.binding = 0;
5610 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5611 dsl_binding.descriptorCount = 1;
5612 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5613 dsl_binding.pImmutableSamplers = NULL;
5614
5615 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5616 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5617 ds_layout_ci.pNext = NULL;
5618 ds_layout_ci.bindingCount = 1;
5619 ds_layout_ci.pBindings = &dsl_binding;
5620 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005621 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005622 ASSERT_VK_SUCCESS(err);
5623
5624 VkDescriptorSet descriptorSet;
5625 VkDescriptorSetAllocateInfo alloc_info = {};
5626 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5627 alloc_info.descriptorSetCount = 1;
5628 alloc_info.descriptorPool = ds_pool;
5629 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005630 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005631 ASSERT_VK_SUCCESS(err);
5632
5633 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5634 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5635 pipeline_layout_ci.pNext = NULL;
5636 pipeline_layout_ci.setLayoutCount = 1;
5637 pipeline_layout_ci.pSetLayouts = &ds_layout;
5638
5639 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005640 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005641 ASSERT_VK_SUCCESS(err);
5642
5643 // Create a buffer to update the descriptor with
5644 uint32_t qfi = 0;
5645 VkBufferCreateInfo buffCI = {};
5646 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5647 buffCI.size = 1024;
5648 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5649 buffCI.queueFamilyIndexCount = 1;
5650 buffCI.pQueueFamilyIndices = &qfi;
5651
5652 VkBuffer buffer;
5653 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5654 ASSERT_VK_SUCCESS(err);
5655 // Allocate memory and bind to buffer so we can make it to the appropriate
5656 // error
5657 VkMemoryAllocateInfo mem_alloc = {};
5658 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5659 mem_alloc.pNext = NULL;
5660 mem_alloc.allocationSize = 1024;
5661 mem_alloc.memoryTypeIndex = 0;
5662
5663 VkMemoryRequirements memReqs;
5664 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005665 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005666 if (!pass) {
5667 vkDestroyBuffer(m_device->device(), buffer, NULL);
5668 return;
5669 }
5670
5671 VkDeviceMemory mem;
5672 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5673 ASSERT_VK_SUCCESS(err);
5674 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5675 ASSERT_VK_SUCCESS(err);
5676 // Correctly update descriptor to avoid "NOT_UPDATED" error
5677 VkDescriptorBufferInfo buffInfo = {};
5678 buffInfo.buffer = buffer;
5679 buffInfo.offset = 0;
5680 buffInfo.range = 1024;
5681
5682 VkWriteDescriptorSet descriptor_write;
5683 memset(&descriptor_write, 0, sizeof(descriptor_write));
5684 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5685 descriptor_write.dstSet = descriptorSet;
5686 descriptor_write.dstBinding = 0;
5687 descriptor_write.descriptorCount = 1;
5688 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5689 descriptor_write.pBufferInfo = &buffInfo;
5690
5691 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5692
5693 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005694 char const *vsSource =
5695 "#version 450\n"
5696 "\n"
5697 "out gl_PerVertex { \n"
5698 " vec4 gl_Position;\n"
5699 "};\n"
5700 "void main(){\n"
5701 " gl_Position = vec4(1);\n"
5702 "}\n";
5703 char const *fsSource =
5704 "#version 450\n"
5705 "\n"
5706 "layout(location=0) out vec4 x;\n"
5707 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5708 "void main(){\n"
5709 " x = vec4(bar.y);\n"
5710 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005711 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5712 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5713 VkPipelineObj pipe(m_device);
5714 pipe.AddShader(&vs);
5715 pipe.AddShader(&fs);
5716 pipe.AddColorAttachment();
5717 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5718
Tony Barbour552f6c02016-12-21 14:34:07 -07005719 m_commandBuffer->BeginCommandBuffer();
5720 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005721 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5722 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5723 &descriptorSet, 0, NULL);
Rene Lindsay0583ac92017-01-16 14:29:10 -07005724
5725 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
5726 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
5727
Tobin Ehlis31289162016-08-17 14:57:58 -06005728 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005729 m_commandBuffer->EndRenderPass();
5730 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005732 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5733 vkDestroyBuffer(m_device->device(), buffer, NULL);
5734 // Attempt to submit cmd buffer
5735 VkSubmitInfo submit_info = {};
5736 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5737 submit_info.commandBufferCount = 1;
5738 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5739 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5740 m_errorMonitor->VerifyFound();
5741 // Cleanup
5742 vkFreeMemory(m_device->device(), mem, NULL);
5743
5744 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5745 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5746 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5747}
5748
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005749TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005750 TEST_DESCRIPTION(
5751 "Attempt to draw with a command buffer that is invalid "
5752 "due to a bound descriptor sets with a combined image "
5753 "sampler having their image, sampler, and descriptor set "
5754 "each respectively destroyed and then attempting to "
5755 "submit associated cmd buffers. Attempt to destroy a "
5756 "DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005757 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005758 ASSERT_NO_FATAL_FAILURE(InitViewport());
5759 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5760
5761 VkDescriptorPoolSize ds_type_count = {};
5762 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5763 ds_type_count.descriptorCount = 1;
5764
5765 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5766 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5767 ds_pool_ci.pNext = NULL;
Rene Lindsayed88b732017-01-27 15:55:29 -07005768 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005769 ds_pool_ci.maxSets = 1;
5770 ds_pool_ci.poolSizeCount = 1;
5771 ds_pool_ci.pPoolSizes = &ds_type_count;
5772
5773 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005774 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005775 ASSERT_VK_SUCCESS(err);
5776
5777 VkDescriptorSetLayoutBinding dsl_binding = {};
5778 dsl_binding.binding = 0;
5779 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5780 dsl_binding.descriptorCount = 1;
5781 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5782 dsl_binding.pImmutableSamplers = NULL;
5783
5784 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5785 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5786 ds_layout_ci.pNext = NULL;
5787 ds_layout_ci.bindingCount = 1;
5788 ds_layout_ci.pBindings = &dsl_binding;
5789 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005790 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005791 ASSERT_VK_SUCCESS(err);
5792
5793 VkDescriptorSet descriptorSet;
5794 VkDescriptorSetAllocateInfo alloc_info = {};
5795 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5796 alloc_info.descriptorSetCount = 1;
5797 alloc_info.descriptorPool = ds_pool;
5798 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005799 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005800 ASSERT_VK_SUCCESS(err);
5801
5802 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5803 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5804 pipeline_layout_ci.pNext = NULL;
5805 pipeline_layout_ci.setLayoutCount = 1;
5806 pipeline_layout_ci.pSetLayouts = &ds_layout;
5807
5808 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005809 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005810 ASSERT_VK_SUCCESS(err);
5811
5812 // Create images to update the descriptor with
5813 VkImage image;
5814 VkImage image2;
5815 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5816 const int32_t tex_width = 32;
5817 const int32_t tex_height = 32;
5818 VkImageCreateInfo image_create_info = {};
5819 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5820 image_create_info.pNext = NULL;
5821 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5822 image_create_info.format = tex_format;
5823 image_create_info.extent.width = tex_width;
5824 image_create_info.extent.height = tex_height;
5825 image_create_info.extent.depth = 1;
5826 image_create_info.mipLevels = 1;
5827 image_create_info.arrayLayers = 1;
5828 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5829 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5830 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5831 image_create_info.flags = 0;
5832 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5833 ASSERT_VK_SUCCESS(err);
5834 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5835 ASSERT_VK_SUCCESS(err);
5836
5837 VkMemoryRequirements memory_reqs;
5838 VkDeviceMemory image_memory;
5839 bool pass;
5840 VkMemoryAllocateInfo memory_info = {};
5841 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5842 memory_info.pNext = NULL;
5843 memory_info.allocationSize = 0;
5844 memory_info.memoryTypeIndex = 0;
5845 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5846 // Allocate enough memory for both images
5847 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005848 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005849 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005850 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005851 ASSERT_VK_SUCCESS(err);
5852 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5853 ASSERT_VK_SUCCESS(err);
5854 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005855 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005856 ASSERT_VK_SUCCESS(err);
5857
5858 VkImageViewCreateInfo image_view_create_info = {};
5859 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5860 image_view_create_info.image = image;
5861 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5862 image_view_create_info.format = tex_format;
5863 image_view_create_info.subresourceRange.layerCount = 1;
5864 image_view_create_info.subresourceRange.baseMipLevel = 0;
5865 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005866 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005867
5868 VkImageView view;
5869 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005870 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005871 ASSERT_VK_SUCCESS(err);
5872 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005873 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005874 ASSERT_VK_SUCCESS(err);
5875 // Create Samplers
5876 VkSamplerCreateInfo sampler_ci = {};
5877 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5878 sampler_ci.pNext = NULL;
5879 sampler_ci.magFilter = VK_FILTER_NEAREST;
5880 sampler_ci.minFilter = VK_FILTER_NEAREST;
5881 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5882 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5883 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5884 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5885 sampler_ci.mipLodBias = 1.0;
5886 sampler_ci.anisotropyEnable = VK_FALSE;
5887 sampler_ci.maxAnisotropy = 1;
5888 sampler_ci.compareEnable = VK_FALSE;
5889 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5890 sampler_ci.minLod = 1.0;
5891 sampler_ci.maxLod = 1.0;
5892 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5893 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5894 VkSampler sampler;
5895 VkSampler sampler2;
5896 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5897 ASSERT_VK_SUCCESS(err);
5898 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5899 ASSERT_VK_SUCCESS(err);
5900 // Update descriptor with image and sampler
5901 VkDescriptorImageInfo img_info = {};
5902 img_info.sampler = sampler;
5903 img_info.imageView = view;
5904 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5905
5906 VkWriteDescriptorSet descriptor_write;
5907 memset(&descriptor_write, 0, sizeof(descriptor_write));
5908 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5909 descriptor_write.dstSet = descriptorSet;
5910 descriptor_write.dstBinding = 0;
5911 descriptor_write.descriptorCount = 1;
5912 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5913 descriptor_write.pImageInfo = &img_info;
5914
5915 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5916
5917 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005918 char const *vsSource =
5919 "#version 450\n"
5920 "\n"
5921 "out gl_PerVertex { \n"
5922 " vec4 gl_Position;\n"
5923 "};\n"
5924 "void main(){\n"
5925 " gl_Position = vec4(1);\n"
5926 "}\n";
5927 char const *fsSource =
5928 "#version 450\n"
5929 "\n"
5930 "layout(set=0, binding=0) uniform sampler2D s;\n"
5931 "layout(location=0) out vec4 x;\n"
5932 "void main(){\n"
5933 " x = texture(s, vec2(1));\n"
5934 "}\n";
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005935 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5936 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5937 VkPipelineObj pipe(m_device);
5938 pipe.AddShader(&vs);
5939 pipe.AddShader(&fs);
5940 pipe.AddColorAttachment();
5941 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5942
5943 // First error case is destroying sampler prior to cmd buffer submission
Jeremy Hayesb91c79d2017-02-27 15:09:03 -07005944 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound sampler");
Tony Barbour552f6c02016-12-21 14:34:07 -07005945 m_commandBuffer->BeginCommandBuffer();
5946 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005947 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5948 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5949 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005950 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5951 VkRect2D scissor = {{0, 0}, {16, 16}};
5952 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5953 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005954 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005955 m_commandBuffer->EndRenderPass();
5956 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005957 // Destroy sampler invalidates the cmd buffer, causing error on submit
5958 vkDestroySampler(m_device->device(), sampler, NULL);
5959 // Attempt to submit cmd buffer
5960 VkSubmitInfo submit_info = {};
5961 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5962 submit_info.commandBufferCount = 1;
5963 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5964 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5965 m_errorMonitor->VerifyFound();
Rene Lindsaya31285f2017-01-11 16:35:53 -07005966
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005967 // Now re-update descriptor with valid sampler and delete image
5968 img_info.sampler = sampler2;
5969 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005970
5971 VkCommandBufferBeginInfo info = {};
5972 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5973 info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
5974
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005975 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Rene Lindsayed88b732017-01-27 15:55:29 -07005976 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005977 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005978 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5979 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5980 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005981 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5982 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005983 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005984 m_commandBuffer->EndRenderPass();
5985 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005986 // Destroy image invalidates the cmd buffer, causing error on submit
5987 vkDestroyImage(m_device->device(), image, NULL);
5988 // Attempt to submit cmd buffer
5989 submit_info = {};
5990 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5991 submit_info.commandBufferCount = 1;
5992 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5993 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5994 m_errorMonitor->VerifyFound();
5995 // Now update descriptor to be valid, but then free descriptor
5996 img_info.imageView = view2;
5997 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005998 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005999 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006000 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6001 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6002 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006003 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6004 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006005 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006006 m_commandBuffer->EndRenderPass();
6007 m_commandBuffer->EndCommandBuffer();
Tony Barbourc373c012017-01-26 10:53:28 -07006008 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -07006009
6010 // Immediately try to destroy the descriptor set in the active command buffer - failure expected
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006012 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06006013 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006014
6015 // Try again once the queue is idle - should succeed w/o error
Dave Houltond5507dd2017-01-24 15:29:02 -07006016 // TODO - though the particular error above doesn't re-occur, there are other 'unexpecteds' still to clean up
Dave Houltonfbf52152017-01-06 12:55:29 -07006017 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006018 m_errorMonitor->SetUnexpectedError(
6019 "pDescriptorSets must be a pointer to an array of descriptorSetCount VkDescriptorSet handles, each element of which must "
6020 "either be a valid handle or VK_NULL_HANDLE");
6021 m_errorMonitor->SetUnexpectedError("Unable to remove Descriptor Set obj");
Dave Houltonfbf52152017-01-06 12:55:29 -07006022 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
6023
6024 // Attempt to submit cmd buffer containing the freed descriptor set
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006025 submit_info = {};
6026 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6027 submit_info.commandBufferCount = 1;
6028 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07006029 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound descriptor set ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006030 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6031 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006032
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006033 // Cleanup
6034 vkFreeMemory(m_device->device(), image_memory, NULL);
6035 vkDestroySampler(m_device->device(), sampler2, NULL);
6036 vkDestroyImage(m_device->device(), image2, NULL);
6037 vkDestroyImageView(m_device->device(), view, NULL);
6038 vkDestroyImageView(m_device->device(), view2, NULL);
6039 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6040 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6041 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6042}
6043
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006044TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
6045 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006046 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006047 ASSERT_NO_FATAL_FAILURE(InitViewport());
6048 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6049
6050 VkDescriptorPoolSize ds_type_count = {};
6051 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6052 ds_type_count.descriptorCount = 1;
6053
6054 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6055 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6056 ds_pool_ci.pNext = NULL;
6057 ds_pool_ci.maxSets = 1;
6058 ds_pool_ci.poolSizeCount = 1;
6059 ds_pool_ci.pPoolSizes = &ds_type_count;
6060
6061 VkDescriptorPool ds_pool;
6062 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6063 ASSERT_VK_SUCCESS(err);
6064
6065 VkDescriptorSetLayoutBinding dsl_binding = {};
6066 dsl_binding.binding = 0;
6067 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6068 dsl_binding.descriptorCount = 1;
6069 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6070 dsl_binding.pImmutableSamplers = NULL;
6071
6072 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6073 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6074 ds_layout_ci.pNext = NULL;
6075 ds_layout_ci.bindingCount = 1;
6076 ds_layout_ci.pBindings = &dsl_binding;
6077 VkDescriptorSetLayout ds_layout;
6078 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6079 ASSERT_VK_SUCCESS(err);
6080
6081 VkDescriptorSet descriptor_set;
6082 VkDescriptorSetAllocateInfo alloc_info = {};
6083 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6084 alloc_info.descriptorSetCount = 1;
6085 alloc_info.descriptorPool = ds_pool;
6086 alloc_info.pSetLayouts = &ds_layout;
6087 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
6088 ASSERT_VK_SUCCESS(err);
6089
6090 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6091 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6092 pipeline_layout_ci.pNext = NULL;
6093 pipeline_layout_ci.setLayoutCount = 1;
6094 pipeline_layout_ci.pSetLayouts = &ds_layout;
6095
6096 VkPipelineLayout pipeline_layout;
6097 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6098 ASSERT_VK_SUCCESS(err);
6099
6100 // Create image to update the descriptor with
6101 VkImageObj image(m_device);
6102 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
6103 ASSERT_TRUE(image.initialized());
6104
6105 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
6106 // Create Sampler
6107 VkSamplerCreateInfo sampler_ci = {};
6108 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6109 sampler_ci.pNext = NULL;
6110 sampler_ci.magFilter = VK_FILTER_NEAREST;
6111 sampler_ci.minFilter = VK_FILTER_NEAREST;
6112 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6113 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6114 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6115 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6116 sampler_ci.mipLodBias = 1.0;
6117 sampler_ci.anisotropyEnable = VK_FALSE;
6118 sampler_ci.maxAnisotropy = 1;
6119 sampler_ci.compareEnable = VK_FALSE;
6120 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6121 sampler_ci.minLod = 1.0;
6122 sampler_ci.maxLod = 1.0;
6123 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6124 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6125 VkSampler sampler;
6126 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6127 ASSERT_VK_SUCCESS(err);
6128 // Update descriptor with image and sampler
6129 VkDescriptorImageInfo img_info = {};
6130 img_info.sampler = sampler;
6131 img_info.imageView = view;
6132 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6133
6134 VkWriteDescriptorSet descriptor_write;
6135 memset(&descriptor_write, 0, sizeof(descriptor_write));
6136 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6137 descriptor_write.dstSet = descriptor_set;
6138 descriptor_write.dstBinding = 0;
6139 descriptor_write.descriptorCount = 1;
6140 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6141 descriptor_write.pImageInfo = &img_info;
6142
6143 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6144
6145 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006146 char const *vsSource =
6147 "#version 450\n"
6148 "\n"
6149 "out gl_PerVertex { \n"
6150 " vec4 gl_Position;\n"
6151 "};\n"
6152 "void main(){\n"
6153 " gl_Position = vec4(1);\n"
6154 "}\n";
6155 char const *fsSource =
6156 "#version 450\n"
6157 "\n"
6158 "layout(set=0, binding=0) uniform sampler2D s;\n"
6159 "layout(location=0) out vec4 x;\n"
6160 "void main(){\n"
6161 " x = texture(s, vec2(1));\n"
6162 "}\n";
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006163 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6164 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6165 VkPipelineObj pipe(m_device);
6166 pipe.AddShader(&vs);
6167 pipe.AddShader(&fs);
6168 pipe.AddColorAttachment();
6169 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6170
Tony Barbour552f6c02016-12-21 14:34:07 -07006171 m_commandBuffer->BeginCommandBuffer();
6172 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006173 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6174 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6175 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006176
6177 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6178 VkRect2D scissor = {{0, 0}, {16, 16}};
6179 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6180 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6181
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006182 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006183 m_commandBuffer->EndRenderPass();
6184 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006185 // Submit cmd buffer to put pool in-flight
6186 VkSubmitInfo submit_info = {};
6187 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6188 submit_info.commandBufferCount = 1;
6189 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6190 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6191 // Destroy pool while in-flight, causing error
6192 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete descriptor pool ");
6193 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6194 m_errorMonitor->VerifyFound();
6195 vkQueueWaitIdle(m_device->m_queue);
6196 // Cleanup
6197 vkDestroySampler(m_device->device(), sampler, NULL);
6198 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6199 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006200 m_errorMonitor->SetUnexpectedError(
6201 "If descriptorPool is not VK_NULL_HANDLE, descriptorPool must be a valid VkDescriptorPool handle");
6202 m_errorMonitor->SetUnexpectedError("Unable to remove Descriptor Pool obj");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006203 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006204 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006205}
6206
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006207TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
6208 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006209 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006210 ASSERT_NO_FATAL_FAILURE(InitViewport());
6211 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6212
6213 VkDescriptorPoolSize ds_type_count = {};
6214 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6215 ds_type_count.descriptorCount = 1;
6216
6217 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6218 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6219 ds_pool_ci.pNext = NULL;
6220 ds_pool_ci.maxSets = 1;
6221 ds_pool_ci.poolSizeCount = 1;
6222 ds_pool_ci.pPoolSizes = &ds_type_count;
6223
6224 VkDescriptorPool ds_pool;
6225 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6226 ASSERT_VK_SUCCESS(err);
6227
6228 VkDescriptorSetLayoutBinding dsl_binding = {};
6229 dsl_binding.binding = 0;
6230 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6231 dsl_binding.descriptorCount = 1;
6232 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6233 dsl_binding.pImmutableSamplers = NULL;
6234
6235 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6236 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6237 ds_layout_ci.pNext = NULL;
6238 ds_layout_ci.bindingCount = 1;
6239 ds_layout_ci.pBindings = &dsl_binding;
6240 VkDescriptorSetLayout ds_layout;
6241 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6242 ASSERT_VK_SUCCESS(err);
6243
6244 VkDescriptorSet descriptorSet;
6245 VkDescriptorSetAllocateInfo alloc_info = {};
6246 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6247 alloc_info.descriptorSetCount = 1;
6248 alloc_info.descriptorPool = ds_pool;
6249 alloc_info.pSetLayouts = &ds_layout;
6250 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6251 ASSERT_VK_SUCCESS(err);
6252
6253 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6254 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6255 pipeline_layout_ci.pNext = NULL;
6256 pipeline_layout_ci.setLayoutCount = 1;
6257 pipeline_layout_ci.pSetLayouts = &ds_layout;
6258
6259 VkPipelineLayout pipeline_layout;
6260 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6261 ASSERT_VK_SUCCESS(err);
6262
6263 // Create images to update the descriptor with
6264 VkImage image;
6265 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6266 const int32_t tex_width = 32;
6267 const int32_t tex_height = 32;
6268 VkImageCreateInfo image_create_info = {};
6269 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6270 image_create_info.pNext = NULL;
6271 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6272 image_create_info.format = tex_format;
6273 image_create_info.extent.width = tex_width;
6274 image_create_info.extent.height = tex_height;
6275 image_create_info.extent.depth = 1;
6276 image_create_info.mipLevels = 1;
6277 image_create_info.arrayLayers = 1;
6278 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6279 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6280 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6281 image_create_info.flags = 0;
6282 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6283 ASSERT_VK_SUCCESS(err);
6284 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
6285 VkMemoryRequirements memory_reqs;
6286 VkDeviceMemory image_memory;
6287 bool pass;
6288 VkMemoryAllocateInfo memory_info = {};
6289 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6290 memory_info.pNext = NULL;
6291 memory_info.allocationSize = 0;
6292 memory_info.memoryTypeIndex = 0;
6293 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
6294 // Allocate enough memory for image
6295 memory_info.allocationSize = memory_reqs.size;
6296 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
6297 ASSERT_TRUE(pass);
6298 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
6299 ASSERT_VK_SUCCESS(err);
6300 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
6301 ASSERT_VK_SUCCESS(err);
6302
6303 VkImageViewCreateInfo image_view_create_info = {};
6304 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6305 image_view_create_info.image = image;
6306 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6307 image_view_create_info.format = tex_format;
6308 image_view_create_info.subresourceRange.layerCount = 1;
6309 image_view_create_info.subresourceRange.baseMipLevel = 0;
6310 image_view_create_info.subresourceRange.levelCount = 1;
6311 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6312
6313 VkImageView view;
6314 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6315 ASSERT_VK_SUCCESS(err);
6316 // Create Samplers
6317 VkSamplerCreateInfo sampler_ci = {};
6318 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6319 sampler_ci.pNext = NULL;
6320 sampler_ci.magFilter = VK_FILTER_NEAREST;
6321 sampler_ci.minFilter = VK_FILTER_NEAREST;
6322 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6323 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6324 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6325 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6326 sampler_ci.mipLodBias = 1.0;
6327 sampler_ci.anisotropyEnable = VK_FALSE;
6328 sampler_ci.maxAnisotropy = 1;
6329 sampler_ci.compareEnable = VK_FALSE;
6330 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6331 sampler_ci.minLod = 1.0;
6332 sampler_ci.maxLod = 1.0;
6333 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6334 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6335 VkSampler sampler;
6336 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6337 ASSERT_VK_SUCCESS(err);
6338 // Update descriptor with image and sampler
6339 VkDescriptorImageInfo img_info = {};
6340 img_info.sampler = sampler;
6341 img_info.imageView = view;
6342 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6343
6344 VkWriteDescriptorSet descriptor_write;
6345 memset(&descriptor_write, 0, sizeof(descriptor_write));
6346 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6347 descriptor_write.dstSet = descriptorSet;
6348 descriptor_write.dstBinding = 0;
6349 descriptor_write.descriptorCount = 1;
6350 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6351 descriptor_write.pImageInfo = &img_info;
6352 // Break memory binding and attempt update
6353 vkFreeMemory(m_device->device(), image_memory, nullptr);
6354 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006355 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006356 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6357 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
6358 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6359 m_errorMonitor->VerifyFound();
6360 // Cleanup
6361 vkDestroyImage(m_device->device(), image, NULL);
6362 vkDestroySampler(m_device->device(), sampler, NULL);
6363 vkDestroyImageView(m_device->device(), view, NULL);
6364 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6365 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6366 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6367}
6368
Karl Schultz6addd812016-02-02 17:17:23 -07006369TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006370 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6371 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006372 // Create a valid cmd buffer
6373 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006374 uint64_t fake_pipeline_handle = 0xbaad6001;
6375 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Tony Barbour1fa09702017-03-16 12:09:08 -06006376 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006377 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6378
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006379 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07006380 m_commandBuffer->BeginCommandBuffer();
6381 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006382 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06006383 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006384
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006385 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006386 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006387 Draw(1, 0, 0, 0);
6388 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006389
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006390 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006391 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006392 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006393 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6394 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006395}
6396
Karl Schultz6addd812016-02-02 17:17:23 -07006397TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06006398 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07006399 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006400
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006401 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006402
Tony Barbour1fa09702017-03-16 12:09:08 -06006403 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006404 ASSERT_NO_FATAL_FAILURE(InitViewport());
6405 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006406 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006407 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6408 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006409
6410 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006411 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6412 ds_pool_ci.pNext = NULL;
6413 ds_pool_ci.maxSets = 1;
6414 ds_pool_ci.poolSizeCount = 1;
6415 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006416
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006417 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006418 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006419 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006420
Tony Barboureb254902015-07-15 12:50:33 -06006421 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006422 dsl_binding.binding = 0;
6423 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6424 dsl_binding.descriptorCount = 1;
6425 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6426 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006427
Tony Barboureb254902015-07-15 12:50:33 -06006428 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006429 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6430 ds_layout_ci.pNext = NULL;
6431 ds_layout_ci.bindingCount = 1;
6432 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006433 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006434 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006435 ASSERT_VK_SUCCESS(err);
6436
6437 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006438 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006439 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006440 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006441 alloc_info.descriptorPool = ds_pool;
6442 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006443 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006444 ASSERT_VK_SUCCESS(err);
6445
Tony Barboureb254902015-07-15 12:50:33 -06006446 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006447 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6448 pipeline_layout_ci.pNext = NULL;
6449 pipeline_layout_ci.setLayoutCount = 1;
6450 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006451
6452 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006453 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006454 ASSERT_VK_SUCCESS(err);
6455
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006456 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006457 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006458 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006459 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006460
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006461 VkPipelineObj pipe(m_device);
6462 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006463 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006464 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006465 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006466
Tony Barbour552f6c02016-12-21 14:34:07 -07006467 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006468 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6469 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6470 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006471
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006472 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006473
Chia-I Wuf7458c52015-10-26 21:10:41 +08006474 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6475 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6476 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006477}
6478
Karl Schultz6addd812016-02-02 17:17:23 -07006479TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006480 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006481 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006482
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006483 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006484
Tony Barbour1fa09702017-03-16 12:09:08 -06006485 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006486 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006487 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6488 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006489
6490 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006491 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6492 ds_pool_ci.pNext = NULL;
6493 ds_pool_ci.maxSets = 1;
6494 ds_pool_ci.poolSizeCount = 1;
6495 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006496
6497 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006498 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006499 ASSERT_VK_SUCCESS(err);
6500
6501 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006502 dsl_binding.binding = 0;
6503 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6504 dsl_binding.descriptorCount = 1;
6505 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6506 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006507
6508 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006509 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6510 ds_layout_ci.pNext = NULL;
6511 ds_layout_ci.bindingCount = 1;
6512 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006513 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006514 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006515 ASSERT_VK_SUCCESS(err);
6516
6517 VkDescriptorSet descriptorSet;
6518 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006519 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006520 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006521 alloc_info.descriptorPool = ds_pool;
6522 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006523 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006524 ASSERT_VK_SUCCESS(err);
6525
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006526 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006527 VkWriteDescriptorSet descriptor_write;
6528 memset(&descriptor_write, 0, sizeof(descriptor_write));
6529 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6530 descriptor_write.dstSet = descriptorSet;
6531 descriptor_write.dstBinding = 0;
6532 descriptor_write.descriptorCount = 1;
6533 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6534 descriptor_write.pTexelBufferView = &view;
6535
6536 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6537
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006538 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006539
6540 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6541 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6542}
6543
Mark Youngd339ba32016-05-30 13:28:35 -06006544TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006545 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has no memory bound to it.");
Mark Youngd339ba32016-05-30 13:28:35 -06006546
6547 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006548 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006549 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06006550
Tony Barbour1fa09702017-03-16 12:09:08 -06006551 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -06006552
6553 // Create a buffer with no bound memory and then attempt to create
6554 // a buffer view.
6555 VkBufferCreateInfo buff_ci = {};
6556 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12006557 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06006558 buff_ci.size = 256;
6559 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6560 VkBuffer buffer;
6561 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6562 ASSERT_VK_SUCCESS(err);
6563
6564 VkBufferViewCreateInfo buff_view_ci = {};
6565 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6566 buff_view_ci.buffer = buffer;
6567 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6568 buff_view_ci.range = VK_WHOLE_SIZE;
6569 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006570 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06006571
6572 m_errorMonitor->VerifyFound();
6573 vkDestroyBuffer(m_device->device(), buffer, NULL);
6574 // If last error is success, it still created the view, so delete it.
6575 if (err == VK_SUCCESS) {
6576 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6577 }
6578}
6579
Karl Schultz6addd812016-02-02 17:17:23 -07006580TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6581 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6582 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006583 // 1. No dynamicOffset supplied
6584 // 2. Too many dynamicOffsets supplied
6585 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006586 VkResult err;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006587 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6588 " requires 1 dynamicOffsets, but only "
6589 "0 dynamicOffsets are left in "
6590 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006591
Tony Barbour1fa09702017-03-16 12:09:08 -06006592 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006593 ASSERT_NO_FATAL_FAILURE(InitViewport());
6594 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6595
6596 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006597 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6598 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006599
6600 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006601 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6602 ds_pool_ci.pNext = NULL;
6603 ds_pool_ci.maxSets = 1;
6604 ds_pool_ci.poolSizeCount = 1;
6605 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006606
6607 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006608 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006609 ASSERT_VK_SUCCESS(err);
6610
6611 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006612 dsl_binding.binding = 0;
6613 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6614 dsl_binding.descriptorCount = 1;
6615 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6616 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006617
6618 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006619 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6620 ds_layout_ci.pNext = NULL;
6621 ds_layout_ci.bindingCount = 1;
6622 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006623 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006624 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006625 ASSERT_VK_SUCCESS(err);
6626
6627 VkDescriptorSet descriptorSet;
6628 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006629 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006630 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006631 alloc_info.descriptorPool = ds_pool;
6632 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006633 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006634 ASSERT_VK_SUCCESS(err);
6635
6636 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006637 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6638 pipeline_layout_ci.pNext = NULL;
6639 pipeline_layout_ci.setLayoutCount = 1;
6640 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006641
6642 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006643 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006644 ASSERT_VK_SUCCESS(err);
6645
6646 // Create a buffer to update the descriptor with
6647 uint32_t qfi = 0;
6648 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006649 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6650 buffCI.size = 1024;
6651 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6652 buffCI.queueFamilyIndexCount = 1;
6653 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006654
6655 VkBuffer dyub;
6656 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6657 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006658 // Allocate memory and bind to buffer so we can make it to the appropriate
6659 // error
6660 VkMemoryAllocateInfo mem_alloc = {};
6661 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6662 mem_alloc.pNext = NULL;
6663 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006664 mem_alloc.memoryTypeIndex = 0;
6665
6666 VkMemoryRequirements memReqs;
6667 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006668 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006669 if (!pass) {
6670 vkDestroyBuffer(m_device->device(), dyub, NULL);
6671 return;
6672 }
6673
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006674 VkDeviceMemory mem;
6675 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6676 ASSERT_VK_SUCCESS(err);
6677 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6678 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006679 // Correctly update descriptor to avoid "NOT_UPDATED" error
6680 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006681 buffInfo.buffer = dyub;
6682 buffInfo.offset = 0;
6683 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006684
6685 VkWriteDescriptorSet descriptor_write;
6686 memset(&descriptor_write, 0, sizeof(descriptor_write));
6687 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6688 descriptor_write.dstSet = descriptorSet;
6689 descriptor_write.dstBinding = 0;
6690 descriptor_write.descriptorCount = 1;
6691 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6692 descriptor_write.pBufferInfo = &buffInfo;
6693
6694 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6695
Tony Barbour552f6c02016-12-21 14:34:07 -07006696 m_commandBuffer->BeginCommandBuffer();
6697 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006698 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6699 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006700 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006701 uint32_t pDynOff[2] = {512, 756};
6702 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006703 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6704 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6705 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6706 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006707 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006708 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006709 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6710 " dynamic offset 512 combined with "
6711 "offset 0 and range 1024 that "
6712 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006713 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006714 char const *vsSource =
6715 "#version 450\n"
6716 "\n"
6717 "out gl_PerVertex { \n"
6718 " vec4 gl_Position;\n"
6719 "};\n"
6720 "void main(){\n"
6721 " gl_Position = vec4(1);\n"
6722 "}\n";
6723 char const *fsSource =
6724 "#version 450\n"
6725 "\n"
6726 "layout(location=0) out vec4 x;\n"
6727 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6728 "void main(){\n"
6729 " x = vec4(bar.y);\n"
6730 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006731 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6732 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6733 VkPipelineObj pipe(m_device);
6734 pipe.AddShader(&vs);
6735 pipe.AddShader(&fs);
6736 pipe.AddColorAttachment();
6737 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6738
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006739 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6740 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6741 VkRect2D scissor = {{0, 0}, {16, 16}};
6742 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6743
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006744 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006745 // This update should succeed, but offset size of 512 will overstep buffer
6746 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006747 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6748 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006749 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006750 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006751
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006752 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006753 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006754
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006755 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006756 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006757 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6758}
6759
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006760TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006761 TEST_DESCRIPTION(
6762 "Attempt to update a descriptor with a non-sparse buffer "
6763 "that doesn't have memory bound");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006764 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006765 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006766 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006767 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6768 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006769
Tony Barbour1fa09702017-03-16 12:09:08 -06006770 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006771 ASSERT_NO_FATAL_FAILURE(InitViewport());
6772 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6773
6774 VkDescriptorPoolSize ds_type_count = {};
6775 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6776 ds_type_count.descriptorCount = 1;
6777
6778 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6779 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6780 ds_pool_ci.pNext = NULL;
6781 ds_pool_ci.maxSets = 1;
6782 ds_pool_ci.poolSizeCount = 1;
6783 ds_pool_ci.pPoolSizes = &ds_type_count;
6784
6785 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006786 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006787 ASSERT_VK_SUCCESS(err);
6788
6789 VkDescriptorSetLayoutBinding dsl_binding = {};
6790 dsl_binding.binding = 0;
6791 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6792 dsl_binding.descriptorCount = 1;
6793 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6794 dsl_binding.pImmutableSamplers = NULL;
6795
6796 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6797 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6798 ds_layout_ci.pNext = NULL;
6799 ds_layout_ci.bindingCount = 1;
6800 ds_layout_ci.pBindings = &dsl_binding;
6801 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006802 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006803 ASSERT_VK_SUCCESS(err);
6804
6805 VkDescriptorSet descriptorSet;
6806 VkDescriptorSetAllocateInfo alloc_info = {};
6807 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6808 alloc_info.descriptorSetCount = 1;
6809 alloc_info.descriptorPool = ds_pool;
6810 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006811 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006812 ASSERT_VK_SUCCESS(err);
6813
6814 // Create a buffer to update the descriptor with
6815 uint32_t qfi = 0;
6816 VkBufferCreateInfo buffCI = {};
6817 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6818 buffCI.size = 1024;
6819 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6820 buffCI.queueFamilyIndexCount = 1;
6821 buffCI.pQueueFamilyIndices = &qfi;
6822
6823 VkBuffer dyub;
6824 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6825 ASSERT_VK_SUCCESS(err);
6826
6827 // Attempt to update descriptor without binding memory to it
6828 VkDescriptorBufferInfo buffInfo = {};
6829 buffInfo.buffer = dyub;
6830 buffInfo.offset = 0;
6831 buffInfo.range = 1024;
6832
6833 VkWriteDescriptorSet descriptor_write;
6834 memset(&descriptor_write, 0, sizeof(descriptor_write));
6835 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6836 descriptor_write.dstSet = descriptorSet;
6837 descriptor_write.dstBinding = 0;
6838 descriptor_write.descriptorCount = 1;
6839 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6840 descriptor_write.pBufferInfo = &buffInfo;
6841
6842 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6843 m_errorMonitor->VerifyFound();
6844
6845 vkDestroyBuffer(m_device->device(), dyub, NULL);
6846 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6847 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6848}
6849
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006850TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006851 VkResult err;
Tony Barbour1fa09702017-03-16 12:09:08 -06006852 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006853 ASSERT_NO_FATAL_FAILURE(InitViewport());
6854 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6855
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006856 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006857 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006858 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6859 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6860 pipeline_layout_ci.pushConstantRangeCount = 1;
6861 pipeline_layout_ci.pPushConstantRanges = &pc_range;
6862
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006863 //
6864 // Check for invalid push constant ranges in pipeline layouts.
6865 //
6866 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006867 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006868 char const *msg;
6869 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006870
Karl Schultzc81037d2016-05-12 08:11:23 -06006871 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
6872 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
6873 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
6874 "vkCreatePipelineLayout() call has push constants index 0 with "
6875 "size 0."},
6876 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
6877 "vkCreatePipelineLayout() call has push constants index 0 with "
6878 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006879 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06006880 "vkCreatePipelineLayout() call has push constants index 0 with "
6881 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006882 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06006883 "vkCreatePipelineLayout() call has push constants index 0 with "
6884 "size 0."},
6885 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6886 "vkCreatePipelineLayout() call has push constants index 0 with "
6887 "offset 1. Offset must"},
6888 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
6889 "vkCreatePipelineLayout() call has push constants index 0 "
6890 "with offset "},
6891 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
6892 "vkCreatePipelineLayout() call has push constants "
6893 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006894 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06006895 "vkCreatePipelineLayout() call has push constants index 0 "
6896 "with offset "},
6897 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
6898 "vkCreatePipelineLayout() call has push "
6899 "constants index 0 with offset "},
6900 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
6901 "vkCreatePipelineLayout() call has push "
6902 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006903 }};
6904
6905 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06006906 for (const auto &iter : range_tests) {
6907 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006908 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6909 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006910 m_errorMonitor->VerifyFound();
6911 if (VK_SUCCESS == err) {
6912 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6913 }
6914 }
6915
6916 // Check for invalid stage flag
6917 pc_range.offset = 0;
6918 pc_range.size = 16;
6919 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006920 m_errorMonitor->SetDesiredFailureMsg(
6921 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6922 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006923 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006924 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006925 if (VK_SUCCESS == err) {
6926 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6927 }
6928
Karl Schultzc59b72d2017-02-24 15:45:05 -07006929 // Check for duplicate stage flags in a list of push constant ranges.
6930 // A shader can only have one push constant block and that block is mapped
6931 // to the push constant range that has that shader's stage flag set.
6932 // The shader's stage flag can only appear once in all the ranges, so the
6933 // implementation can find the one and only range to map it to.
Karl Schultzc81037d2016-05-12 08:11:23 -06006934 const uint32_t ranges_per_test = 5;
Karl Schultzc59b72d2017-02-24 15:45:05 -07006935 struct DuplicateStageFlagsTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006936 VkPushConstantRange const ranges[ranges_per_test];
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006937 std::vector<char const *> const msg;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006938 };
Karl Schultzc59b72d2017-02-24 15:45:05 -07006939 // Overlapping ranges are OK, but a stage flag can appear only once.
6940 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
6941 {
6942 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6943 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6944 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6945 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006946 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzc59b72d2017-02-24 15:45:05 -07006947 {
6948 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
6949 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
6950 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
6951 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
6952 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
6953 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
6954 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
6955 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
6956 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
6957 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
6958 }},
6959 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6960 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
6961 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
6962 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6963 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
6964 {
6965 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
6966 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
6967 }},
6968 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
6969 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
6970 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6971 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6972 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
6973 {
6974 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
6975 }},
6976 },
6977 };
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006978
Karl Schultzc59b72d2017-02-24 15:45:05 -07006979 for (const auto &iter : duplicate_stageFlags_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006980 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06006981 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Karl Schultzc59b72d2017-02-24 15:45:05 -07006982 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg.begin(), iter.msg.end());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006983 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006984 m_errorMonitor->VerifyFound();
6985 if (VK_SUCCESS == err) {
6986 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6987 }
6988 }
6989
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006990 //
6991 // CmdPushConstants tests
6992 //
6993
Karl Schultzc59b72d2017-02-24 15:45:05 -07006994 // Setup a pipeline layout with ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06006995 const VkPushConstantRange pc_range2[] = {
Karl Schultzc59b72d2017-02-24 15:45:05 -07006996 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006997 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006998 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006999 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007000 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007001 ASSERT_VK_SUCCESS(err);
Karl Schultzc59b72d2017-02-24 15:45:05 -07007002
7003 const uint8_t dummy_values[100] = {};
7004
7005 m_commandBuffer->BeginCommandBuffer();
7006 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007007
7008 // Check for invalid stage flag
Karl Schultzc59b72d2017-02-24 15:45:05 -07007009 // Note that VU 00996 isn't reached due to parameter validation
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007011 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007012 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007013
Karl Schultzc59b72d2017-02-24 15:45:05 -07007014 m_errorMonitor->ExpectSuccess();
7015 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16, dummy_values);
7016 m_errorMonitor->VerifyNotFound();
7017 m_errorMonitor->ExpectSuccess();
7018 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT, 64, 16, dummy_values);
7019 m_errorMonitor->VerifyNotFound();
7020 const std::array<VkPushConstantRange, 6> cmd_range_tests = {{
7021 {VK_SHADER_STAGE_FRAGMENT_BIT, 64, 16},
7022 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7023 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16},
7024 {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
7025 {VK_SHADER_STAGE_VERTEX_BIT, 24, 16},
7026 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007027 }};
Karl Schultzc59b72d2017-02-24 15:45:05 -07007028 for (const auto &iter : cmd_range_tests) {
7029 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00988);
7030 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.stageFlags, iter.offset, iter.size,
7031 dummy_values);
Karl Schultzc81037d2016-05-12 08:11:23 -06007032 m_errorMonitor->VerifyFound();
7033 }
Karl Schultzc81037d2016-05-12 08:11:23 -06007034
Tony Barbour552f6c02016-12-21 14:34:07 -07007035 m_commandBuffer->EndRenderPass();
7036 m_commandBuffer->EndCommandBuffer();
Karl Schultzc59b72d2017-02-24 15:45:05 -07007037 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007038}
7039
Karl Schultz6addd812016-02-02 17:17:23 -07007040TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007041 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007042 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007043
Tony Barbour1fa09702017-03-16 12:09:08 -06007044 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007045 ASSERT_NO_FATAL_FAILURE(InitViewport());
7046 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7047
7048 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7049 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007050 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7051 ds_type_count[0].descriptorCount = 10;
7052 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7053 ds_type_count[1].descriptorCount = 2;
7054 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7055 ds_type_count[2].descriptorCount = 2;
7056 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7057 ds_type_count[3].descriptorCount = 5;
7058 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7059 // type
7060 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7061 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7062 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007063
7064 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007065 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7066 ds_pool_ci.pNext = NULL;
7067 ds_pool_ci.maxSets = 5;
7068 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7069 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007070
7071 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007072 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007073 ASSERT_VK_SUCCESS(err);
7074
7075 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7076 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007077 dsl_binding[0].binding = 0;
7078 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7079 dsl_binding[0].descriptorCount = 5;
7080 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7081 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007082
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007083 // Create layout identical to set0 layout but w/ different stageFlags
7084 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007085 dsl_fs_stage_only.binding = 0;
7086 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7087 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007088 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7089 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07007090 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007091 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007092 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7093 ds_layout_ci.pNext = NULL;
7094 ds_layout_ci.bindingCount = 1;
7095 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007096 static const uint32_t NUM_LAYOUTS = 4;
7097 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007098 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007099 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7100 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007101 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007102 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007103 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007104 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007105 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007106 dsl_binding[0].binding = 0;
7107 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007108 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007109 dsl_binding[1].binding = 1;
7110 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7111 dsl_binding[1].descriptorCount = 2;
7112 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7113 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007114 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007115 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007116 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007117 ASSERT_VK_SUCCESS(err);
7118 dsl_binding[0].binding = 0;
7119 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007120 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007121 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007122 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007123 ASSERT_VK_SUCCESS(err);
7124 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007125 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007126 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007127 ASSERT_VK_SUCCESS(err);
7128
7129 static const uint32_t NUM_SETS = 4;
7130 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7131 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007132 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007133 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007134 alloc_info.descriptorPool = ds_pool;
7135 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007136 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007137 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007138 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007139 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007140 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007141 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007142 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007143
7144 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007145 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7146 pipeline_layout_ci.pNext = NULL;
7147 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7148 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007149
7150 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007151 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007152 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007153 // Create pipelineLayout with only one setLayout
7154 pipeline_layout_ci.setLayoutCount = 1;
7155 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007156 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007157 ASSERT_VK_SUCCESS(err);
7158 // Create pipelineLayout with 2 descriptor setLayout at index 0
7159 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7160 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007161 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007162 ASSERT_VK_SUCCESS(err);
7163 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7164 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7165 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007166 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007167 ASSERT_VK_SUCCESS(err);
7168 // Create pipelineLayout with UB type, but stageFlags for FS only
7169 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7170 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007171 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007172 ASSERT_VK_SUCCESS(err);
7173 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7174 VkDescriptorSetLayout pl_bad_s0[2] = {};
7175 pl_bad_s0[0] = ds_layout_fs_only;
7176 pl_bad_s0[1] = ds_layout[1];
7177 pipeline_layout_ci.setLayoutCount = 2;
7178 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7179 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007180 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007181 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007182
Tobin Ehlis88452832015-12-03 09:40:56 -07007183 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007184 char const *vsSource =
7185 "#version 450\n"
7186 "\n"
7187 "out gl_PerVertex {\n"
7188 " vec4 gl_Position;\n"
7189 "};\n"
7190 "void main(){\n"
7191 " gl_Position = vec4(1);\n"
7192 "}\n";
7193 char const *fsSource =
7194 "#version 450\n"
7195 "\n"
7196 "layout(location=0) out vec4 x;\n"
7197 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7198 "void main(){\n"
7199 " x = vec4(bar.y);\n"
7200 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07007201 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7202 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007203 VkPipelineObj pipe(m_device);
7204 pipe.AddShader(&vs);
7205 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007206 pipe.AddColorAttachment();
7207 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007208
Tony Barbour552f6c02016-12-21 14:34:07 -07007209 m_commandBuffer->BeginCommandBuffer();
7210 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07007211
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007212 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07007213 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7214 // of PSO
7215 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7216 // cmd_pipeline.c
7217 // due to the fact that cmd_alloc_dset_data() has not been called in
7218 // cmd_bind_graphics_pipeline()
7219 // TODO : Want to cause various binding incompatibility issues here to test
7220 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007221 // First cause various verify_layout_compatibility() fails
7222 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007223 // verify_set_layout_compatibility fail cases:
7224 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007225 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007226 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7227 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007228 m_errorMonitor->VerifyFound();
7229
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007230 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007231 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
7232 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
7233 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007234 m_errorMonitor->VerifyFound();
7235
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007236 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007237 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7238 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007239 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
7240 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
7241 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007242 m_errorMonitor->VerifyFound();
7243
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007244 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7245 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007246 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
7247 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
7248 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007249 m_errorMonitor->VerifyFound();
7250
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007251 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7252 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007253 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7254 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
7255 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7256 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007257 m_errorMonitor->VerifyFound();
7258
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007259 // Cause INFO messages due to disturbing previously bound Sets
7260 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007261 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7262 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007263 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007264 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
7265 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7266 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007267 m_errorMonitor->VerifyFound();
7268
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007269 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7270 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007271 // 2. Disturb set after last bound set
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007272 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7273 " newly bound as set #0 so set #1 and "
7274 "any subsequent sets were disturbed ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007275 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7276 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007277 m_errorMonitor->VerifyFound();
7278
Tobin Ehlis10fad692016-07-07 12:00:36 -06007279 // Now that we're done actively using the pipelineLayout that gfx pipeline
7280 // was created with, we should be able to delete it. Do that now to verify
7281 // that validation obeys pipelineLayout lifetime
7282 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7283
Tobin Ehlis88452832015-12-03 09:40:56 -07007284 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007285 // 1. Error due to not binding required set (we actually use same code as
7286 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007287 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7288 &descriptorSet[0], 0, NULL);
7289 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7290 &descriptorSet[1], 0, NULL);
7291 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " uses set #0 but that set is not bound.");
Rene Lindsay9f228e42017-01-16 13:57:45 -07007292
7293 VkViewport viewport = {0, 0, 16, 16, 0, 1};
7294 VkRect2D scissor = {{0, 0}, {16, 16}};
7295 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
7296 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
7297
Tobin Ehlis88452832015-12-03 09:40:56 -07007298 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007299 m_errorMonitor->VerifyFound();
7300
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007301 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007302 // 2. Error due to bound set not being compatible with PSO's
7303 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007304 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7305 &descriptorSet[0], 0, NULL);
7306 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007307 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007308 m_errorMonitor->VerifyFound();
7309
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007310 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007311 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007312 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7313 }
7314 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007315 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7316 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7317}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007318
Karl Schultz6addd812016-02-02 17:17:23 -07007319TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007320 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7321 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007322
Tony Barbour1fa09702017-03-16 12:09:08 -06007323 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007324 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007325 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007326 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007327
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007328 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007329}
7330
Karl Schultz6addd812016-02-02 17:17:23 -07007331TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7332 VkResult err;
7333 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007334
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007335 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007336
Tony Barbour1fa09702017-03-16 12:09:08 -06007337 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007338
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007339 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007340 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007341 cmd.pNext = NULL;
Mike Schuchardt06304c22017-03-01 17:09:09 -07007342 cmd.commandPool = m_commandPool->handle();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007343 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007344 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007345
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007346 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007347 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007348
7349 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07007350 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07007351 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7352
7353 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007354 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007355 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007356 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007357 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007358
7359 // The error should be caught by validation of the BeginCommandBuffer call
7360 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7361
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007362 m_errorMonitor->VerifyFound();
Mike Schuchardt06304c22017-03-01 17:09:09 -07007363 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007364}
7365
Karl Schultz6addd812016-02-02 17:17:23 -07007366TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007367 // Cause error due to Begin while recording CB
7368 // Then cause 2 errors for attempting to reset CB w/o having
7369 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7370 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06007371 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007372
Tony Barbour1fa09702017-03-16 12:09:08 -06007373 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007374
7375 // Calls AllocateCommandBuffers
7376 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7377
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007378 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07007379 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007380 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7381 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007382 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7383 cmd_buf_info.pNext = NULL;
7384 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007385 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007386
7387 // Begin CB to transition to recording state
7388 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7389 // Can't re-begin. This should trigger error
7390 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007391 m_errorMonitor->VerifyFound();
7392
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007393 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007394 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007395 // Reset attempt will trigger error due to incorrect CommandPool state
7396 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007397 m_errorMonitor->VerifyFound();
7398
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007399 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007400 // Transition CB to RECORDED state
7401 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7402 // Now attempting to Begin will implicitly reset, which triggers error
7403 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007404 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007405}
7406
Karl Schultz6addd812016-02-02 17:17:23 -07007407TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007408 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007409 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007410
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007411 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7412 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007413
Tony Barbour1fa09702017-03-16 12:09:08 -06007414 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007415 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007416
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007417 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007418 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7419 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007420
7421 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007422 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7423 ds_pool_ci.pNext = NULL;
7424 ds_pool_ci.maxSets = 1;
7425 ds_pool_ci.poolSizeCount = 1;
7426 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007427
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007428 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007429 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007430 ASSERT_VK_SUCCESS(err);
7431
Tony Barboureb254902015-07-15 12:50:33 -06007432 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007433 dsl_binding.binding = 0;
7434 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7435 dsl_binding.descriptorCount = 1;
7436 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7437 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007438
Tony Barboureb254902015-07-15 12:50:33 -06007439 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007440 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7441 ds_layout_ci.pNext = NULL;
7442 ds_layout_ci.bindingCount = 1;
7443 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007444
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007445 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007446 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007447 ASSERT_VK_SUCCESS(err);
7448
7449 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007450 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007451 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007452 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007453 alloc_info.descriptorPool = ds_pool;
7454 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007455 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007456 ASSERT_VK_SUCCESS(err);
7457
Tony Barboureb254902015-07-15 12:50:33 -06007458 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007459 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7460 pipeline_layout_ci.setLayoutCount = 1;
7461 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007462
7463 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007464 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007465 ASSERT_VK_SUCCESS(err);
7466
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007467 VkViewport vp = {}; // Just need dummy vp to point to
7468 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007469
7470 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007471 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7472 vp_state_ci.scissorCount = 1;
7473 vp_state_ci.pScissors = &sc;
7474 vp_state_ci.viewportCount = 1;
7475 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007476
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007477 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7478 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7479 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7480 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7481 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7482 rs_state_ci.depthClampEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007483 rs_state_ci.rasterizerDiscardEnable = VK_TRUE;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007484 rs_state_ci.depthBiasEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007485 rs_state_ci.lineWidth = 1.0f;
7486
7487 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7488 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7489 vi_ci.pNext = nullptr;
7490 vi_ci.vertexBindingDescriptionCount = 0;
7491 vi_ci.pVertexBindingDescriptions = nullptr;
7492 vi_ci.vertexAttributeDescriptionCount = 0;
7493 vi_ci.pVertexAttributeDescriptions = nullptr;
7494
7495 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7496 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7497 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7498
7499 VkPipelineShaderStageCreateInfo shaderStages[2];
7500 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7501
7502 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7503 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Dave Houlton59a20702017-02-02 17:26:23 -07007504 shaderStages[0] = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007505 shaderStages[1] = fs.GetStageCreateInfo();
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007506
Tony Barboureb254902015-07-15 12:50:33 -06007507 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007508 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7509 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007510 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007511 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7512 gp_ci.layout = pipeline_layout;
7513 gp_ci.renderPass = renderPass();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007514 gp_ci.pVertexInputState = &vi_ci;
7515 gp_ci.pInputAssemblyState = &ia_ci;
7516
7517 gp_ci.stageCount = 1;
7518 gp_ci.pStages = shaderStages;
Tony Barboureb254902015-07-15 12:50:33 -06007519
7520 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007521 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7522 pc_ci.initialDataSize = 0;
7523 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007524
7525 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007526 VkPipelineCache pipelineCache;
7527
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007528 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007529 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007530 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007531 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007532
Chia-I Wuf7458c52015-10-26 21:10:41 +08007533 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7534 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7535 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7536 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007537}
Rene Lindsayae4977b2017-01-23 14:55:54 -07007538
Tobin Ehlis912df022015-09-17 08:46:18 -06007539/*// TODO : This test should be good, but needs Tess support in compiler to run
7540TEST_F(VkLayerTest, InvalidPatchControlPoints)
7541{
7542 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007543 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007544
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007545 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007546 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7547primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007548
Tony Barbour1fa09702017-03-16 12:09:08 -06007549 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis912df022015-09-17 08:46:18 -06007550 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007551
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007552 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007553 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007554 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007555
7556 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7557 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7558 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007559 ds_pool_ci.poolSizeCount = 1;
7560 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007561
7562 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007563 err = vkCreateDescriptorPool(m_device->device(),
7564VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007565 ASSERT_VK_SUCCESS(err);
7566
7567 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007568 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007569 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007570 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007571 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7572 dsl_binding.pImmutableSamplers = NULL;
7573
7574 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007575 ds_layout_ci.sType =
7576VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007577 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007578 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007579 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007580
7581 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007582 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7583&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007584 ASSERT_VK_SUCCESS(err);
7585
7586 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007587 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7588VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007589 ASSERT_VK_SUCCESS(err);
7590
7591 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007592 pipeline_layout_ci.sType =
7593VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007594 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007595 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007596 pipeline_layout_ci.pSetLayouts = &ds_layout;
7597
7598 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007599 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7600&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007601 ASSERT_VK_SUCCESS(err);
7602
7603 VkPipelineShaderStageCreateInfo shaderStages[3];
7604 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7605
Karl Schultz6addd812016-02-02 17:17:23 -07007606 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7607this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007608 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007609 VkShaderObj
7610tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7611this);
7612 VkShaderObj
7613te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7614this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007615
Karl Schultz6addd812016-02-02 17:17:23 -07007616 shaderStages[0].sType =
7617VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007618 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007619 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007620 shaderStages[1].sType =
7621VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007622 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007623 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007624 shaderStages[2].sType =
7625VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007626 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007627 shaderStages[2].shader = te.handle();
7628
7629 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007630 iaCI.sType =
7631VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007632 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007633
7634 VkPipelineTessellationStateCreateInfo tsCI = {};
7635 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7636 tsCI.patchControlPoints = 0; // This will cause an error
7637
7638 VkGraphicsPipelineCreateInfo gp_ci = {};
7639 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7640 gp_ci.pNext = NULL;
7641 gp_ci.stageCount = 3;
7642 gp_ci.pStages = shaderStages;
7643 gp_ci.pVertexInputState = NULL;
7644 gp_ci.pInputAssemblyState = &iaCI;
7645 gp_ci.pTessellationState = &tsCI;
7646 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007647 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007648 gp_ci.pMultisampleState = NULL;
7649 gp_ci.pDepthStencilState = NULL;
7650 gp_ci.pColorBlendState = NULL;
7651 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7652 gp_ci.layout = pipeline_layout;
7653 gp_ci.renderPass = renderPass();
7654
7655 VkPipelineCacheCreateInfo pc_ci = {};
7656 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7657 pc_ci.pNext = NULL;
7658 pc_ci.initialSize = 0;
7659 pc_ci.initialData = 0;
7660 pc_ci.maxSize = 0;
7661
7662 VkPipeline pipeline;
7663 VkPipelineCache pipelineCache;
7664
Karl Schultz6addd812016-02-02 17:17:23 -07007665 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7666&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007667 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007668 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7669&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007670
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007671 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007672
Chia-I Wuf7458c52015-10-26 21:10:41 +08007673 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7674 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7675 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7676 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007677}
7678*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007679
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007680TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007681 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007682
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007683 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007684
Tony Barbour1fa09702017-03-16 12:09:08 -06007685 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007686 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007687
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007688 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007689 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7690 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007691
7692 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007693 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7694 ds_pool_ci.maxSets = 1;
7695 ds_pool_ci.poolSizeCount = 1;
7696 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007697
7698 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007699 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007700 ASSERT_VK_SUCCESS(err);
7701
7702 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007703 dsl_binding.binding = 0;
7704 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7705 dsl_binding.descriptorCount = 1;
7706 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007707
7708 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007709 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7710 ds_layout_ci.bindingCount = 1;
7711 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007712
7713 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007714 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007715 ASSERT_VK_SUCCESS(err);
7716
7717 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007718 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007719 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007720 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007721 alloc_info.descriptorPool = ds_pool;
7722 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007723 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007724 ASSERT_VK_SUCCESS(err);
7725
7726 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007727 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7728 pipeline_layout_ci.setLayoutCount = 1;
7729 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007730
7731 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007732 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007733 ASSERT_VK_SUCCESS(err);
7734
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007735 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007736 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007737 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007738 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007739 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007740 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007741
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007742 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7743 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7744 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7745 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7746 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7747 rs_state_ci.depthClampEnable = VK_FALSE;
7748 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7749 rs_state_ci.depthBiasEnable = VK_FALSE;
7750
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007751 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7752 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7753 vi_ci.pNext = nullptr;
7754 vi_ci.vertexBindingDescriptionCount = 0;
7755 vi_ci.pVertexBindingDescriptions = nullptr;
7756 vi_ci.vertexAttributeDescriptionCount = 0;
7757 vi_ci.pVertexAttributeDescriptions = nullptr;
7758
7759 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7760 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7761 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7762
7763 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7764 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7765 pipe_ms_state_ci.pNext = NULL;
7766 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7767 pipe_ms_state_ci.sampleShadingEnable = 0;
7768 pipe_ms_state_ci.minSampleShading = 1.0;
7769 pipe_ms_state_ci.pSampleMask = NULL;
7770
Cody Northropeb3a6c12015-10-05 14:44:45 -06007771 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007772 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007773
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007774 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007775 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08007776 shaderStages[0] = vs.GetStageCreateInfo();
7777 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007778
7779 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007780 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7781 gp_ci.stageCount = 2;
7782 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007783 gp_ci.pVertexInputState = &vi_ci;
7784 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007785 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007786 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007787 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007788 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7789 gp_ci.layout = pipeline_layout;
7790 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007791
7792 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007793 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007794
7795 VkPipeline pipeline;
7796 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007797 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007798 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007799
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007800 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007801 printf(" MultiViewport feature is disabled -- skipping enabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007802
7803 // Check case where multiViewport is disabled and viewport count is not 1
7804 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
7806 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
7807 vp_state_ci.scissorCount = 0;
7808 vp_state_ci.viewportCount = 0;
7809 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7810 m_errorMonitor->VerifyFound();
7811 } else {
7812 if (m_device->props.limits.maxViewports == 1) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007813 printf(" Device limit maxViewports is 1, skipping tests that require higher limits.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007814 } else {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007815 printf(" MultiViewport feature is enabled -- skipping disabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007816
7817 // Check is that viewportcount and scissorcount match
7818 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
7819 vp_state_ci.scissorCount = 1;
7820 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
7821 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7822 m_errorMonitor->VerifyFound();
7823
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007824 // Check case where multiViewport is enabled and viewport count is greater than max
7825 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7826 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
7827 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
7828 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
7829 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
7830 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7831 m_errorMonitor->VerifyFound();
7832 }
7833 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06007834
Chia-I Wuf7458c52015-10-26 21:10:41 +08007835 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7836 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7837 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7838 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007839}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007840
7841// Don't set viewport state in PSO. This is an error b/c we always need this state for the counts even if the data is going to be
7842// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07007843TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07007844 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007845
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007846 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
7847
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007848 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007849
Tony Barbour1fa09702017-03-16 12:09:08 -06007850 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007851 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007852
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007853 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007854 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7855 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007856
7857 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007858 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7859 ds_pool_ci.maxSets = 1;
7860 ds_pool_ci.poolSizeCount = 1;
7861 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007862
7863 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007864 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007865 ASSERT_VK_SUCCESS(err);
7866
7867 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007868 dsl_binding.binding = 0;
7869 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7870 dsl_binding.descriptorCount = 1;
7871 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007872
7873 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007874 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7875 ds_layout_ci.bindingCount = 1;
7876 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007877
7878 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007879 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007880 ASSERT_VK_SUCCESS(err);
7881
7882 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007883 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007884 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007885 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007886 alloc_info.descriptorPool = ds_pool;
7887 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007888 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007889 ASSERT_VK_SUCCESS(err);
7890
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007891 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7892 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7893 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7894
7895 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7896 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7897 vi_ci.pNext = nullptr;
7898 vi_ci.vertexBindingDescriptionCount = 0;
7899 vi_ci.pVertexBindingDescriptions = nullptr;
7900 vi_ci.vertexAttributeDescriptionCount = 0;
7901 vi_ci.pVertexAttributeDescriptions = nullptr;
7902
7903 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7904 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7905 pipe_ms_state_ci.pNext = NULL;
7906 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
7907 pipe_ms_state_ci.sampleShadingEnable = 0;
7908 pipe_ms_state_ci.minSampleShading = 1.0;
7909 pipe_ms_state_ci.pSampleMask = NULL;
7910
Tobin Ehlise68360f2015-10-01 11:15:13 -06007911 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007912 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7913 pipeline_layout_ci.setLayoutCount = 1;
7914 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007915
7916 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007917 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007918 ASSERT_VK_SUCCESS(err);
7919
7920 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7921 // Set scissor as dynamic to avoid second error
7922 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007923 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7924 dyn_state_ci.dynamicStateCount = 1;
7925 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007926
Cody Northropeb3a6c12015-10-05 14:44:45 -06007927 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007928 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007929
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007930 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007931 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7932 // We shouldn't need a fragment shader but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08007933 shaderStages[0] = vs.GetStageCreateInfo();
7934 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007935
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007936 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7937 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7938 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7939 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7940 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7941 rs_state_ci.depthClampEnable = VK_FALSE;
7942 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7943 rs_state_ci.depthBiasEnable = VK_FALSE;
7944
Tobin Ehlise68360f2015-10-01 11:15:13 -06007945 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007946 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7947 gp_ci.stageCount = 2;
7948 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007949 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007950 // Not setting VP state w/o dynamic vp state should cause validation error
7951 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007952 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007953 gp_ci.pVertexInputState = &vi_ci;
7954 gp_ci.pInputAssemblyState = &ia_ci;
7955 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007956 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7957 gp_ci.layout = pipeline_layout;
7958 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007959
7960 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007961 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007962
7963 VkPipeline pipeline;
7964 VkPipelineCache pipelineCache;
7965
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007966 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007967 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007968 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007969
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007970 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007971
Chia-I Wuf7458c52015-10-26 21:10:41 +08007972 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7973 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7974 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7975 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007976}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007977
7978// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
7979// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07007980TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
7981 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007982
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007983 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007984
Tony Barbour1fa09702017-03-16 12:09:08 -06007985 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007986
7987 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007988 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007989 return;
7990 }
7991
Tobin Ehlise68360f2015-10-01 11:15:13 -06007992 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007993
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007994 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007995 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7996 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007997
7998 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007999 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8000 ds_pool_ci.maxSets = 1;
8001 ds_pool_ci.poolSizeCount = 1;
8002 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008003
8004 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008005 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008006 ASSERT_VK_SUCCESS(err);
8007
8008 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008009 dsl_binding.binding = 0;
8010 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8011 dsl_binding.descriptorCount = 1;
8012 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008013
8014 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008015 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8016 ds_layout_ci.bindingCount = 1;
8017 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008018
8019 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008020 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008021 ASSERT_VK_SUCCESS(err);
8022
8023 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008024 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008025 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008026 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008027 alloc_info.descriptorPool = ds_pool;
8028 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008029 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008030 ASSERT_VK_SUCCESS(err);
8031
8032 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008033 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8034 pipeline_layout_ci.setLayoutCount = 1;
8035 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008036
8037 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008038 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008039 ASSERT_VK_SUCCESS(err);
8040
8041 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008042 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8043 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008044 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008045 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008046 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008047
8048 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8049 // Set scissor as dynamic to avoid that error
8050 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008051 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8052 dyn_state_ci.dynamicStateCount = 1;
8053 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008054
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008055 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8056 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8057 pipe_ms_state_ci.pNext = NULL;
8058 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8059 pipe_ms_state_ci.sampleShadingEnable = 0;
8060 pipe_ms_state_ci.minSampleShading = 1.0;
8061 pipe_ms_state_ci.pSampleMask = NULL;
8062
Cody Northropeb3a6c12015-10-05 14:44:45 -06008063 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008064 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008065
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008066 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008067 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8068 // We shouldn't need a fragment shader but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008069 shaderStages[0] = vs.GetStageCreateInfo();
8070 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008071
Cody Northropf6622dc2015-10-06 10:33:21 -06008072 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8073 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8074 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008075 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008076 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008077 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008078 vi_ci.pVertexAttributeDescriptions = nullptr;
8079
8080 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8081 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8082 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8083
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008084 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008085 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008086 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06008087 rs_ci.pNext = nullptr;
8088
Mark Youngc89c6312016-03-31 16:03:20 -06008089 VkPipelineColorBlendAttachmentState att = {};
8090 att.blendEnable = VK_FALSE;
8091 att.colorWriteMask = 0xf;
8092
Cody Northropf6622dc2015-10-06 10:33:21 -06008093 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8094 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8095 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008096 cb_ci.attachmentCount = 1;
8097 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008098
Tobin Ehlise68360f2015-10-01 11:15:13 -06008099 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008100 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8101 gp_ci.stageCount = 2;
8102 gp_ci.pStages = shaderStages;
8103 gp_ci.pVertexInputState = &vi_ci;
8104 gp_ci.pInputAssemblyState = &ia_ci;
8105 gp_ci.pViewportState = &vp_state_ci;
8106 gp_ci.pRasterizationState = &rs_ci;
8107 gp_ci.pColorBlendState = &cb_ci;
8108 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008109 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008110 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8111 gp_ci.layout = pipeline_layout;
8112 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008113
8114 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008115 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008116
8117 VkPipeline pipeline;
8118 VkPipelineCache pipelineCache;
8119
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008120 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008121 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008122 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008123
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008124 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008125
Tobin Ehlisd332f282015-10-02 11:00:56 -06008126 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008127 // First need to successfully create the PSO from above by setting
8128 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06008129 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic scissor(s) 0 are used by pipeline state object, ");
Karl Schultz6addd812016-02-02 17:17:23 -07008130
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008131 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008132 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008133 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008134 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008135 m_commandBuffer->BeginCommandBuffer();
8136 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008137 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008138 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07008139 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008140 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07008141 Draw(1, 0, 0, 0);
8142
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008143 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008144
8145 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8146 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8147 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8148 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008149 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008150}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008151
8152// Create PSO w/o non-zero scissorCount but no scissor data, then run second test where dynamic viewportCount doesn't match PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008153// viewportCount
8154TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8155 VkResult err;
8156
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008157 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07008158
Tony Barbour1fa09702017-03-16 12:09:08 -06008159 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008160
8161 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008162 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008163 return;
8164 }
8165
Karl Schultz6addd812016-02-02 17:17:23 -07008166 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8167
8168 VkDescriptorPoolSize ds_type_count = {};
8169 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8170 ds_type_count.descriptorCount = 1;
8171
8172 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8173 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8174 ds_pool_ci.maxSets = 1;
8175 ds_pool_ci.poolSizeCount = 1;
8176 ds_pool_ci.pPoolSizes = &ds_type_count;
8177
8178 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008179 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07008180 ASSERT_VK_SUCCESS(err);
8181
8182 VkDescriptorSetLayoutBinding dsl_binding = {};
8183 dsl_binding.binding = 0;
8184 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8185 dsl_binding.descriptorCount = 1;
8186 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8187
8188 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8189 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8190 ds_layout_ci.bindingCount = 1;
8191 ds_layout_ci.pBindings = &dsl_binding;
8192
8193 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008194 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008195 ASSERT_VK_SUCCESS(err);
8196
8197 VkDescriptorSet descriptorSet;
8198 VkDescriptorSetAllocateInfo alloc_info = {};
8199 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8200 alloc_info.descriptorSetCount = 1;
8201 alloc_info.descriptorPool = ds_pool;
8202 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008203 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07008204 ASSERT_VK_SUCCESS(err);
8205
8206 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8207 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8208 pipeline_layout_ci.setLayoutCount = 1;
8209 pipeline_layout_ci.pSetLayouts = &ds_layout;
8210
8211 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008212 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008213 ASSERT_VK_SUCCESS(err);
8214
8215 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8216 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8217 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008218 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008219 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008220 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008221
8222 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8223 // Set scissor as dynamic to avoid that error
8224 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8225 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8226 dyn_state_ci.dynamicStateCount = 1;
8227 dyn_state_ci.pDynamicStates = &vp_state;
8228
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008229 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8230 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8231 pipe_ms_state_ci.pNext = NULL;
8232 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8233 pipe_ms_state_ci.sampleShadingEnable = 0;
8234 pipe_ms_state_ci.minSampleShading = 1.0;
8235 pipe_ms_state_ci.pSampleMask = NULL;
8236
Karl Schultz6addd812016-02-02 17:17:23 -07008237 VkPipelineShaderStageCreateInfo shaderStages[2];
8238 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8239
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008240 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008241 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8242 // We shouldn't need a fragment shader but add it to be able to run on more devices
Karl Schultz6addd812016-02-02 17:17:23 -07008243 shaderStages[0] = vs.GetStageCreateInfo();
8244 shaderStages[1] = fs.GetStageCreateInfo();
8245
8246 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8247 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8248 vi_ci.pNext = nullptr;
8249 vi_ci.vertexBindingDescriptionCount = 0;
8250 vi_ci.pVertexBindingDescriptions = nullptr;
8251 vi_ci.vertexAttributeDescriptionCount = 0;
8252 vi_ci.pVertexAttributeDescriptions = nullptr;
8253
8254 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8255 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8256 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8257
8258 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8259 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008260 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07008261 rs_ci.pNext = nullptr;
8262
Mark Youngc89c6312016-03-31 16:03:20 -06008263 VkPipelineColorBlendAttachmentState att = {};
8264 att.blendEnable = VK_FALSE;
8265 att.colorWriteMask = 0xf;
8266
Karl Schultz6addd812016-02-02 17:17:23 -07008267 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8268 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8269 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008270 cb_ci.attachmentCount = 1;
8271 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008272
8273 VkGraphicsPipelineCreateInfo gp_ci = {};
8274 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8275 gp_ci.stageCount = 2;
8276 gp_ci.pStages = shaderStages;
8277 gp_ci.pVertexInputState = &vi_ci;
8278 gp_ci.pInputAssemblyState = &ia_ci;
8279 gp_ci.pViewportState = &vp_state_ci;
8280 gp_ci.pRasterizationState = &rs_ci;
8281 gp_ci.pColorBlendState = &cb_ci;
8282 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008283 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008284 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8285 gp_ci.layout = pipeline_layout;
8286 gp_ci.renderPass = renderPass();
8287
8288 VkPipelineCacheCreateInfo pc_ci = {};
8289 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8290
8291 VkPipeline pipeline;
8292 VkPipelineCache pipelineCache;
8293
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008294 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07008295 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008296 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008297
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008298 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008299
8300 // Now hit second fail case where we set scissor w/ different count than PSO
8301 // First need to successfully create the PSO from above by setting
8302 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008303 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8304 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008305
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008306 VkRect2D sc = {}; // Just need dummy vp to point to
Tobin Ehlisd332f282015-10-02 11:00:56 -06008307 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008308 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008309 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008310 m_commandBuffer->BeginCommandBuffer();
8311 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008312 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008313 VkViewport viewports[1] = {};
8314 viewports[0].width = 8;
8315 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06008316 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008317 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008318 Draw(1, 0, 0, 0);
8319
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008320 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008321
Chia-I Wuf7458c52015-10-26 21:10:41 +08008322 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8323 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8324 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8325 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008326 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008327}
8328
Mark Young7394fdd2016-03-31 14:56:43 -06008329TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8330 VkResult err;
8331
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008332 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008333
Tony Barbour1fa09702017-03-16 12:09:08 -06008334 ASSERT_NO_FATAL_FAILURE(Init());
Mark Young7394fdd2016-03-31 14:56:43 -06008335 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8336
8337 VkDescriptorPoolSize ds_type_count = {};
8338 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8339 ds_type_count.descriptorCount = 1;
8340
8341 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8342 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8343 ds_pool_ci.maxSets = 1;
8344 ds_pool_ci.poolSizeCount = 1;
8345 ds_pool_ci.pPoolSizes = &ds_type_count;
8346
8347 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008348 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06008349 ASSERT_VK_SUCCESS(err);
8350
8351 VkDescriptorSetLayoutBinding dsl_binding = {};
8352 dsl_binding.binding = 0;
8353 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8354 dsl_binding.descriptorCount = 1;
8355 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8356
8357 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8358 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8359 ds_layout_ci.bindingCount = 1;
8360 ds_layout_ci.pBindings = &dsl_binding;
8361
8362 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008363 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008364 ASSERT_VK_SUCCESS(err);
8365
8366 VkDescriptorSet descriptorSet;
8367 VkDescriptorSetAllocateInfo alloc_info = {};
8368 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8369 alloc_info.descriptorSetCount = 1;
8370 alloc_info.descriptorPool = ds_pool;
8371 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008372 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06008373 ASSERT_VK_SUCCESS(err);
8374
8375 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8376 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8377 pipeline_layout_ci.setLayoutCount = 1;
8378 pipeline_layout_ci.pSetLayouts = &ds_layout;
8379
8380 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008381 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008382 ASSERT_VK_SUCCESS(err);
8383
8384 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8385 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8386 vp_state_ci.scissorCount = 1;
8387 vp_state_ci.pScissors = NULL;
8388 vp_state_ci.viewportCount = 1;
8389 vp_state_ci.pViewports = NULL;
8390
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008391 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06008392 // Set scissor as dynamic to avoid that error
8393 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8394 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8395 dyn_state_ci.dynamicStateCount = 2;
8396 dyn_state_ci.pDynamicStates = dynamic_states;
8397
8398 VkPipelineShaderStageCreateInfo shaderStages[2];
8399 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8400
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008401 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8402 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008403 this); // TODO - We shouldn't need a fragment shader
8404 // but add it to be able to run on more devices
Mark Young7394fdd2016-03-31 14:56:43 -06008405 shaderStages[0] = vs.GetStageCreateInfo();
8406 shaderStages[1] = fs.GetStageCreateInfo();
8407
8408 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8409 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8410 vi_ci.pNext = nullptr;
8411 vi_ci.vertexBindingDescriptionCount = 0;
8412 vi_ci.pVertexBindingDescriptions = nullptr;
8413 vi_ci.vertexAttributeDescriptionCount = 0;
8414 vi_ci.pVertexAttributeDescriptions = nullptr;
8415
8416 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8417 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8418 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8419
8420 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8421 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8422 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07008423 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06008424
Mark Young47107952016-05-02 15:59:55 -06008425 // Check too low (line width of -1.0f).
8426 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008427
8428 VkPipelineColorBlendAttachmentState att = {};
8429 att.blendEnable = VK_FALSE;
8430 att.colorWriteMask = 0xf;
8431
8432 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8433 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8434 cb_ci.pNext = nullptr;
8435 cb_ci.attachmentCount = 1;
8436 cb_ci.pAttachments = &att;
8437
8438 VkGraphicsPipelineCreateInfo gp_ci = {};
8439 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8440 gp_ci.stageCount = 2;
8441 gp_ci.pStages = shaderStages;
8442 gp_ci.pVertexInputState = &vi_ci;
8443 gp_ci.pInputAssemblyState = &ia_ci;
8444 gp_ci.pViewportState = &vp_state_ci;
8445 gp_ci.pRasterizationState = &rs_ci;
8446 gp_ci.pColorBlendState = &cb_ci;
8447 gp_ci.pDynamicState = &dyn_state_ci;
8448 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8449 gp_ci.layout = pipeline_layout;
8450 gp_ci.renderPass = renderPass();
8451
8452 VkPipelineCacheCreateInfo pc_ci = {};
8453 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8454
8455 VkPipeline pipeline;
8456 VkPipelineCache pipelineCache;
8457
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008458 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008459 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008460 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008461
8462 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008463 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008464
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008465 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008466
8467 // Check too high (line width of 65536.0f).
8468 rs_ci.lineWidth = 65536.0f;
8469
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008470 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008471 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008472 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008473
8474 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008475 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008476
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008477 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008478
8479 dyn_state_ci.dynamicStateCount = 3;
8480
8481 rs_ci.lineWidth = 1.0f;
8482
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008483 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008484 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008485 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07008486 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008487 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008488
8489 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008490 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008491 m_errorMonitor->VerifyFound();
8492
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008493 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008494
8495 // Check too high with dynamic setting.
8496 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8497 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07008498 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06008499
8500 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8501 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8502 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8503 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008504 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008505}
8506
Karl Schultz6addd812016-02-02 17:17:23 -07008507TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008508 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008509 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07008510 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008511
Tony Barbour1fa09702017-03-16 12:09:08 -06008512 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008513 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008514
Tony Barbour552f6c02016-12-21 14:34:07 -07008515 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008516 // Don't care about RenderPass handle b/c error should be flagged before
8517 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008518 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008519
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008520 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008521}
8522
Karl Schultz6addd812016-02-02 17:17:23 -07008523TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008524 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008525 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8526 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008527
Tony Barbour1fa09702017-03-16 12:09:08 -06008528 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008529 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008530
Tony Barbour552f6c02016-12-21 14:34:07 -07008531 m_commandBuffer->BeginCommandBuffer();
8532 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07008533 // Just create a dummy Renderpass that's non-NULL so we can get to the
8534 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008535 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008536
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008537 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008538}
8539
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008540TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008541 TEST_DESCRIPTION(
8542 "Begin a renderPass where clearValueCount is less than"
8543 "the number of renderPass attachments that use loadOp"
8544 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008545
Tony Barbour1fa09702017-03-16 12:09:08 -06008546 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008547 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8548
8549 // Create a renderPass with a single attachment that uses loadOp CLEAR
8550 VkAttachmentReference attach = {};
8551 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8552 VkSubpassDescription subpass = {};
8553 subpass.inputAttachmentCount = 1;
8554 subpass.pInputAttachments = &attach;
8555 VkRenderPassCreateInfo rpci = {};
8556 rpci.subpassCount = 1;
8557 rpci.pSubpasses = &subpass;
8558 rpci.attachmentCount = 1;
8559 VkAttachmentDescription attach_desc = {};
Rene Lindsay4bf0e4c2017-01-31 14:20:34 -07008560 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008561 // Set loadOp to CLEAR
8562 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8563 rpci.pAttachments = &attach_desc;
8564 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8565 VkRenderPass rp;
8566 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8567
8568 VkCommandBufferInheritanceInfo hinfo = {};
8569 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
8570 hinfo.renderPass = VK_NULL_HANDLE;
8571 hinfo.subpass = 0;
8572 hinfo.framebuffer = VK_NULL_HANDLE;
8573 hinfo.occlusionQueryEnable = VK_FALSE;
8574 hinfo.queryFlags = 0;
8575 hinfo.pipelineStatistics = 0;
8576 VkCommandBufferBeginInfo info = {};
8577 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8578 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8579 info.pInheritanceInfo = &hinfo;
8580
8581 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8582 VkRenderPassBeginInfo rp_begin = {};
8583 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8584 rp_begin.pNext = NULL;
8585 rp_begin.renderPass = renderPass();
8586 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008587 rp_begin.clearValueCount = 0; // Should be 1
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008588
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07008589 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008590
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008591 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008592
8593 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06008594
8595 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008596}
8597
Slawomir Cygan0808f392016-11-28 17:53:23 +01008598TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008599 TEST_DESCRIPTION(
8600 "Begin a renderPass where clearValueCount is greater than"
8601 "the number of renderPass attachments that use loadOp"
8602 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008603
Tony Barbour1fa09702017-03-16 12:09:08 -06008604 ASSERT_NO_FATAL_FAILURE(Init());
Slawomir Cygan0808f392016-11-28 17:53:23 +01008605 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8606
8607 // Create a renderPass with a single attachment that uses loadOp CLEAR
8608 VkAttachmentReference attach = {};
8609 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8610 VkSubpassDescription subpass = {};
8611 subpass.inputAttachmentCount = 1;
8612 subpass.pInputAttachments = &attach;
8613 VkRenderPassCreateInfo rpci = {};
8614 rpci.subpassCount = 1;
8615 rpci.pSubpasses = &subpass;
8616 rpci.attachmentCount = 1;
8617 VkAttachmentDescription attach_desc = {};
8618 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
8619 // Set loadOp to CLEAR
8620 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8621 rpci.pAttachments = &attach_desc;
8622 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8623 VkRenderPass rp;
8624 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8625
8626 VkCommandBufferBeginInfo info = {};
8627 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8628 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8629
8630 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8631 VkRenderPassBeginInfo rp_begin = {};
8632 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8633 rp_begin.pNext = NULL;
8634 rp_begin.renderPass = renderPass();
8635 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008636 rp_begin.clearValueCount = 2; // Should be 1
Slawomir Cygan0808f392016-11-28 17:53:23 +01008637
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008638 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
8639 " has a clearValueCount of"
8640 " 2 but only first 1 entries in pClearValues array are used");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008641
8642 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
8643
8644 m_errorMonitor->VerifyFound();
8645
8646 vkDestroyRenderPass(m_device->device(), rp, NULL);
8647}
8648
Cody Northrop3bb4d962016-05-09 16:15:57 -06008649TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
Cody Northrop3bb4d962016-05-09 16:15:57 -06008650 TEST_DESCRIPTION("End a command buffer with an active render pass");
8651
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008652 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8653 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06008654
Tony Barbour1fa09702017-03-16 12:09:08 -06008655 ASSERT_NO_FATAL_FAILURE(Init());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008656 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8657
Tony Barbour552f6c02016-12-21 14:34:07 -07008658 m_commandBuffer->BeginCommandBuffer();
8659 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8660 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008661
8662 m_errorMonitor->VerifyFound();
8663
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008664 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
8665 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06008666}
8667
Karl Schultz6addd812016-02-02 17:17:23 -07008668TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008669 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008670 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8671 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008672
Tony Barbour1fa09702017-03-16 12:09:08 -06008673 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008674 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008675
Tony Barbour552f6c02016-12-21 14:34:07 -07008676 m_commandBuffer->BeginCommandBuffer();
8677 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008678
8679 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008680 vk_testing::Buffer dstBuffer;
8681 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008682
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008683 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008684
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008685 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008686}
8687
Karl Schultz6addd812016-02-02 17:17:23 -07008688TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008689 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008690 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8691 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008692
Tony Barbour1fa09702017-03-16 12:09:08 -06008693 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008694 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008695
Tony Barbour552f6c02016-12-21 14:34:07 -07008696 m_commandBuffer->BeginCommandBuffer();
8697 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008698
8699 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008700 vk_testing::Buffer dstBuffer;
8701 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008702
Karl Schultz6addd812016-02-02 17:17:23 -07008703 VkDeviceSize dstOffset = 0;
Rene Lindsay32d26902017-02-02 16:49:24 -07008704 uint32_t Data[] = {1, 2, 3, 4, 5, 6, 7, 8};
8705 VkDeviceSize dataSize = sizeof(Data) / sizeof(uint32_t);
8706 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, &Data);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008707
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008708 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008709}
8710
Karl Schultz6addd812016-02-02 17:17:23 -07008711TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008712 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008713 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8714 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008715
Tony Barbour1fa09702017-03-16 12:09:08 -06008716 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008717 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008718
Tony Barbour552f6c02016-12-21 14:34:07 -07008719 m_commandBuffer->BeginCommandBuffer();
8720 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008721
Michael Lentine0a369f62016-02-03 16:51:46 -06008722 VkClearColorValue clear_color;
8723 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07008724 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8725 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8726 const int32_t tex_width = 32;
8727 const int32_t tex_height = 32;
8728 VkImageCreateInfo image_create_info = {};
8729 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8730 image_create_info.pNext = NULL;
8731 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8732 image_create_info.format = tex_format;
8733 image_create_info.extent.width = tex_width;
8734 image_create_info.extent.height = tex_height;
8735 image_create_info.extent.depth = 1;
8736 image_create_info.mipLevels = 1;
8737 image_create_info.arrayLayers = 1;
8738 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8739 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
Jeremy Hayesa3d5c7b2017-03-07 16:01:52 -07008740 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008741
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008742 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008743 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008744
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008745 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008746
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008747 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008748
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008749 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008750}
8751
Karl Schultz6addd812016-02-02 17:17:23 -07008752TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008753 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008754 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8755 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008756
Tony Barbour1fa09702017-03-16 12:09:08 -06008757 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008758 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008759
Tony Barbourf887b162017-03-09 10:06:46 -07008760 auto depth_format = find_depth_stencil_format(m_device);
8761 if (!depth_format) {
8762 printf(" No Depth + Stencil format found. Skipped.\n");
8763 return;
8764 }
8765
Tony Barbour552f6c02016-12-21 14:34:07 -07008766 m_commandBuffer->BeginCommandBuffer();
8767 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008768
8769 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07008770 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008771 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
8772 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -07008773 image_create_info.format = depth_format;
Karl Schultz6addd812016-02-02 17:17:23 -07008774 image_create_info.extent.width = 64;
8775 image_create_info.extent.height = 64;
8776 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8777 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008778
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008779 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008780 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008781
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008782 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008783
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008784 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
8785 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008786
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008787 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008788}
8789
Karl Schultz6addd812016-02-02 17:17:23 -07008790TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008791 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008792 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008793
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008794 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8795 "vkCmdClearAttachments(): This call "
8796 "must be issued inside an active "
8797 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008798
Tony Barbour1fa09702017-03-16 12:09:08 -06008799 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008800 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008801
8802 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008803 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008804 ASSERT_VK_SUCCESS(err);
8805
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008806 VkClearAttachment color_attachment;
8807 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8808 color_attachment.clearValue.color.float32[0] = 0;
8809 color_attachment.clearValue.color.float32[1] = 0;
8810 color_attachment.clearValue.color.float32[2] = 0;
8811 color_attachment.clearValue.color.float32[3] = 0;
8812 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008813 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008814 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008815
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008816 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008817}
8818
Chris Forbes3b97e932016-09-07 11:29:24 +12008819TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008820 TEST_DESCRIPTION(
8821 "Test that an error is produced when CmdNextSubpass is "
8822 "called too many times in a renderpass instance");
Chris Forbes3b97e932016-09-07 11:29:24 +12008823
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008824 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8825 "vkCmdNextSubpass(): Attempted to advance "
8826 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12008827
Tony Barbour1fa09702017-03-16 12:09:08 -06008828 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3b97e932016-09-07 11:29:24 +12008829 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8830
Tony Barbour552f6c02016-12-21 14:34:07 -07008831 m_commandBuffer->BeginCommandBuffer();
8832 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12008833
8834 // error here.
8835 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
8836 m_errorMonitor->VerifyFound();
8837
Tony Barbour552f6c02016-12-21 14:34:07 -07008838 m_commandBuffer->EndRenderPass();
8839 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12008840}
8841
Chris Forbes6d624702016-09-07 13:57:05 +12008842TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008843 TEST_DESCRIPTION(
8844 "Test that an error is produced when CmdEndRenderPass is "
8845 "called before the final subpass has been reached");
Chris Forbes6d624702016-09-07 13:57:05 +12008846
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8848 "vkCmdEndRenderPass(): Called before reaching "
8849 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12008850
Tony Barbour1fa09702017-03-16 12:09:08 -06008851 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008852 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
8853 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12008854
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008855 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12008856
8857 VkRenderPass rp;
8858 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
8859 ASSERT_VK_SUCCESS(err);
8860
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008861 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12008862
8863 VkFramebuffer fb;
8864 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
8865 ASSERT_VK_SUCCESS(err);
8866
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008867 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12008868
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008869 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {16, 16}}, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12008870
8871 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
8872
8873 // Error here.
8874 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8875 m_errorMonitor->VerifyFound();
8876
8877 // Clean up.
8878 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
8879 vkDestroyRenderPass(m_device->device(), rp, nullptr);
8880}
8881
Karl Schultz9e66a292016-04-21 15:57:51 -06008882TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
8883 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008884 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8885 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06008886
Tony Barbour1fa09702017-03-16 12:09:08 -06008887 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour552f6c02016-12-21 14:34:07 -07008888 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06008889
8890 VkBufferMemoryBarrier buf_barrier = {};
8891 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8892 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8893 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8894 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8895 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8896 buf_barrier.buffer = VK_NULL_HANDLE;
8897 buf_barrier.offset = 0;
8898 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008899 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8900 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06008901
8902 m_errorMonitor->VerifyFound();
8903}
8904
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008905TEST_F(VkLayerTest, InvalidBarriers) {
8906 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
8907
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008908 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008909
Tony Barbour1fa09702017-03-16 12:09:08 -06008910 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -07008911 auto depth_format = find_depth_stencil_format(m_device);
8912 if (!depth_format) {
8913 printf(" No Depth + Stencil format found. Skipped.\n");
8914 return;
8915 }
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008916 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8917
8918 VkMemoryBarrier mem_barrier = {};
8919 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
8920 mem_barrier.pNext = NULL;
8921 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8922 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07008923 m_commandBuffer->BeginCommandBuffer();
8924 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008925 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008926 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008927 &mem_barrier, 0, nullptr, 0, nullptr);
8928 m_errorMonitor->VerifyFound();
8929
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008930 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008931 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008932 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008933 ASSERT_TRUE(image.initialized());
8934 VkImageMemoryBarrier img_barrier = {};
8935 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8936 img_barrier.pNext = NULL;
8937 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8938 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8939 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8940 // New layout can't be UNDEFINED
8941 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8942 img_barrier.image = image.handle();
8943 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8944 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8945 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8946 img_barrier.subresourceRange.baseArrayLayer = 0;
8947 img_barrier.subresourceRange.baseMipLevel = 0;
8948 img_barrier.subresourceRange.layerCount = 1;
8949 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008950 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8951 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008952 m_errorMonitor->VerifyFound();
8953 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8954
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008955 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8956 "Subresource must have the sum of the "
8957 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008958 // baseArrayLayer + layerCount must be <= image's arrayLayers
8959 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008960 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8961 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008962 m_errorMonitor->VerifyFound();
8963 img_barrier.subresourceRange.baseArrayLayer = 0;
8964
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008965 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008966 // baseMipLevel + levelCount must be <= image's mipLevels
8967 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008968 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8969 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008970 m_errorMonitor->VerifyFound();
8971 img_barrier.subresourceRange.baseMipLevel = 0;
8972
Mike Weiblen7053aa32017-01-25 15:21:10 -07008973 // levelCount must be non-zero.
8974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
8975 img_barrier.subresourceRange.levelCount = 0;
8976 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8977 nullptr, 0, nullptr, 1, &img_barrier);
8978 m_errorMonitor->VerifyFound();
8979 img_barrier.subresourceRange.levelCount = 1;
8980
8981 // layerCount must be non-zero.
8982 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
8983 img_barrier.subresourceRange.layerCount = 0;
8984 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8985 nullptr, 0, nullptr, 1, &img_barrier);
8986 m_errorMonitor->VerifyFound();
8987 img_barrier.subresourceRange.layerCount = 1;
8988
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Buffer Barriers cannot be used during a render pass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008990 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07008991 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8992 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008993 VkBufferMemoryBarrier buf_barrier = {};
8994 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8995 buf_barrier.pNext = NULL;
8996 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8997 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8998 buf_barrier.buffer = buffer.handle();
8999 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9000 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9001 buf_barrier.offset = 0;
9002 buf_barrier.size = VK_WHOLE_SIZE;
9003 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009004 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9005 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009006 m_errorMonitor->VerifyFound();
9007 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9008
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009009 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009010 buf_barrier.offset = 257;
9011 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009012 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9013 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009014 m_errorMonitor->VerifyFound();
9015 buf_barrier.offset = 0;
9016
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009017 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009018 buf_barrier.size = 257;
9019 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009020 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9021 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009022 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009023
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009024 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009025 m_errorMonitor->SetDesiredFailureMsg(
9026 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009027 "Depth/stencil image formats must have at least one of VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009028 VkDepthStencilObj ds_image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -07009029 ds_image.Init(m_device, 128, 128, depth_format);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009030 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06009031 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9032 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009033 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009034
9035 // Not having DEPTH or STENCIL set is an error
Rene Lindsay4834cba2017-02-02 17:18:56 -07009036 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009037 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9038 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009039 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07009040
9041 // Having anything other than DEPTH or STENCIL is an error
9042 m_errorMonitor->SetDesiredFailureMsg(
9043 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9044 "Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
9045 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
9046 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9047 nullptr, 0, nullptr, 1, &img_barrier);
9048 m_errorMonitor->VerifyFound();
9049
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009050 // Now test depth-only
9051 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009052 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
9053 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009054 VkDepthStencilObj d_image(m_device);
9055 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
9056 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009057 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009058 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009059 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009060
9061 // DEPTH bit must be set
9062 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9063 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009064 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009065 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9066 0, nullptr, 0, nullptr, 1, &img_barrier);
9067 m_errorMonitor->VerifyFound();
9068
9069 // No bits other than DEPTH may be set
9070 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9071 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
9072 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009073 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9074 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009075 m_errorMonitor->VerifyFound();
9076 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009077
9078 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009079 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
9080 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009081 VkDepthStencilObj s_image(m_device);
9082 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
9083 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009084 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009085 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009086 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06009087 // Use of COLOR aspect on depth image is error
Dave Houltonf3229d52017-02-21 15:59:08 -07009088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9089 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis15684a02016-07-21 14:55:26 -06009090 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009091 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9092 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009093 m_errorMonitor->VerifyFound();
9094 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009095
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009096 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009097 VkImageObj c_image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009098 c_image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009099 ASSERT_TRUE(c_image.initialized());
9100 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9101 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9102 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009103
9104 // COLOR bit must be set
9105 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9106 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009107 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009108 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9109 nullptr, 0, nullptr, 1, &img_barrier);
9110 m_errorMonitor->VerifyFound();
9111
9112 // No bits other than COLOR may be set
9113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9114 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
9115 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009116 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9117 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009118 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009119
Mike Weiblene6e01172017-03-07 22:18:40 -07009120 // A barrier's new and old VkImageLayout must be compatible with an image's VkImageUsageFlags.
9121 {
9122 VkImageObj img_color(m_device);
9123 img_color.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
9124 ASSERT_TRUE(img_color.initialized());
9125
9126 VkImageObj img_ds(m_device);
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;
9939 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
9940 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9941 m_errorMonitor->VerifyFound();
9942
9943 // Reduce size of range to acceptable limit & cause offset error
9944 buff_info.range = max_ub_range;
9945 buff_info.offset = min_ub_align - 1;
9946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
9947 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9948 m_errorMonitor->VerifyFound();
9949
9950 // Now break storage updates
9951 buff_info.buffer = storage_buffer;
9952 buff_info.range = sb_ci.size; // This will exceed limit
9953 buff_info.offset = 0; // Reset offset for this update
9954
9955 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9956 descriptor_write.dstBinding = 1;
9957 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
9958 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9959 m_errorMonitor->VerifyFound();
9960
9961 // Reduce size of range to acceptable limit & cause offset error
9962 buff_info.range = max_sb_range;
9963 buff_info.offset = min_sb_align - 1;
9964 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
9965 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9966 m_errorMonitor->VerifyFound();
9967
9968 vkFreeMemory(m_device->device(), mem, NULL);
9969 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9970 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9971 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9972 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9973}
9974
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009975TEST_F(VkLayerTest, DSAspectBitsErrors) {
9976 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
9977 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009978 TEST_DESCRIPTION(
9979 "Attempt to update descriptor sets for images "
9980 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009981 VkResult err;
9982
Tony Barbour1fa09702017-03-16 12:09:08 -06009983 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -07009984 auto depth_format = find_depth_stencil_format(m_device);
9985 if (!depth_format) {
9986 printf(" No Depth + Stencil format found. Skipped.\n");
9987 return;
9988 }
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009989 VkDescriptorPoolSize ds_type_count = {};
9990 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9991 ds_type_count.descriptorCount = 1;
9992
9993 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9994 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9995 ds_pool_ci.pNext = NULL;
Jeremy Hayes293c7ed2017-03-09 14:47:07 -07009996 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009997 ds_pool_ci.maxSets = 5;
9998 ds_pool_ci.poolSizeCount = 1;
9999 ds_pool_ci.pPoolSizes = &ds_type_count;
10000
10001 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010002 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010003 ASSERT_VK_SUCCESS(err);
10004
10005 VkDescriptorSetLayoutBinding dsl_binding = {};
10006 dsl_binding.binding = 0;
10007 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10008 dsl_binding.descriptorCount = 1;
10009 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10010 dsl_binding.pImmutableSamplers = NULL;
10011
10012 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10013 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10014 ds_layout_ci.pNext = NULL;
10015 ds_layout_ci.bindingCount = 1;
10016 ds_layout_ci.pBindings = &dsl_binding;
10017 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010018 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010019 ASSERT_VK_SUCCESS(err);
10020
10021 VkDescriptorSet descriptor_set = {};
10022 VkDescriptorSetAllocateInfo alloc_info = {};
10023 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10024 alloc_info.descriptorSetCount = 1;
10025 alloc_info.descriptorPool = ds_pool;
10026 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010027 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010028 ASSERT_VK_SUCCESS(err);
10029
10030 // Create an image to be used for invalid updates
10031 VkImageCreateInfo image_ci = {};
10032 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10033 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070010034 image_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010035 image_ci.extent.width = 64;
10036 image_ci.extent.height = 64;
10037 image_ci.extent.depth = 1;
10038 image_ci.mipLevels = 1;
10039 image_ci.arrayLayers = 1;
10040 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Young2d1fa302017-03-02 10:13:09 -070010041 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010042 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10043 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10044 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10045 VkImage image;
10046 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10047 ASSERT_VK_SUCCESS(err);
10048 // Bind memory to image
10049 VkMemoryRequirements mem_reqs;
10050 VkDeviceMemory image_mem;
10051 bool pass;
10052 VkMemoryAllocateInfo mem_alloc = {};
10053 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10054 mem_alloc.pNext = NULL;
10055 mem_alloc.allocationSize = 0;
10056 mem_alloc.memoryTypeIndex = 0;
10057 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10058 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010059 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010060 ASSERT_TRUE(pass);
10061 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10062 ASSERT_VK_SUCCESS(err);
10063 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10064 ASSERT_VK_SUCCESS(err);
10065 // Now create view for image
10066 VkImageViewCreateInfo image_view_ci = {};
10067 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10068 image_view_ci.image = image;
Tony Barbourf887b162017-03-09 10:06:46 -070010069 image_view_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010070 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10071 image_view_ci.subresourceRange.layerCount = 1;
10072 image_view_ci.subresourceRange.baseArrayLayer = 0;
10073 image_view_ci.subresourceRange.levelCount = 1;
10074 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010075 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010076
10077 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010078 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010079 ASSERT_VK_SUCCESS(err);
10080
10081 VkDescriptorImageInfo img_info = {};
10082 img_info.imageView = image_view;
10083 VkWriteDescriptorSet descriptor_write = {};
10084 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10085 descriptor_write.dstBinding = 0;
10086 descriptor_write.descriptorCount = 1;
10087 descriptor_write.pTexelBufferView = NULL;
10088 descriptor_write.pBufferInfo = NULL;
10089 descriptor_write.pImageInfo = &img_info;
10090 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10091 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010092 const char *error_msg =
10093 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10094 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010095 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010096
10097 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10098
10099 m_errorMonitor->VerifyFound();
10100 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10101 vkDestroyImage(m_device->device(), image, NULL);
10102 vkFreeMemory(m_device->device(), image_mem, NULL);
10103 vkDestroyImageView(m_device->device(), image_view, NULL);
10104 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10105 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10106}
10107
Karl Schultz6addd812016-02-02 17:17:23 -070010108TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010109 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010110 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010111
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010112 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10113 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10114 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010115
Tony Barbour1fa09702017-03-16 12:09:08 -060010116 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010117 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010118 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010119 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10120 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010121
10122 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010123 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10124 ds_pool_ci.pNext = NULL;
10125 ds_pool_ci.maxSets = 1;
10126 ds_pool_ci.poolSizeCount = 1;
10127 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010128
Tobin Ehlis3b780662015-05-28 12:11:26 -060010129 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010130 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010131 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010132 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010133 dsl_binding.binding = 0;
10134 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10135 dsl_binding.descriptorCount = 1;
10136 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10137 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010138
Tony Barboureb254902015-07-15 12:50:33 -060010139 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010140 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10141 ds_layout_ci.pNext = NULL;
10142 ds_layout_ci.bindingCount = 1;
10143 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010144
Tobin Ehlis3b780662015-05-28 12:11:26 -060010145 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010146 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010147 ASSERT_VK_SUCCESS(err);
10148
10149 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010150 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010151 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010152 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010153 alloc_info.descriptorPool = ds_pool;
10154 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010155 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010156 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010157
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010158 VkSamplerCreateInfo sampler_ci = {};
10159 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10160 sampler_ci.pNext = NULL;
10161 sampler_ci.magFilter = VK_FILTER_NEAREST;
10162 sampler_ci.minFilter = VK_FILTER_NEAREST;
10163 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10164 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10165 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10166 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10167 sampler_ci.mipLodBias = 1.0;
10168 sampler_ci.anisotropyEnable = VK_FALSE;
10169 sampler_ci.maxAnisotropy = 1;
10170 sampler_ci.compareEnable = VK_FALSE;
10171 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10172 sampler_ci.minLod = 1.0;
10173 sampler_ci.maxLod = 1.0;
10174 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10175 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10176 VkSampler sampler;
10177 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10178 ASSERT_VK_SUCCESS(err);
10179
10180 VkDescriptorImageInfo info = {};
10181 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010182
10183 VkWriteDescriptorSet descriptor_write;
10184 memset(&descriptor_write, 0, sizeof(descriptor_write));
10185 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010186 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010187 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010188 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010189 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010190 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010191
10192 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10193
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010194 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010195
Chia-I Wuf7458c52015-10-26 21:10:41 +080010196 vkDestroySampler(m_device->device(), sampler, NULL);
10197 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10198 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010199}
10200
Karl Schultz6addd812016-02-02 17:17:23 -070010201TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010202 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010203 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010204
Tobin Ehlisf922ef82016-11-30 10:19:14 -070010205 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010206
Tony Barbour1fa09702017-03-16 12:09:08 -060010207 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010208 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010209 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010210 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10211 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010212
10213 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010214 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10215 ds_pool_ci.pNext = NULL;
10216 ds_pool_ci.maxSets = 1;
10217 ds_pool_ci.poolSizeCount = 1;
10218 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010219
Tobin Ehlis3b780662015-05-28 12:11:26 -060010220 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010221 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010222 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010223
Tony Barboureb254902015-07-15 12:50:33 -060010224 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010225 dsl_binding.binding = 0;
10226 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10227 dsl_binding.descriptorCount = 1;
10228 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10229 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010230
10231 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010232 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10233 ds_layout_ci.pNext = NULL;
10234 ds_layout_ci.bindingCount = 1;
10235 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010236
Tobin Ehlis3b780662015-05-28 12:11:26 -060010237 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010238 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010239 ASSERT_VK_SUCCESS(err);
10240
10241 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010242 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010243 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010244 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010245 alloc_info.descriptorPool = ds_pool;
10246 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010247 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010248 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010249
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010250 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
10251
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010252 // Correctly update descriptor to avoid "NOT_UPDATED" error
10253 VkDescriptorBufferInfo buff_info = {};
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010254 buff_info.buffer = buffer_test.GetBuffer();
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010255 buff_info.offset = 0;
10256 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010257
10258 VkWriteDescriptorSet descriptor_write;
10259 memset(&descriptor_write, 0, sizeof(descriptor_write));
10260 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010261 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010262 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010263 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010264 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10265 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010266
10267 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10268
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010269 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010270
Chia-I Wuf7458c52015-10-26 21:10:41 +080010271 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10272 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010273}
10274
Karl Schultz6addd812016-02-02 17:17:23 -070010275TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010276 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -070010277 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010278
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010279 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010280
Tony Barbour1fa09702017-03-16 12:09:08 -060010281 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010282 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010283 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010284 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10285 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010286
10287 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010288 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10289 ds_pool_ci.pNext = NULL;
10290 ds_pool_ci.maxSets = 1;
10291 ds_pool_ci.poolSizeCount = 1;
10292 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010293
Tobin Ehlis3b780662015-05-28 12:11:26 -060010294 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010295 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010296 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010297
Tony Barboureb254902015-07-15 12:50:33 -060010298 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010299 dsl_binding.binding = 0;
10300 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10301 dsl_binding.descriptorCount = 1;
10302 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10303 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010304
10305 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010306 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10307 ds_layout_ci.pNext = NULL;
10308 ds_layout_ci.bindingCount = 1;
10309 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010310 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010311 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010312 ASSERT_VK_SUCCESS(err);
10313
10314 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010315 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010316 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010317 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010318 alloc_info.descriptorPool = ds_pool;
10319 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010320 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010321 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010322
Tony Barboureb254902015-07-15 12:50:33 -060010323 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010324 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10325 sampler_ci.pNext = NULL;
10326 sampler_ci.magFilter = VK_FILTER_NEAREST;
10327 sampler_ci.minFilter = VK_FILTER_NEAREST;
10328 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10329 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10330 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10331 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10332 sampler_ci.mipLodBias = 1.0;
10333 sampler_ci.anisotropyEnable = VK_FALSE;
10334 sampler_ci.maxAnisotropy = 1;
10335 sampler_ci.compareEnable = VK_FALSE;
10336 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10337 sampler_ci.minLod = 1.0;
10338 sampler_ci.maxLod = 1.0;
10339 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10340 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010341
Tobin Ehlis3b780662015-05-28 12:11:26 -060010342 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010343 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010344 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010345
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010346 VkDescriptorImageInfo info = {};
10347 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010348
10349 VkWriteDescriptorSet descriptor_write;
10350 memset(&descriptor_write, 0, sizeof(descriptor_write));
10351 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010352 descriptor_write.dstSet = descriptorSet;
10353 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010354 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010355 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010356 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010357 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010358
10359 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10360
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010361 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010362
Chia-I Wuf7458c52015-10-26 21:10:41 +080010363 vkDestroySampler(m_device->device(), sampler, NULL);
10364 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10365 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010366}
10367
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010368TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
10369 // Create layout w/ empty binding and attempt to update it
10370 VkResult err;
10371
Tony Barbour1fa09702017-03-16 12:09:08 -060010372 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010373
10374 VkDescriptorPoolSize ds_type_count = {};
10375 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10376 ds_type_count.descriptorCount = 1;
10377
10378 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10379 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10380 ds_pool_ci.pNext = NULL;
10381 ds_pool_ci.maxSets = 1;
10382 ds_pool_ci.poolSizeCount = 1;
10383 ds_pool_ci.pPoolSizes = &ds_type_count;
10384
10385 VkDescriptorPool ds_pool;
10386 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10387 ASSERT_VK_SUCCESS(err);
10388
10389 VkDescriptorSetLayoutBinding dsl_binding = {};
10390 dsl_binding.binding = 0;
10391 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10392 dsl_binding.descriptorCount = 0;
10393 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10394 dsl_binding.pImmutableSamplers = NULL;
10395
10396 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10397 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10398 ds_layout_ci.pNext = NULL;
10399 ds_layout_ci.bindingCount = 1;
10400 ds_layout_ci.pBindings = &dsl_binding;
10401 VkDescriptorSetLayout ds_layout;
10402 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10403 ASSERT_VK_SUCCESS(err);
10404
10405 VkDescriptorSet descriptor_set;
10406 VkDescriptorSetAllocateInfo alloc_info = {};
10407 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10408 alloc_info.descriptorSetCount = 1;
10409 alloc_info.descriptorPool = ds_pool;
10410 alloc_info.pSetLayouts = &ds_layout;
10411 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10412 ASSERT_VK_SUCCESS(err);
10413
10414 VkSamplerCreateInfo sampler_ci = {};
10415 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10416 sampler_ci.magFilter = VK_FILTER_NEAREST;
10417 sampler_ci.minFilter = VK_FILTER_NEAREST;
10418 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10419 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10420 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10421 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10422 sampler_ci.mipLodBias = 1.0;
10423 sampler_ci.maxAnisotropy = 1;
10424 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10425 sampler_ci.minLod = 1.0;
10426 sampler_ci.maxLod = 1.0;
10427 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10428
10429 VkSampler sampler;
10430 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10431 ASSERT_VK_SUCCESS(err);
10432
10433 VkDescriptorImageInfo info = {};
10434 info.sampler = sampler;
10435
10436 VkWriteDescriptorSet descriptor_write;
10437 memset(&descriptor_write, 0, sizeof(descriptor_write));
10438 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10439 descriptor_write.dstSet = descriptor_set;
10440 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010441 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010442 // This is the wrong type, but empty binding error will be flagged first
10443 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10444 descriptor_write.pImageInfo = &info;
10445
10446 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
10447 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10448 m_errorMonitor->VerifyFound();
10449
10450 vkDestroySampler(m_device->device(), sampler, NULL);
10451 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10452 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10453}
10454
Karl Schultz6addd812016-02-02 17:17:23 -070010455TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10456 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10457 // types
10458 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010459
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010460 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, ".sType must be VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010461
Tony Barbour1fa09702017-03-16 12:09:08 -060010462 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010463
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010464 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010465 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10466 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010467
10468 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010469 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10470 ds_pool_ci.pNext = NULL;
10471 ds_pool_ci.maxSets = 1;
10472 ds_pool_ci.poolSizeCount = 1;
10473 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010474
Tobin Ehlis3b780662015-05-28 12:11:26 -060010475 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010476 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010477 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010478 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010479 dsl_binding.binding = 0;
10480 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10481 dsl_binding.descriptorCount = 1;
10482 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10483 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010484
Tony Barboureb254902015-07-15 12:50:33 -060010485 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010486 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10487 ds_layout_ci.pNext = NULL;
10488 ds_layout_ci.bindingCount = 1;
10489 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010490
Tobin Ehlis3b780662015-05-28 12:11:26 -060010491 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010492 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010493 ASSERT_VK_SUCCESS(err);
10494
10495 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010496 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010497 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010498 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010499 alloc_info.descriptorPool = ds_pool;
10500 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010501 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010502 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010503
Tony Barboureb254902015-07-15 12:50:33 -060010504 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010505 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10506 sampler_ci.pNext = NULL;
10507 sampler_ci.magFilter = VK_FILTER_NEAREST;
10508 sampler_ci.minFilter = VK_FILTER_NEAREST;
10509 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10510 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10511 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10512 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10513 sampler_ci.mipLodBias = 1.0;
10514 sampler_ci.anisotropyEnable = VK_FALSE;
10515 sampler_ci.maxAnisotropy = 1;
10516 sampler_ci.compareEnable = VK_FALSE;
10517 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10518 sampler_ci.minLod = 1.0;
10519 sampler_ci.maxLod = 1.0;
10520 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10521 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010522 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010523 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010524 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010525
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010526 VkDescriptorImageInfo info = {};
10527 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010528
10529 VkWriteDescriptorSet descriptor_write;
10530 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010531 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010532 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010533 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010534 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010535 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010536 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010537
10538 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10539
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010540 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010541
Chia-I Wuf7458c52015-10-26 21:10:41 +080010542 vkDestroySampler(m_device->device(), sampler, NULL);
10543 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10544 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010545}
10546
Karl Schultz6addd812016-02-02 17:17:23 -070010547TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010548 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010549 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010550
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010551 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010552
Tony Barbour1fa09702017-03-16 12:09:08 -060010553 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010554 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10555 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010556 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010557 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10558 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010559
10560 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010561 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10562 ds_pool_ci.pNext = NULL;
10563 ds_pool_ci.maxSets = 1;
10564 ds_pool_ci.poolSizeCount = 1;
10565 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010566
10567 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010568 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010569 ASSERT_VK_SUCCESS(err);
10570
10571 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010572 dsl_binding.binding = 0;
10573 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10574 dsl_binding.descriptorCount = 1;
10575 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10576 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010577
10578 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010579 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10580 ds_layout_ci.pNext = NULL;
10581 ds_layout_ci.bindingCount = 1;
10582 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010583 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010584 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010585 ASSERT_VK_SUCCESS(err);
10586
10587 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010588 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010589 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010590 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010591 alloc_info.descriptorPool = ds_pool;
10592 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010593 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010594 ASSERT_VK_SUCCESS(err);
10595
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010596 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010597
10598 VkDescriptorImageInfo descriptor_info;
10599 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10600 descriptor_info.sampler = sampler;
10601
10602 VkWriteDescriptorSet descriptor_write;
10603 memset(&descriptor_write, 0, sizeof(descriptor_write));
10604 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010605 descriptor_write.dstSet = descriptorSet;
10606 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010607 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010608 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10609 descriptor_write.pImageInfo = &descriptor_info;
10610
10611 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10612
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010613 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010614
Chia-I Wuf7458c52015-10-26 21:10:41 +080010615 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10616 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010617}
10618
Karl Schultz6addd812016-02-02 17:17:23 -070010619TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10620 // Create a single combined Image/Sampler descriptor and send it an invalid
10621 // imageView
10622 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010623
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010624 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010625
Tony Barbour1fa09702017-03-16 12:09:08 -060010626 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010627 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010628 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10629 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010630
10631 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010632 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10633 ds_pool_ci.pNext = NULL;
10634 ds_pool_ci.maxSets = 1;
10635 ds_pool_ci.poolSizeCount = 1;
10636 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010637
10638 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010639 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010640 ASSERT_VK_SUCCESS(err);
10641
10642 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010643 dsl_binding.binding = 0;
10644 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10645 dsl_binding.descriptorCount = 1;
10646 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10647 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010648
10649 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010650 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10651 ds_layout_ci.pNext = NULL;
10652 ds_layout_ci.bindingCount = 1;
10653 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010654 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010655 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010656 ASSERT_VK_SUCCESS(err);
10657
10658 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010659 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010660 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010661 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010662 alloc_info.descriptorPool = ds_pool;
10663 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010664 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010665 ASSERT_VK_SUCCESS(err);
10666
10667 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010668 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10669 sampler_ci.pNext = NULL;
10670 sampler_ci.magFilter = VK_FILTER_NEAREST;
10671 sampler_ci.minFilter = VK_FILTER_NEAREST;
10672 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10673 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10674 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10675 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10676 sampler_ci.mipLodBias = 1.0;
10677 sampler_ci.anisotropyEnable = VK_FALSE;
10678 sampler_ci.maxAnisotropy = 1;
10679 sampler_ci.compareEnable = VK_FALSE;
10680 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10681 sampler_ci.minLod = 1.0;
10682 sampler_ci.maxLod = 1.0;
10683 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10684 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010685
10686 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010687 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010688 ASSERT_VK_SUCCESS(err);
10689
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010690 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010691
10692 VkDescriptorImageInfo descriptor_info;
10693 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10694 descriptor_info.sampler = sampler;
10695 descriptor_info.imageView = view;
10696
10697 VkWriteDescriptorSet descriptor_write;
10698 memset(&descriptor_write, 0, sizeof(descriptor_write));
10699 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010700 descriptor_write.dstSet = descriptorSet;
10701 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010702 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010703 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10704 descriptor_write.pImageInfo = &descriptor_info;
10705
10706 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10707
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010708 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010709
Chia-I Wuf7458c52015-10-26 21:10:41 +080010710 vkDestroySampler(m_device->device(), sampler, NULL);
10711 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10712 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010713}
10714
Karl Schultz6addd812016-02-02 17:17:23 -070010715TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10716 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10717 // into the other
10718 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010719
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010720 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10721 " binding #1 with type "
10722 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10723 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010724
Tony Barbour1fa09702017-03-16 12:09:08 -060010725 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010726 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010727 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010728 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10729 ds_type_count[0].descriptorCount = 1;
10730 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10731 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010732
10733 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010734 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10735 ds_pool_ci.pNext = NULL;
10736 ds_pool_ci.maxSets = 1;
10737 ds_pool_ci.poolSizeCount = 2;
10738 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010739
10740 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010741 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010742 ASSERT_VK_SUCCESS(err);
10743 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010744 dsl_binding[0].binding = 0;
10745 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10746 dsl_binding[0].descriptorCount = 1;
10747 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10748 dsl_binding[0].pImmutableSamplers = NULL;
10749 dsl_binding[1].binding = 1;
10750 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10751 dsl_binding[1].descriptorCount = 1;
10752 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10753 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010754
10755 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010756 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10757 ds_layout_ci.pNext = NULL;
10758 ds_layout_ci.bindingCount = 2;
10759 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010760
10761 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010762 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010763 ASSERT_VK_SUCCESS(err);
10764
10765 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010766 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010767 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010768 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010769 alloc_info.descriptorPool = ds_pool;
10770 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010771 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010772 ASSERT_VK_SUCCESS(err);
10773
10774 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010775 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10776 sampler_ci.pNext = NULL;
10777 sampler_ci.magFilter = VK_FILTER_NEAREST;
10778 sampler_ci.minFilter = VK_FILTER_NEAREST;
10779 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10780 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10781 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10782 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10783 sampler_ci.mipLodBias = 1.0;
10784 sampler_ci.anisotropyEnable = VK_FALSE;
10785 sampler_ci.maxAnisotropy = 1;
10786 sampler_ci.compareEnable = VK_FALSE;
10787 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10788 sampler_ci.minLod = 1.0;
10789 sampler_ci.maxLod = 1.0;
10790 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10791 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010792
10793 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010794 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010795 ASSERT_VK_SUCCESS(err);
10796
10797 VkDescriptorImageInfo info = {};
10798 info.sampler = sampler;
10799
10800 VkWriteDescriptorSet descriptor_write;
10801 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
10802 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010803 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010804 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080010805 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010806 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10807 descriptor_write.pImageInfo = &info;
10808 // This write update should succeed
10809 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10810 // Now perform a copy update that fails due to type mismatch
10811 VkCopyDescriptorSet copy_ds_update;
10812 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10813 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10814 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010815 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010816 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010817 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
10818 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010819 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10820
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010821 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010822 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010823 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " does not have copy update src binding of 3.");
Tobin Ehlis04356f92015-10-27 16:35:27 -060010824 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10825 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10826 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010827 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010828 copy_ds_update.dstSet = descriptorSet;
10829 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010830 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010831 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10832
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010833 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010834
Tobin Ehlis04356f92015-10-27 16:35:27 -060010835 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010836 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10837 " binding#1 with offset index of 1 plus "
10838 "update array offset of 0 and update of "
10839 "5 descriptors oversteps total number "
10840 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010841
Tobin Ehlis04356f92015-10-27 16:35:27 -060010842 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10843 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10844 copy_ds_update.srcSet = descriptorSet;
10845 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010846 copy_ds_update.dstSet = descriptorSet;
10847 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010848 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060010849 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10850
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010851 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010852
Chia-I Wuf7458c52015-10-26 21:10:41 +080010853 vkDestroySampler(m_device->device(), sampler, NULL);
10854 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10855 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010856}
10857
Karl Schultz6addd812016-02-02 17:17:23 -070010858TEST_F(VkLayerTest, NumSamplesMismatch) {
10859 // Create CommandBuffer where MSAA samples doesn't match RenderPass
10860 // sampleCount
10861 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010862
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010864
Tony Barbour1fa09702017-03-16 12:09:08 -060010865 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010866 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010867 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060010868 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010869 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010870
10871 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010872 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10873 ds_pool_ci.pNext = NULL;
10874 ds_pool_ci.maxSets = 1;
10875 ds_pool_ci.poolSizeCount = 1;
10876 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010877
Tobin Ehlis3b780662015-05-28 12:11:26 -060010878 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010879 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010880 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010881
Tony Barboureb254902015-07-15 12:50:33 -060010882 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080010883 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060010884 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080010885 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010886 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10887 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010888
Tony Barboureb254902015-07-15 12:50:33 -060010889 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10890 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10891 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010892 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070010893 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010894
Tobin Ehlis3b780662015-05-28 12:11:26 -060010895 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010896 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010897 ASSERT_VK_SUCCESS(err);
10898
10899 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010900 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010901 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010902 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010903 alloc_info.descriptorPool = ds_pool;
10904 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010905 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010906 ASSERT_VK_SUCCESS(err);
10907
Tony Barboureb254902015-07-15 12:50:33 -060010908 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010909 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010910 pipe_ms_state_ci.pNext = NULL;
10911 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10912 pipe_ms_state_ci.sampleShadingEnable = 0;
10913 pipe_ms_state_ci.minSampleShading = 1.0;
10914 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010915
Tony Barboureb254902015-07-15 12:50:33 -060010916 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010917 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10918 pipeline_layout_ci.pNext = NULL;
10919 pipeline_layout_ci.setLayoutCount = 1;
10920 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010921
10922 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010923 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010924 ASSERT_VK_SUCCESS(err);
10925
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010926 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010927 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010928 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010929 VkPipelineObj pipe(m_device);
10930 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010931 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010932 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010933 pipe.SetMSAA(&pipe_ms_state_ci);
10934 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010935
Tony Barbour552f6c02016-12-21 14:34:07 -070010936 m_commandBuffer->BeginCommandBuffer();
10937 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010938 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010939
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070010940 VkViewport viewport = {0, 0, 16, 16, 0, 1};
10941 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
10942 VkRect2D scissor = {{0, 0}, {16, 16}};
10943 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
10944
Mark Young29927482016-05-04 14:38:51 -060010945 // Render triangle (the error should trigger on the attempt to draw).
10946 Draw(3, 1, 0, 0);
10947
10948 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070010949 m_commandBuffer->EndRenderPass();
10950 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060010951
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010952 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010953
Chia-I Wuf7458c52015-10-26 21:10:41 +080010954 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10955 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10956 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010957}
Mark Young29927482016-05-04 14:38:51 -060010958
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010959TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010960 TEST_DESCRIPTION(
10961 "Hit RenderPass incompatible cases. "
10962 "Initial case is drawing with an active renderpass that's "
10963 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010964 VkResult err;
10965
Tony Barbour1fa09702017-03-16 12:09:08 -060010966 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010967 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10968
10969 VkDescriptorSetLayoutBinding dsl_binding = {};
10970 dsl_binding.binding = 0;
10971 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10972 dsl_binding.descriptorCount = 1;
10973 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10974 dsl_binding.pImmutableSamplers = NULL;
10975
10976 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10977 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10978 ds_layout_ci.pNext = NULL;
10979 ds_layout_ci.bindingCount = 1;
10980 ds_layout_ci.pBindings = &dsl_binding;
10981
10982 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010983 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010984 ASSERT_VK_SUCCESS(err);
10985
10986 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10987 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10988 pipeline_layout_ci.pNext = NULL;
10989 pipeline_layout_ci.setLayoutCount = 1;
10990 pipeline_layout_ci.pSetLayouts = &ds_layout;
10991
10992 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010993 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010994 ASSERT_VK_SUCCESS(err);
10995
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010996 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010997 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010998 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010999 // Create a renderpass that will be incompatible with default renderpass
11000 VkAttachmentReference attach = {};
11001 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11002 VkAttachmentReference color_att = {};
11003 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11004 VkSubpassDescription subpass = {};
11005 subpass.inputAttachmentCount = 1;
11006 subpass.pInputAttachments = &attach;
11007 subpass.colorAttachmentCount = 1;
11008 subpass.pColorAttachments = &color_att;
11009 VkRenderPassCreateInfo rpci = {};
11010 rpci.subpassCount = 1;
11011 rpci.pSubpasses = &subpass;
11012 rpci.attachmentCount = 1;
11013 VkAttachmentDescription attach_desc = {};
11014 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011015 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11016 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011017 rpci.pAttachments = &attach_desc;
11018 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11019 VkRenderPass rp;
11020 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11021 VkPipelineObj pipe(m_device);
11022 pipe.AddShader(&vs);
11023 pipe.AddShader(&fs);
11024 pipe.AddColorAttachment();
11025 VkViewport view_port = {};
11026 m_viewports.push_back(view_port);
11027 pipe.SetViewport(m_viewports);
11028 VkRect2D rect = {};
11029 m_scissors.push_back(rect);
11030 pipe.SetScissor(m_scissors);
11031 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11032
11033 VkCommandBufferInheritanceInfo cbii = {};
11034 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11035 cbii.renderPass = rp;
11036 cbii.subpass = 0;
11037 VkCommandBufferBeginInfo cbbi = {};
11038 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11039 cbbi.pInheritanceInfo = &cbii;
11040 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11041 VkRenderPassBeginInfo rpbi = {};
11042 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11043 rpbi.framebuffer = m_framebuffer;
11044 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011045 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
11046 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011047
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011048 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011049 // Render triangle (the error should trigger on the attempt to draw).
11050 Draw(3, 1, 0, 0);
11051
11052 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011053 m_commandBuffer->EndRenderPass();
11054 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011055
11056 m_errorMonitor->VerifyFound();
11057
11058 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11059 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11060 vkDestroyRenderPass(m_device->device(), rp, NULL);
11061}
11062
Mark Youngc89c6312016-03-31 16:03:20 -060011063TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11064 // Create Pipeline where the number of blend attachments doesn't match the
11065 // number of color attachments. In this case, we don't add any color
11066 // blend attachments even though we have a color attachment.
11067 VkResult err;
11068
Tobin Ehlis974c0d92017-02-01 13:31:22 -070011069 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060011070
Tony Barbour1fa09702017-03-16 12:09:08 -060011071 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc89c6312016-03-31 16:03:20 -060011072 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11073 VkDescriptorPoolSize ds_type_count = {};
11074 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11075 ds_type_count.descriptorCount = 1;
11076
11077 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11078 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11079 ds_pool_ci.pNext = NULL;
11080 ds_pool_ci.maxSets = 1;
11081 ds_pool_ci.poolSizeCount = 1;
11082 ds_pool_ci.pPoolSizes = &ds_type_count;
11083
11084 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011085 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060011086 ASSERT_VK_SUCCESS(err);
11087
11088 VkDescriptorSetLayoutBinding dsl_binding = {};
11089 dsl_binding.binding = 0;
11090 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11091 dsl_binding.descriptorCount = 1;
11092 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11093 dsl_binding.pImmutableSamplers = NULL;
11094
11095 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11096 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11097 ds_layout_ci.pNext = NULL;
11098 ds_layout_ci.bindingCount = 1;
11099 ds_layout_ci.pBindings = &dsl_binding;
11100
11101 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011102 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011103 ASSERT_VK_SUCCESS(err);
11104
11105 VkDescriptorSet descriptorSet;
11106 VkDescriptorSetAllocateInfo alloc_info = {};
11107 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11108 alloc_info.descriptorSetCount = 1;
11109 alloc_info.descriptorPool = ds_pool;
11110 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011111 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060011112 ASSERT_VK_SUCCESS(err);
11113
11114 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011115 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060011116 pipe_ms_state_ci.pNext = NULL;
11117 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11118 pipe_ms_state_ci.sampleShadingEnable = 0;
11119 pipe_ms_state_ci.minSampleShading = 1.0;
11120 pipe_ms_state_ci.pSampleMask = NULL;
11121
11122 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11123 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11124 pipeline_layout_ci.pNext = NULL;
11125 pipeline_layout_ci.setLayoutCount = 1;
11126 pipeline_layout_ci.pSetLayouts = &ds_layout;
11127
11128 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011129 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011130 ASSERT_VK_SUCCESS(err);
11131
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011132 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011133 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011134 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060011135 VkPipelineObj pipe(m_device);
11136 pipe.AddShader(&vs);
11137 pipe.AddShader(&fs);
11138 pipe.SetMSAA(&pipe_ms_state_ci);
11139 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011140 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011141
11142 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11143 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11144 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11145}
Mark Young29927482016-05-04 14:38:51 -060011146
Mark Muellerd4914412016-06-13 17:52:06 -060011147TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011148 TEST_DESCRIPTION(
11149 "Points to a wrong colorAttachment index in a VkClearAttachment "
11150 "structure passed to vkCmdClearAttachments");
Tony Barbour1fa09702017-03-16 12:09:08 -060011151 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011152 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060011153
11154 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11155 m_errorMonitor->VerifyFound();
11156}
11157
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011158TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011159 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
11160 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011161
Tony Barbour1fa09702017-03-16 12:09:08 -060011162 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011163 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011164
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011165 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011166 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11167 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011168
11169 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011170 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11171 ds_pool_ci.pNext = NULL;
11172 ds_pool_ci.maxSets = 1;
11173 ds_pool_ci.poolSizeCount = 1;
11174 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011175
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011176 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011177 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011178 ASSERT_VK_SUCCESS(err);
11179
Tony Barboureb254902015-07-15 12:50:33 -060011180 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011181 dsl_binding.binding = 0;
11182 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11183 dsl_binding.descriptorCount = 1;
11184 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11185 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011186
Tony Barboureb254902015-07-15 12:50:33 -060011187 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011188 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11189 ds_layout_ci.pNext = NULL;
11190 ds_layout_ci.bindingCount = 1;
11191 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011192
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011193 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011194 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011195 ASSERT_VK_SUCCESS(err);
11196
11197 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011198 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011199 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011200 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011201 alloc_info.descriptorPool = ds_pool;
11202 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011203 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011204 ASSERT_VK_SUCCESS(err);
11205
Tony Barboureb254902015-07-15 12:50:33 -060011206 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011207 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011208 pipe_ms_state_ci.pNext = NULL;
11209 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11210 pipe_ms_state_ci.sampleShadingEnable = 0;
11211 pipe_ms_state_ci.minSampleShading = 1.0;
11212 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011213
Tony Barboureb254902015-07-15 12:50:33 -060011214 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011215 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11216 pipeline_layout_ci.pNext = NULL;
11217 pipeline_layout_ci.setLayoutCount = 1;
11218 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011219
11220 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011221 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011222 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011223
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011224 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011225 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011226 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011227 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011228
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011229 VkPipelineObj pipe(m_device);
11230 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011231 pipe.AddShader(&fs);
Jeremy Hayes7332f342017-03-09 15:54:12 -070011232 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011233 pipe.SetMSAA(&pipe_ms_state_ci);
11234 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011235
Tony Barbour552f6c02016-12-21 14:34:07 -070011236 m_commandBuffer->BeginCommandBuffer();
11237 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011238
Karl Schultz6addd812016-02-02 17:17:23 -070011239 // Main thing we care about for this test is that the VkImage obj we're
11240 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011241 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011242 VkClearAttachment color_attachment;
11243 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11244 color_attachment.clearValue.color.float32[0] = 1.0;
11245 color_attachment.clearValue.color.float32[1] = 1.0;
11246 color_attachment.clearValue.color.float32[2] = 1.0;
11247 color_attachment.clearValue.color.float32[3] = 1.0;
11248 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011249 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011250
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011251 // Call for full-sized FB Color attachment prior to issuing a Draw
11252 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070011253 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011254 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011255 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011256
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011257 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
11258 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
11259 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
11260 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
11261 m_errorMonitor->VerifyFound();
11262
11263 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
11264 clear_rect.layerCount = 2;
11265 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
11266 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011267 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011268
Chia-I Wuf7458c52015-10-26 21:10:41 +080011269 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11270 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11271 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011272}
11273
Karl Schultz6addd812016-02-02 17:17:23 -070011274TEST_F(VkLayerTest, VtxBufferBadIndex) {
11275 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011276
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011277 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11278 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011279
Tony Barbour1fa09702017-03-16 12:09:08 -060011280 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011281 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011282 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011283
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011284 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011285 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11286 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011287
11288 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011289 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11290 ds_pool_ci.pNext = NULL;
11291 ds_pool_ci.maxSets = 1;
11292 ds_pool_ci.poolSizeCount = 1;
11293 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011294
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011295 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011296 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011297 ASSERT_VK_SUCCESS(err);
11298
Tony Barboureb254902015-07-15 12:50:33 -060011299 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011300 dsl_binding.binding = 0;
11301 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11302 dsl_binding.descriptorCount = 1;
11303 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11304 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011305
Tony Barboureb254902015-07-15 12:50:33 -060011306 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011307 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11308 ds_layout_ci.pNext = NULL;
11309 ds_layout_ci.bindingCount = 1;
11310 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011311
Tobin Ehlis502480b2015-06-24 15:53:07 -060011312 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011313 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011314 ASSERT_VK_SUCCESS(err);
11315
11316 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011317 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011318 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011319 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011320 alloc_info.descriptorPool = ds_pool;
11321 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011322 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011323 ASSERT_VK_SUCCESS(err);
11324
Tony Barboureb254902015-07-15 12:50:33 -060011325 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011326 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011327 pipe_ms_state_ci.pNext = NULL;
11328 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11329 pipe_ms_state_ci.sampleShadingEnable = 0;
11330 pipe_ms_state_ci.minSampleShading = 1.0;
11331 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011332
Tony Barboureb254902015-07-15 12:50:33 -060011333 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011334 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11335 pipeline_layout_ci.pNext = NULL;
11336 pipeline_layout_ci.setLayoutCount = 1;
11337 pipeline_layout_ci.pSetLayouts = &ds_layout;
11338 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011339
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011340 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011341 ASSERT_VK_SUCCESS(err);
11342
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011343 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011344 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011345 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011346 VkPipelineObj pipe(m_device);
11347 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011348 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011349 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011350 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011351 pipe.SetViewport(m_viewports);
11352 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011353 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011354
Tony Barbour552f6c02016-12-21 14:34:07 -070011355 m_commandBuffer->BeginCommandBuffer();
11356 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011357 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011358 // Don't care about actual data, just need to get to draw to flag error
11359 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011360 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011361 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011362 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011363
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011364 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011365
Chia-I Wuf7458c52015-10-26 21:10:41 +080011366 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11367 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11368 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011369}
Mark Muellerdfe37552016-07-07 14:47:42 -060011370
Mark Mueller2ee294f2016-08-04 12:59:48 -060011371TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011372 TEST_DESCRIPTION(
11373 "Use an invalid count in a vkEnumeratePhysicalDevices call."
11374 "Use invalid Queue Family Index in vkCreateDevice");
Tony Barbour1fa09702017-03-16 12:09:08 -060011375 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011376
Mark Mueller880fce52016-08-17 15:23:23 -060011377 // The following test fails with recent NVidia drivers.
11378 // By the time core_validation is reached, the NVidia
11379 // driver has sanitized the invalid condition and core_validation
11380 // is not introduced to the failure condition. This is not the case
11381 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011382 // uint32_t count = static_cast<uint32_t>(~0);
11383 // VkPhysicalDevice physical_device;
11384 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
11385 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011386
Mark Mueller2ee294f2016-08-04 12:59:48 -060011387 float queue_priority = 0.0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011388 VkDeviceQueueCreateInfo queue_create_info = {};
11389 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11390 queue_create_info.queueCount = 1;
11391 queue_create_info.pQueuePriorities = &queue_priority;
11392 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
11393
11394 VkPhysicalDeviceFeatures features = m_device->phy().features();
11395 VkDevice testDevice;
11396 VkDeviceCreateInfo device_create_info = {};
11397 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11398 device_create_info.queueCreateInfoCount = 1;
11399 device_create_info.pQueueCreateInfos = &queue_create_info;
11400 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011401
11402 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11403 "Invalid queue create request in vkCreateDevice(). Invalid queueFamilyIndex ");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011404 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms that do
11405 // not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11406 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011407 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11408 m_errorMonitor->VerifyFound();
11409
11410 queue_create_info.queueFamilyIndex = 1;
11411
11412 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
11413 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
11414 for (unsigned i = 0; i < feature_count; i++) {
11415 if (VK_FALSE == feature_array[i]) {
11416 feature_array[i] = VK_TRUE;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011417 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011418 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11419 "While calling vkCreateDevice(), requesting feature #");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011420 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms
11421 // that do not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11422 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011423 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11424 "You requested features that are unavailable on this device. You should first "
11425 "query feature availability by calling vkGetPhysicalDeviceFeatures().");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011426 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11427 m_errorMonitor->VerifyFound();
11428 break;
11429 }
11430 }
11431}
11432
Tobin Ehlis16edf082016-11-21 12:33:49 -070011433TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
11434 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
11435
Tony Barbour1fa09702017-03-16 12:09:08 -060011436 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis16edf082016-11-21 12:33:49 -070011437
11438 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
11439 std::vector<VkDeviceQueueCreateInfo> queue_info;
11440 queue_info.reserve(queue_props.size());
11441 std::vector<std::vector<float>> queue_priorities;
11442 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
11443 VkDeviceQueueCreateInfo qi{};
11444 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11445 qi.queueFamilyIndex = i;
11446 qi.queueCount = queue_props[i].queueCount;
11447 queue_priorities.emplace_back(qi.queueCount, 0.0f);
11448 qi.pQueuePriorities = queue_priorities[i].data();
11449 queue_info.push_back(qi);
11450 }
11451
11452 std::vector<const char *> device_extension_names;
11453
11454 VkDevice local_device;
11455 VkDeviceCreateInfo device_create_info = {};
11456 auto features = m_device->phy().features();
11457 // Intentionally disable pipeline stats
11458 features.pipelineStatisticsQuery = VK_FALSE;
11459 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11460 device_create_info.pNext = NULL;
11461 device_create_info.queueCreateInfoCount = queue_info.size();
11462 device_create_info.pQueueCreateInfos = queue_info.data();
11463 device_create_info.enabledLayerCount = 0;
11464 device_create_info.ppEnabledLayerNames = NULL;
11465 device_create_info.pEnabledFeatures = &features;
11466 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
11467 ASSERT_VK_SUCCESS(err);
11468
11469 VkQueryPoolCreateInfo qpci{};
11470 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11471 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
11472 qpci.queryCount = 1;
11473 VkQueryPool query_pool;
11474
11475 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
11476 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
11477 m_errorMonitor->VerifyFound();
11478
11479 vkDestroyDevice(local_device, nullptr);
11480}
11481
Mark Mueller2ee294f2016-08-04 12:59:48 -060011482TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011483 TEST_DESCRIPTION(
11484 "Use an invalid queue index in a vkCmdWaitEvents call."
11485 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011486
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011487 const char *invalid_queue_index =
11488 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
11489 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
11490 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011491
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011492 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011493
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011494 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011495
Tony Barbour1fa09702017-03-16 12:09:08 -060011496 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011497
11498 VkEvent event;
11499 VkEventCreateInfo event_create_info{};
11500 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11501 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11502
Mark Mueller2ee294f2016-08-04 12:59:48 -060011503 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011504 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011505
Tony Barbour552f6c02016-12-21 14:34:07 -070011506 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011507
11508 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011509 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011510 ASSERT_TRUE(image.initialized());
11511 VkImageMemoryBarrier img_barrier = {};
11512 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11513 img_barrier.pNext = NULL;
11514 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
11515 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
11516 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11517 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11518 img_barrier.image = image.handle();
11519 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060011520
11521 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
11522 // that layer validation catches the case when it is not.
11523 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011524 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11525 img_barrier.subresourceRange.baseArrayLayer = 0;
11526 img_barrier.subresourceRange.baseMipLevel = 0;
11527 img_barrier.subresourceRange.layerCount = 1;
11528 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011529 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
11530 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011531 m_errorMonitor->VerifyFound();
11532
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011533 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011534
11535 VkQueryPool query_pool;
11536 VkQueryPoolCreateInfo query_pool_create_info = {};
11537 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11538 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
11539 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011540 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011541
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011542 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011543 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
11544
11545 vkEndCommandBuffer(m_commandBuffer->handle());
11546 m_errorMonitor->VerifyFound();
11547
11548 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
11549 vkDestroyEvent(m_device->device(), event, nullptr);
11550}
11551
Mark Muellerdfe37552016-07-07 14:47:42 -060011552TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011553 TEST_DESCRIPTION(
11554 "Submit a command buffer using deleted vertex buffer, "
11555 "delete a buffer twice, use an invalid offset for each "
11556 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060011557
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011558 const char *deleted_buffer_in_command_buffer =
11559 "Cannot submit cmd buffer "
11560 "using deleted buffer ";
11561 const char *invalid_offset_message =
11562 "vkBindBufferMemory(): "
11563 "memoryOffset is 0x";
11564 const char *invalid_storage_buffer_offset_message =
11565 "vkBindBufferMemory(): "
11566 "storage memoryOffset "
11567 "is 0x";
11568 const char *invalid_texel_buffer_offset_message =
11569 "vkBindBufferMemory(): "
11570 "texel memoryOffset "
11571 "is 0x";
11572 const char *invalid_uniform_buffer_offset_message =
11573 "vkBindBufferMemory(): "
11574 "uniform memoryOffset "
11575 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060011576
Tony Barbour1fa09702017-03-16 12:09:08 -060011577 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerdfe37552016-07-07 14:47:42 -060011578 ASSERT_NO_FATAL_FAILURE(InitViewport());
11579 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11580
11581 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011582 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060011583 pipe_ms_state_ci.pNext = NULL;
11584 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11585 pipe_ms_state_ci.sampleShadingEnable = 0;
11586 pipe_ms_state_ci.minSampleShading = 1.0;
11587 pipe_ms_state_ci.pSampleMask = nullptr;
11588
11589 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11590 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11591 VkPipelineLayout pipeline_layout;
11592
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011593 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060011594 ASSERT_VK_SUCCESS(err);
11595
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011596 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11597 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060011598 VkPipelineObj pipe(m_device);
11599 pipe.AddShader(&vs);
11600 pipe.AddShader(&fs);
11601 pipe.AddColorAttachment();
11602 pipe.SetMSAA(&pipe_ms_state_ci);
11603 pipe.SetViewport(m_viewports);
11604 pipe.SetScissor(m_scissors);
11605 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11606
Tony Barbour552f6c02016-12-21 14:34:07 -070011607 m_commandBuffer->BeginCommandBuffer();
11608 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011609 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060011610
11611 {
11612 // Create and bind a vertex buffer in a reduced scope, which will cause
11613 // it to be deleted upon leaving this scope
11614 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011615 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060011616 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11617 draw_verticies.AddVertexInputToPipe(pipe);
11618 }
11619
11620 Draw(1, 0, 0, 0);
11621
Tony Barbour552f6c02016-12-21 14:34:07 -070011622 m_commandBuffer->EndRenderPass();
11623 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060011624
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011625 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060011626 QueueCommandBuffer(false);
11627 m_errorMonitor->VerifyFound();
11628
11629 {
11630 // Create and bind a vertex buffer in a reduced scope, and delete it
11631 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011632 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011633 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060011634 buffer_test.TestDoubleDestroy();
11635 }
11636 m_errorMonitor->VerifyFound();
11637
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011638 m_errorMonitor->SetUnexpectedError("value of pCreateInfo->usage must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011639 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011640 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011641 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011642 m_errorMonitor->SetUnexpectedError(
11643 "If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, "
11644 "memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011645 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
11646 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011647 m_errorMonitor->VerifyFound();
11648 }
11649
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011650 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
11651 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011652 // Create and bind a memory buffer with an invalid offset again,
11653 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011654 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011655 m_errorMonitor->SetUnexpectedError(
11656 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11657 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011658 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11659 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011660 m_errorMonitor->VerifyFound();
11661 }
11662
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011663 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011664 // Create and bind a memory buffer with an invalid offset again, but
11665 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011666 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011667 m_errorMonitor->SetUnexpectedError(
11668 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11669 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011670 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11671 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011672 m_errorMonitor->VerifyFound();
11673 }
11674
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011675 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011676 // Create and bind a memory buffer with an invalid offset again, but
11677 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011678 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011679 m_errorMonitor->SetUnexpectedError(
11680 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11681 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011682 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11683 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011684 m_errorMonitor->VerifyFound();
11685 }
11686
11687 {
11688 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011689 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011690 m_errorMonitor->SetUnexpectedError("required parameter memory specified as VK_NULL_HANDLE");
11691 m_errorMonitor->SetUnexpectedError("memory must be a valid VkDeviceMemory handle");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011692 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
11693 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011694 m_errorMonitor->VerifyFound();
11695 }
11696
11697 {
11698 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011699 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011700 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
11701 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011702 }
11703 m_errorMonitor->VerifyFound();
11704
11705 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11706}
11707
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011708// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11709TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011710 TEST_DESCRIPTION(
11711 "Hit all possible validation checks associated with the "
11712 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11713 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011714 // 3 in ValidateCmdBufImageLayouts
11715 // * -1 Attempt to submit cmd buf w/ deleted image
11716 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11717 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011718
Tony Barbour1fa09702017-03-16 12:09:08 -060011719 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070011720 auto depth_format = find_depth_stencil_format(m_device);
11721 if (!depth_format) {
11722 printf(" No Depth + Stencil format found. Skipped.\n");
11723 return;
11724 }
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011725 // Create src & dst images to use for copy operations
11726 VkImage src_image;
11727 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080011728 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011729
11730 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11731 const int32_t tex_width = 32;
11732 const int32_t tex_height = 32;
11733
11734 VkImageCreateInfo image_create_info = {};
11735 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11736 image_create_info.pNext = NULL;
11737 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11738 image_create_info.format = tex_format;
11739 image_create_info.extent.width = tex_width;
11740 image_create_info.extent.height = tex_height;
11741 image_create_info.extent.depth = 1;
11742 image_create_info.mipLevels = 1;
11743 image_create_info.arrayLayers = 4;
11744 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11745 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11746 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080011747 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011748 image_create_info.flags = 0;
11749
11750 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11751 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011752 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011753 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11754 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011755 image_create_info.format = VK_FORMAT_D32_SFLOAT;
11756 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
11757 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
11758 ASSERT_VK_SUCCESS(err);
11759
11760 // Allocate memory
11761 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080011762 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080011763 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080011764 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11765 mem_alloc.pNext = NULL;
11766 mem_alloc.allocationSize = 0;
11767 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080011768
11769 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011770 mem_alloc.allocationSize = img_mem_reqs.size;
11771 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011772 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080011773 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080011774 ASSERT_VK_SUCCESS(err);
11775
11776 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011777 mem_alloc.allocationSize = img_mem_reqs.size;
11778 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011779 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011780 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080011781 ASSERT_VK_SUCCESS(err);
11782
11783 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011784 mem_alloc.allocationSize = img_mem_reqs.size;
11785 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011786 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011787 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080011788 ASSERT_VK_SUCCESS(err);
11789
11790 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
11791 ASSERT_VK_SUCCESS(err);
11792 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
11793 ASSERT_VK_SUCCESS(err);
11794 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
11795 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011796
Tony Barbour552f6c02016-12-21 14:34:07 -070011797 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080011798 VkImageCopy copy_region;
11799 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11800 copy_region.srcSubresource.mipLevel = 0;
11801 copy_region.srcSubresource.baseArrayLayer = 0;
11802 copy_region.srcSubresource.layerCount = 1;
11803 copy_region.srcOffset.x = 0;
11804 copy_region.srcOffset.y = 0;
11805 copy_region.srcOffset.z = 0;
11806 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11807 copy_region.dstSubresource.mipLevel = 0;
11808 copy_region.dstSubresource.baseArrayLayer = 0;
11809 copy_region.dstSubresource.layerCount = 1;
11810 copy_region.dstOffset.x = 0;
11811 copy_region.dstOffset.y = 0;
11812 copy_region.dstOffset.z = 0;
11813 copy_region.extent.width = 1;
11814 copy_region.extent.height = 1;
11815 copy_region.extent.depth = 1;
11816
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011817 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11818 "layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11819 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011820
Cort530cf382016-12-08 09:59:47 -080011821 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011822 m_errorMonitor->VerifyFound();
Tobin Ehlise35b66a2017-03-15 12:18:31 -060011823 // The first call hits the expected WARNING and skips the call down the chain, so call a second time to call down chain and
11824 // update layer state
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011825 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11826 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlise35b66a2017-03-15 12:18:31 -060011827 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011828 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011829 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011830 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that "
11831 "doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011832 m_errorMonitor->SetUnexpectedError(
11833 "srcImageLayout must be either of VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL");
Cort530cf382016-12-08 09:59:47 -080011834 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011835 m_errorMonitor->VerifyFound();
11836 // Final src error is due to bad layout type
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011837 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011838 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011839 "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011840 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011841 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011842 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_UNDEFINED, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011843 m_errorMonitor->VerifyFound();
11844 // Now verify same checks for dst
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011845 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11846 "layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
11847 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011848 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_GENERAL, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011849 m_errorMonitor->VerifyFound();
11850 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011851 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011852 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011853 "the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011854 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011855 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011856 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011857 m_errorMonitor->VerifyFound();
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011858 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011859 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL "
11860 "or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011861 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011862 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011863 m_commandBuffer->CopyImage(src_image, VK_IMAGE_LAYOUT_GENERAL, dst_image, VK_IMAGE_LAYOUT_UNDEFINED, 1, &copy_region);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011864 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011865
Cort3b021012016-12-07 12:00:57 -080011866 // Convert dst and depth images to TRANSFER_DST for subsequent tests
11867 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
11868 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11869 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
11870 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
11871 transfer_dst_image_barrier[0].srcAccessMask = 0;
11872 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
11873 transfer_dst_image_barrier[0].image = dst_image;
11874 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11875 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
11876 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11877 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11878 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11879 transfer_dst_image_barrier[0].image = depth_image;
11880 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
11881 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11882 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11883
11884 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080011885 VkClearColorValue color_clear_value = {};
11886 VkImageSubresourceRange clear_range;
11887 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11888 clear_range.baseMipLevel = 0;
11889 clear_range.baseArrayLayer = 0;
11890 clear_range.layerCount = 1;
11891 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011892
Cort3b021012016-12-07 12:00:57 -080011893 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
11894 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11895 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
11896 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011897 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011898 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011899 // Fail due to provided layout not matching actual current layout for color clear.
11900 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011901 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011902 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011903
Cort530cf382016-12-08 09:59:47 -080011904 VkClearDepthStencilValue depth_clear_value = {};
11905 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080011906
11907 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
11908 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
11910 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011911 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011912 m_errorMonitor->VerifyFound();
11913 // Fail due to provided layout not matching actual current layout for depth clear.
11914 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011915 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011916 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011917
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011918 // Now cause error due to bad image layout transition in PipelineBarrier
11919 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080011920 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011921 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080011922 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011923 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080011924 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11925 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011926 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011927 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011928 "you cannot transition the layout of aspect 1 from "
11929 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is "
11930 "VK_IMAGE_LAYOUT_GENERAL.");
Mike Weiblen62d08a32017-03-07 22:18:27 -070011931 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00305);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011932 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11933 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011934 m_errorMonitor->VerifyFound();
11935
11936 // Finally some layout errors at RenderPass create time
11937 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
11938 VkAttachmentReference attach = {};
11939 // perf warning for GENERAL layout w/ non-DS input attachment
11940 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11941 VkSubpassDescription subpass = {};
11942 subpass.inputAttachmentCount = 1;
11943 subpass.pInputAttachments = &attach;
11944 VkRenderPassCreateInfo rpci = {};
11945 rpci.subpassCount = 1;
11946 rpci.pSubpasses = &subpass;
11947 rpci.attachmentCount = 1;
11948 VkAttachmentDescription attach_desc = {};
11949 attach_desc.format = VK_FORMAT_UNDEFINED;
11950 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060011951 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011952 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011953 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11954 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011955 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11956 m_errorMonitor->VerifyFound();
11957 // error w/ non-general layout
11958 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11959
11960 m_errorMonitor->SetDesiredFailureMsg(
11961 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11962 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
11963 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11964 m_errorMonitor->VerifyFound();
11965 subpass.inputAttachmentCount = 0;
11966 subpass.colorAttachmentCount = 1;
11967 subpass.pColorAttachments = &attach;
11968 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11969 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11971 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011972 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11973 m_errorMonitor->VerifyFound();
11974 // error w/ non-color opt or GENERAL layout for color attachment
11975 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11976 m_errorMonitor->SetDesiredFailureMsg(
11977 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11978 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
11979 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11980 m_errorMonitor->VerifyFound();
11981 subpass.colorAttachmentCount = 0;
11982 subpass.pDepthStencilAttachment = &attach;
11983 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11984 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011985 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11986 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011987 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11988 m_errorMonitor->VerifyFound();
11989 // error w/ non-ds opt or GENERAL layout for color attachment
11990 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011991 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11992 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
11993 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011994 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11995 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060011996 // For this error we need a valid renderpass so create default one
11997 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11998 attach.attachment = 0;
Tony Barbourf887b162017-03-09 10:06:46 -070011999 attach_desc.format = depth_format;
Tobin Ehlis1efce022016-05-11 10:40:34 -060012000 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12001 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12002 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12003 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12004 // Can't do a CLEAR load on READ_ONLY initialLayout
12005 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12006 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12007 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012008 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012009 "with invalid first layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060012010 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12011 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012012
Cort3b021012016-12-07 12:00:57 -080012013 vkFreeMemory(m_device->device(), src_image_mem, NULL);
12014 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
12015 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012016 vkDestroyImage(m_device->device(), src_image, NULL);
12017 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080012018 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012019}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012020
Tobin Ehlise0936662016-10-11 08:10:51 -060012021TEST_F(VkLayerTest, InvalidStorageImageLayout) {
12022 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
12023 VkResult err;
12024
Tony Barbour1fa09702017-03-16 12:09:08 -060012025 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise0936662016-10-11 08:10:51 -060012026
12027 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
12028 VkImageTiling tiling;
12029 VkFormatProperties format_properties;
12030 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
12031 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12032 tiling = VK_IMAGE_TILING_LINEAR;
12033 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12034 tiling = VK_IMAGE_TILING_OPTIMAL;
12035 } else {
Dave Houlton584d51e2017-02-16 12:52:54 -070012036 printf(" Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060012037 return;
12038 }
12039
12040 VkDescriptorPoolSize ds_type = {};
12041 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12042 ds_type.descriptorCount = 1;
12043
12044 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12045 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12046 ds_pool_ci.maxSets = 1;
12047 ds_pool_ci.poolSizeCount = 1;
12048 ds_pool_ci.pPoolSizes = &ds_type;
12049 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12050
12051 VkDescriptorPool ds_pool;
12052 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12053 ASSERT_VK_SUCCESS(err);
12054
12055 VkDescriptorSetLayoutBinding dsl_binding = {};
12056 dsl_binding.binding = 0;
12057 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12058 dsl_binding.descriptorCount = 1;
12059 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12060 dsl_binding.pImmutableSamplers = NULL;
12061
12062 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12063 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12064 ds_layout_ci.pNext = NULL;
12065 ds_layout_ci.bindingCount = 1;
12066 ds_layout_ci.pBindings = &dsl_binding;
12067
12068 VkDescriptorSetLayout ds_layout;
12069 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12070 ASSERT_VK_SUCCESS(err);
12071
12072 VkDescriptorSetAllocateInfo alloc_info = {};
12073 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12074 alloc_info.descriptorSetCount = 1;
12075 alloc_info.descriptorPool = ds_pool;
12076 alloc_info.pSetLayouts = &ds_layout;
12077 VkDescriptorSet descriptor_set;
12078 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12079 ASSERT_VK_SUCCESS(err);
12080
12081 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12082 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12083 pipeline_layout_ci.pNext = NULL;
12084 pipeline_layout_ci.setLayoutCount = 1;
12085 pipeline_layout_ci.pSetLayouts = &ds_layout;
12086 VkPipelineLayout pipeline_layout;
12087 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12088 ASSERT_VK_SUCCESS(err);
12089
12090 VkImageObj image(m_device);
12091 image.init(32, 32, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
12092 ASSERT_TRUE(image.initialized());
12093 VkImageView view = image.targetView(tex_format);
12094
12095 VkDescriptorImageInfo image_info = {};
12096 image_info.imageView = view;
12097 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12098
12099 VkWriteDescriptorSet descriptor_write = {};
12100 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12101 descriptor_write.dstSet = descriptor_set;
12102 descriptor_write.dstBinding = 0;
12103 descriptor_write.descriptorCount = 1;
12104 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12105 descriptor_write.pImageInfo = &image_info;
12106
12107 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12108 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
12109 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
12110 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12111 m_errorMonitor->VerifyFound();
12112
12113 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12114 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12115 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
12116 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12117}
12118
Mark Mueller93b938f2016-08-18 10:27:40 -060012119TEST_F(VkLayerTest, SimultaneousUse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012120 TEST_DESCRIPTION(
12121 "Use vkCmdExecuteCommands with invalid state "
12122 "in primary and secondary command buffers.");
Mark Mueller93b938f2016-08-18 10:27:40 -060012123
Tony Barbour1fa09702017-03-16 12:09:08 -060012124 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller93b938f2016-08-18 10:27:40 -060012125 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12126
Mike Weiblen95dd0f92016-10-19 12:28:27 -060012127 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012128 const char *simultaneous_use_message2 =
12129 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
12130 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060012131
12132 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012133 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012134 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012135 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12136 command_buffer_allocate_info.commandBufferCount = 1;
12137
12138 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012139 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060012140 VkCommandBufferBeginInfo command_buffer_begin_info = {};
12141 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012142 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060012143 command_buffer_inheritance_info.renderPass = m_renderPass;
12144 command_buffer_inheritance_info.framebuffer = m_framebuffer;
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012145
Mark Mueller93b938f2016-08-18 10:27:40 -060012146 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012147 command_buffer_begin_info.flags =
12148 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060012149 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
12150
12151 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
12152 vkEndCommandBuffer(secondary_command_buffer);
12153
Mark Mueller93b938f2016-08-18 10:27:40 -060012154 VkSubmitInfo submit_info = {};
12155 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12156 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012157 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012158
Mark Mueller4042b652016-09-05 22:52:21 -060012159 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012160 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
12161 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
12162 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012163 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012164 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012165 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12166 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060012167
Dave Houltonfbf52152017-01-06 12:55:29 -070012168 m_errorMonitor->ExpectSuccess(0);
Mark Mueller93b938f2016-08-18 10:27:40 -060012169 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070012170 m_errorMonitor->VerifyNotFound();
Mark Mueller93b938f2016-08-18 10:27:40 -060012171
Mark Mueller4042b652016-09-05 22:52:21 -060012172 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012173 m_errorMonitor->SetUnexpectedError("commandBuffer must not currently be pending execution");
12174 m_errorMonitor->SetUnexpectedError(
12175 "If commandBuffer was allocated from a VkCommandPool which did not have the "
12176 "VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT flag set, commandBuffer must be in the initial state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012177 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012178 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060012179
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012180 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
12181 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012182 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012183 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12184 vkEndCommandBuffer(m_commandBuffer->handle());
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012185
12186 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012187
12188 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be pending execution");
Mark Mueller93b938f2016-08-18 10:27:40 -060012189}
12190
Tony Barbour626994c2017-02-08 15:29:37 -070012191TEST_F(VkLayerTest, SimultaneousUseOneShot) {
12192 TEST_DESCRIPTION(
12193 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
12194 "errors");
12195 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
12196 const char *one_shot_message = "VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted";
Tony Barbour1fa09702017-03-16 12:09:08 -060012197 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070012198
12199 VkCommandBuffer cmd_bufs[2];
12200 VkCommandBufferAllocateInfo alloc_info;
12201 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12202 alloc_info.pNext = NULL;
12203 alloc_info.commandBufferCount = 2;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012204 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070012205 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12206 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
12207
12208 VkCommandBufferBeginInfo cb_binfo;
12209 cb_binfo.pNext = NULL;
12210 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12211 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
12212 cb_binfo.flags = 0;
12213 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
12214 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12215 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
12216 vkEndCommandBuffer(cmd_bufs[0]);
12217 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
12218
12219 VkSubmitInfo submit_info = {};
12220 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12221 submit_info.commandBufferCount = 2;
12222 submit_info.pCommandBuffers = duplicates;
12223 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
12224 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12225 m_errorMonitor->VerifyFound();
12226 vkQueueWaitIdle(m_device->m_queue);
12227
12228 // Set one time use and now look for one time submit
12229 duplicates[0] = duplicates[1] = cmd_bufs[1];
12230 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
12231 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
12232 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
12233 vkEndCommandBuffer(cmd_bufs[1]);
12234 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
12235 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12236 m_errorMonitor->VerifyFound();
12237 vkQueueWaitIdle(m_device->m_queue);
12238}
12239
Tobin Ehlisb093da82017-01-19 12:05:27 -070012240TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012241 TEST_DESCRIPTION(
12242 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
12243 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070012244
Tony Barbour1fa09702017-03-16 12:09:08 -060012245 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb093da82017-01-19 12:05:27 -070012246 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12247
12248 std::vector<const char *> device_extension_names;
12249 auto features = m_device->phy().features();
12250 // Make sure gs & ts are disabled
12251 features.geometryShader = false;
12252 features.tessellationShader = false;
12253 // The sacrificial device object
12254 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
12255
12256 VkCommandPoolCreateInfo pool_create_info{};
12257 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
12258 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
12259
12260 VkCommandPool command_pool;
12261 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
12262
12263 VkCommandBufferAllocateInfo cmd = {};
12264 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12265 cmd.pNext = NULL;
12266 cmd.commandPool = command_pool;
12267 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12268 cmd.commandBufferCount = 1;
12269
12270 VkCommandBuffer cmd_buffer;
12271 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
12272 ASSERT_VK_SUCCESS(err);
12273
12274 VkEvent event;
12275 VkEventCreateInfo evci = {};
12276 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12277 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
12278 ASSERT_VK_SUCCESS(result);
12279
12280 VkCommandBufferBeginInfo cbbi = {};
12281 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12282 vkBeginCommandBuffer(cmd_buffer, &cbbi);
12283 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
12284 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
12285 m_errorMonitor->VerifyFound();
12286
12287 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
12288 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
12289 m_errorMonitor->VerifyFound();
12290
12291 vkDestroyEvent(test_device.handle(), event, NULL);
12292 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
12293}
12294
Mark Mueller917f6bc2016-08-30 10:57:19 -060012295TEST_F(VkLayerTest, InUseDestroyedSignaled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012296 TEST_DESCRIPTION(
12297 "Use vkCmdExecuteCommands with invalid state "
12298 "in primary and secondary command buffers. "
12299 "Delete objects that are inuse. Call VkQueueSubmit "
12300 "with an event that has been deleted.");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012301
Tony Barbour1fa09702017-03-16 12:09:08 -060012302 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller917f6bc2016-08-30 10:57:19 -060012303 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12304
Tony Barbour552f6c02016-12-21 14:34:07 -070012305 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012306
12307 VkEvent event;
12308 VkEventCreateInfo event_create_info = {};
12309 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12310 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012311 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012312
Tony Barbour552f6c02016-12-21 14:34:07 -070012313 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060012314 vkDestroyEvent(m_device->device(), event, nullptr);
12315
12316 VkSubmitInfo submit_info = {};
12317 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12318 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012319 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskife4be302017-02-14 13:08:15 -070012320 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound");
Mark Muellerc8d441e2016-08-23 17:36:00 -060012321 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12322 m_errorMonitor->VerifyFound();
12323
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012324 m_errorMonitor->ExpectSuccess(0); // disable all log message processing with flags==0
Mark Muellerc8d441e2016-08-23 17:36:00 -060012325 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
12326
12327 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12328
Mark Mueller917f6bc2016-08-30 10:57:19 -060012329 VkSemaphoreCreateInfo semaphore_create_info = {};
12330 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
12331 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012332 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012333 VkFenceCreateInfo fence_create_info = {};
12334 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
12335 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012336 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012337
12338 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012339 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012340 descriptor_pool_type_count.descriptorCount = 1;
12341
12342 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12343 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12344 descriptor_pool_create_info.maxSets = 1;
12345 descriptor_pool_create_info.poolSizeCount = 1;
12346 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012347 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012348
12349 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012350 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012351
12352 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012353 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012354 descriptorset_layout_binding.descriptorCount = 1;
12355 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
12356
12357 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012358 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012359 descriptorset_layout_create_info.bindingCount = 1;
12360 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12361
12362 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012363 ASSERT_VK_SUCCESS(
12364 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012365
12366 VkDescriptorSet descriptorset;
12367 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012368 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012369 descriptorset_allocate_info.descriptorSetCount = 1;
12370 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12371 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012372 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012373
Mark Mueller4042b652016-09-05 22:52:21 -060012374 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
12375
12376 VkDescriptorBufferInfo buffer_info = {};
12377 buffer_info.buffer = buffer_test.GetBuffer();
12378 buffer_info.offset = 0;
12379 buffer_info.range = 1024;
12380
12381 VkWriteDescriptorSet write_descriptor_set = {};
12382 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12383 write_descriptor_set.dstSet = descriptorset;
12384 write_descriptor_set.descriptorCount = 1;
12385 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12386 write_descriptor_set.pBufferInfo = &buffer_info;
12387
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012388 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060012389
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012390 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12391 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012392
12393 VkPipelineObj pipe(m_device);
12394 pipe.AddColorAttachment();
12395 pipe.AddShader(&vs);
12396 pipe.AddShader(&fs);
12397
12398 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012399 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012400 pipeline_layout_create_info.setLayoutCount = 1;
12401 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12402
12403 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012404 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012405
12406 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
12407
Tony Barbour552f6c02016-12-21 14:34:07 -070012408 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012409 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060012410
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012411 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12412 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12413 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012414
Tony Barbour552f6c02016-12-21 14:34:07 -070012415 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012416
Mark Mueller917f6bc2016-08-30 10:57:19 -060012417 submit_info.signalSemaphoreCount = 1;
12418 submit_info.pSignalSemaphores = &semaphore;
12419 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012420 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060012421
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012422 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012423 vkDestroyEvent(m_device->device(), event, nullptr);
12424 m_errorMonitor->VerifyFound();
12425
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012426 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012427 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
12428 m_errorMonitor->VerifyFound();
12429
Jeremy Hayes08369882017-02-02 10:31:06 -070012430 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012431 vkDestroyFence(m_device->device(), fence, nullptr);
12432 m_errorMonitor->VerifyFound();
12433
Tobin Ehlis122207b2016-09-01 08:50:06 -070012434 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012435 m_errorMonitor->SetUnexpectedError("If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle");
12436 m_errorMonitor->SetUnexpectedError("Unable to remove Semaphore obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012437 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012438 m_errorMonitor->SetUnexpectedError("If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle");
12439 m_errorMonitor->SetUnexpectedError("Unable to remove Fence obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012440 vkDestroyFence(m_device->device(), fence, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012441 m_errorMonitor->SetUnexpectedError("If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle");
12442 m_errorMonitor->SetUnexpectedError("Unable to remove Event obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012443 vkDestroyEvent(m_device->device(), event, nullptr);
12444 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012445 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012446 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12447}
12448
Tobin Ehlis2adda372016-09-01 08:51:06 -070012449TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
12450 TEST_DESCRIPTION("Delete in-use query pool.");
12451
Tony Barbour1fa09702017-03-16 12:09:08 -060012452 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis2adda372016-09-01 08:51:06 -070012453 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12454
12455 VkQueryPool query_pool;
12456 VkQueryPoolCreateInfo query_pool_ci{};
12457 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12458 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
12459 query_pool_ci.queryCount = 1;
12460 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070012461 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012462 // Reset query pool to create binding with cmd buffer
12463 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
12464
Tony Barbour552f6c02016-12-21 14:34:07 -070012465 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012466
12467 VkSubmitInfo submit_info = {};
12468 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12469 submit_info.commandBufferCount = 1;
12470 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12471 // Submit cmd buffer and then destroy query pool while in-flight
12472 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12473
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012474 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070012475 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12476 m_errorMonitor->VerifyFound();
12477
12478 vkQueueWaitIdle(m_device->m_queue);
12479 // Now that cmd buffer done we can safely destroy query_pool
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012480 m_errorMonitor->SetUnexpectedError("If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle");
12481 m_errorMonitor->SetUnexpectedError("Unable to remove Query Pool obj");
Tobin Ehlis2adda372016-09-01 08:51:06 -070012482 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12483}
12484
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012485TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
12486 TEST_DESCRIPTION("Delete in-use pipeline.");
12487
Tony Barbour1fa09702017-03-16 12:09:08 -060012488 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012489 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12490
12491 // Empty pipeline layout used for binding PSO
12492 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12493 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12494 pipeline_layout_ci.setLayoutCount = 0;
12495 pipeline_layout_ci.pSetLayouts = NULL;
12496
12497 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012498 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012499 ASSERT_VK_SUCCESS(err);
12500
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012501 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012502 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012503 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12504 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012505 // Store pipeline handle so we can actually delete it before test finishes
12506 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012507 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012508 VkPipelineObj pipe(m_device);
12509 pipe.AddShader(&vs);
12510 pipe.AddShader(&fs);
12511 pipe.AddColorAttachment();
12512 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12513 delete_this_pipeline = pipe.handle();
12514
Tony Barbour552f6c02016-12-21 14:34:07 -070012515 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012516 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012517 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012518
Tony Barbour552f6c02016-12-21 14:34:07 -070012519 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012520
12521 VkSubmitInfo submit_info = {};
12522 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12523 submit_info.commandBufferCount = 1;
12524 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12525 // Submit cmd buffer and then pipeline destroyed while in-flight
12526 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012527 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012528 m_errorMonitor->VerifyFound();
12529 // Make sure queue finished and then actually delete pipeline
12530 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012531 m_errorMonitor->SetUnexpectedError("If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle");
12532 m_errorMonitor->SetUnexpectedError("Unable to remove Pipeline obj");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012533 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
12534 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
12535}
12536
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012537TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
12538 TEST_DESCRIPTION("Delete in-use imageView.");
12539
Tony Barbour1fa09702017-03-16 12:09:08 -060012540 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012541 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12542
12543 VkDescriptorPoolSize ds_type_count;
12544 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12545 ds_type_count.descriptorCount = 1;
12546
12547 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12548 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12549 ds_pool_ci.maxSets = 1;
12550 ds_pool_ci.poolSizeCount = 1;
12551 ds_pool_ci.pPoolSizes = &ds_type_count;
12552
12553 VkDescriptorPool ds_pool;
12554 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12555 ASSERT_VK_SUCCESS(err);
12556
12557 VkSamplerCreateInfo sampler_ci = {};
12558 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12559 sampler_ci.pNext = NULL;
12560 sampler_ci.magFilter = VK_FILTER_NEAREST;
12561 sampler_ci.minFilter = VK_FILTER_NEAREST;
12562 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12563 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12564 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12565 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12566 sampler_ci.mipLodBias = 1.0;
12567 sampler_ci.anisotropyEnable = VK_FALSE;
12568 sampler_ci.maxAnisotropy = 1;
12569 sampler_ci.compareEnable = VK_FALSE;
12570 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12571 sampler_ci.minLod = 1.0;
12572 sampler_ci.maxLod = 1.0;
12573 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12574 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12575 VkSampler sampler;
12576
12577 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12578 ASSERT_VK_SUCCESS(err);
12579
12580 VkDescriptorSetLayoutBinding layout_binding;
12581 layout_binding.binding = 0;
12582 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12583 layout_binding.descriptorCount = 1;
12584 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12585 layout_binding.pImmutableSamplers = NULL;
12586
12587 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12588 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12589 ds_layout_ci.bindingCount = 1;
12590 ds_layout_ci.pBindings = &layout_binding;
12591 VkDescriptorSetLayout ds_layout;
12592 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12593 ASSERT_VK_SUCCESS(err);
12594
12595 VkDescriptorSetAllocateInfo alloc_info = {};
12596 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12597 alloc_info.descriptorSetCount = 1;
12598 alloc_info.descriptorPool = ds_pool;
12599 alloc_info.pSetLayouts = &ds_layout;
12600 VkDescriptorSet descriptor_set;
12601 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12602 ASSERT_VK_SUCCESS(err);
12603
12604 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12605 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12606 pipeline_layout_ci.pNext = NULL;
12607 pipeline_layout_ci.setLayoutCount = 1;
12608 pipeline_layout_ci.pSetLayouts = &ds_layout;
12609
12610 VkPipelineLayout pipeline_layout;
12611 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12612 ASSERT_VK_SUCCESS(err);
12613
12614 VkImageObj image(m_device);
12615 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
12616 ASSERT_TRUE(image.initialized());
12617
12618 VkImageView view;
12619 VkImageViewCreateInfo ivci = {};
12620 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12621 ivci.image = image.handle();
12622 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12623 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12624 ivci.subresourceRange.layerCount = 1;
12625 ivci.subresourceRange.baseMipLevel = 0;
12626 ivci.subresourceRange.levelCount = 1;
12627 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12628
12629 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12630 ASSERT_VK_SUCCESS(err);
12631
12632 VkDescriptorImageInfo image_info{};
12633 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12634 image_info.imageView = view;
12635 image_info.sampler = sampler;
12636
12637 VkWriteDescriptorSet descriptor_write = {};
12638 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12639 descriptor_write.dstSet = descriptor_set;
12640 descriptor_write.dstBinding = 0;
12641 descriptor_write.descriptorCount = 1;
12642 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12643 descriptor_write.pImageInfo = &image_info;
12644
12645 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12646
12647 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012648 char const *vsSource =
12649 "#version 450\n"
12650 "\n"
12651 "out gl_PerVertex { \n"
12652 " vec4 gl_Position;\n"
12653 "};\n"
12654 "void main(){\n"
12655 " gl_Position = vec4(1);\n"
12656 "}\n";
12657 char const *fsSource =
12658 "#version 450\n"
12659 "\n"
12660 "layout(set=0, binding=0) uniform sampler2D s;\n"
12661 "layout(location=0) out vec4 x;\n"
12662 "void main(){\n"
12663 " x = texture(s, vec2(1));\n"
12664 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012665 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12666 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12667 VkPipelineObj pipe(m_device);
12668 pipe.AddShader(&vs);
12669 pipe.AddShader(&fs);
12670 pipe.AddColorAttachment();
12671 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12672
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012673 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012674
Tony Barbour552f6c02016-12-21 14:34:07 -070012675 m_commandBuffer->BeginCommandBuffer();
12676 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012677 // Bind pipeline to cmd buffer
12678 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12679 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12680 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070012681
12682 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12683 VkRect2D scissor = {{0, 0}, {16, 16}};
12684 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12685 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12686
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012687 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012688 m_commandBuffer->EndRenderPass();
12689 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012690 // Submit cmd buffer then destroy sampler
12691 VkSubmitInfo submit_info = {};
12692 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12693 submit_info.commandBufferCount = 1;
12694 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12695 // Submit cmd buffer and then destroy imageView while in-flight
12696 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12697
12698 vkDestroyImageView(m_device->device(), view, nullptr);
12699 m_errorMonitor->VerifyFound();
12700 vkQueueWaitIdle(m_device->m_queue);
12701 // Now we can actually destroy imageView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012702 m_errorMonitor->SetUnexpectedError("If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle");
12703 m_errorMonitor->SetUnexpectedError("Unable to remove Image View obj");
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012704 vkDestroyImageView(m_device->device(), view, NULL);
12705 vkDestroySampler(m_device->device(), sampler, nullptr);
12706 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12707 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12708 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12709}
12710
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012711TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
12712 TEST_DESCRIPTION("Delete in-use bufferView.");
12713
Tony Barbour1fa09702017-03-16 12:09:08 -060012714 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012715 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12716
12717 VkDescriptorPoolSize ds_type_count;
12718 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12719 ds_type_count.descriptorCount = 1;
12720
12721 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12722 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12723 ds_pool_ci.maxSets = 1;
12724 ds_pool_ci.poolSizeCount = 1;
12725 ds_pool_ci.pPoolSizes = &ds_type_count;
12726
12727 VkDescriptorPool ds_pool;
12728 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12729 ASSERT_VK_SUCCESS(err);
12730
12731 VkDescriptorSetLayoutBinding layout_binding;
12732 layout_binding.binding = 0;
12733 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12734 layout_binding.descriptorCount = 1;
12735 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12736 layout_binding.pImmutableSamplers = NULL;
12737
12738 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12739 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12740 ds_layout_ci.bindingCount = 1;
12741 ds_layout_ci.pBindings = &layout_binding;
12742 VkDescriptorSetLayout ds_layout;
12743 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12744 ASSERT_VK_SUCCESS(err);
12745
12746 VkDescriptorSetAllocateInfo alloc_info = {};
12747 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12748 alloc_info.descriptorSetCount = 1;
12749 alloc_info.descriptorPool = ds_pool;
12750 alloc_info.pSetLayouts = &ds_layout;
12751 VkDescriptorSet descriptor_set;
12752 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12753 ASSERT_VK_SUCCESS(err);
12754
12755 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12756 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12757 pipeline_layout_ci.pNext = NULL;
12758 pipeline_layout_ci.setLayoutCount = 1;
12759 pipeline_layout_ci.pSetLayouts = &ds_layout;
12760
12761 VkPipelineLayout pipeline_layout;
12762 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12763 ASSERT_VK_SUCCESS(err);
12764
12765 VkBuffer buffer;
12766 uint32_t queue_family_index = 0;
12767 VkBufferCreateInfo buffer_create_info = {};
12768 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
12769 buffer_create_info.size = 1024;
12770 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
12771 buffer_create_info.queueFamilyIndexCount = 1;
12772 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
12773
12774 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
12775 ASSERT_VK_SUCCESS(err);
12776
12777 VkMemoryRequirements memory_reqs;
12778 VkDeviceMemory buffer_memory;
12779
12780 VkMemoryAllocateInfo memory_info = {};
12781 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
12782 memory_info.allocationSize = 0;
12783 memory_info.memoryTypeIndex = 0;
12784
12785 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
12786 memory_info.allocationSize = memory_reqs.size;
12787 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
12788 ASSERT_TRUE(pass);
12789
12790 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
12791 ASSERT_VK_SUCCESS(err);
12792 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
12793 ASSERT_VK_SUCCESS(err);
12794
12795 VkBufferView view;
12796 VkBufferViewCreateInfo bvci = {};
12797 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
12798 bvci.buffer = buffer;
12799 bvci.format = VK_FORMAT_R8_UNORM;
12800 bvci.range = VK_WHOLE_SIZE;
12801
12802 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
12803 ASSERT_VK_SUCCESS(err);
12804
12805 VkWriteDescriptorSet descriptor_write = {};
12806 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12807 descriptor_write.dstSet = descriptor_set;
12808 descriptor_write.dstBinding = 0;
12809 descriptor_write.descriptorCount = 1;
12810 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12811 descriptor_write.pTexelBufferView = &view;
12812
12813 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12814
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012815 char const *vsSource =
12816 "#version 450\n"
12817 "\n"
12818 "out gl_PerVertex { \n"
12819 " vec4 gl_Position;\n"
12820 "};\n"
12821 "void main(){\n"
12822 " gl_Position = vec4(1);\n"
12823 "}\n";
12824 char const *fsSource =
12825 "#version 450\n"
12826 "\n"
12827 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
12828 "layout(location=0) out vec4 x;\n"
12829 "void main(){\n"
12830 " x = imageLoad(s, 0);\n"
12831 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012832 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12833 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12834 VkPipelineObj pipe(m_device);
12835 pipe.AddShader(&vs);
12836 pipe.AddShader(&fs);
12837 pipe.AddColorAttachment();
12838 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12839
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012840 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012841
Tony Barbour552f6c02016-12-21 14:34:07 -070012842 m_commandBuffer->BeginCommandBuffer();
12843 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012844 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12845 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12846 VkRect2D scissor = {{0, 0}, {16, 16}};
12847 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12848 // Bind pipeline to cmd buffer
12849 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12850 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12851 &descriptor_set, 0, nullptr);
12852 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012853 m_commandBuffer->EndRenderPass();
12854 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012855
12856 VkSubmitInfo submit_info = {};
12857 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12858 submit_info.commandBufferCount = 1;
12859 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12860 // Submit cmd buffer and then destroy bufferView while in-flight
12861 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12862
12863 vkDestroyBufferView(m_device->device(), view, nullptr);
12864 m_errorMonitor->VerifyFound();
12865 vkQueueWaitIdle(m_device->m_queue);
12866 // Now we can actually destroy bufferView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012867 m_errorMonitor->SetUnexpectedError("If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle");
12868 m_errorMonitor->SetUnexpectedError("Unable to remove Buffer View obj");
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012869 vkDestroyBufferView(m_device->device(), view, NULL);
12870 vkDestroyBuffer(m_device->device(), buffer, NULL);
12871 vkFreeMemory(m_device->device(), buffer_memory, NULL);
12872 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12873 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12874 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12875}
12876
Tobin Ehlis209532e2016-09-07 13:52:18 -060012877TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
12878 TEST_DESCRIPTION("Delete in-use sampler.");
12879
Tony Barbour1fa09702017-03-16 12:09:08 -060012880 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis209532e2016-09-07 13:52:18 -060012881 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12882
12883 VkDescriptorPoolSize ds_type_count;
12884 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12885 ds_type_count.descriptorCount = 1;
12886
12887 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12888 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12889 ds_pool_ci.maxSets = 1;
12890 ds_pool_ci.poolSizeCount = 1;
12891 ds_pool_ci.pPoolSizes = &ds_type_count;
12892
12893 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012894 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012895 ASSERT_VK_SUCCESS(err);
12896
12897 VkSamplerCreateInfo sampler_ci = {};
12898 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12899 sampler_ci.pNext = NULL;
12900 sampler_ci.magFilter = VK_FILTER_NEAREST;
12901 sampler_ci.minFilter = VK_FILTER_NEAREST;
12902 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12903 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12904 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12905 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12906 sampler_ci.mipLodBias = 1.0;
12907 sampler_ci.anisotropyEnable = VK_FALSE;
12908 sampler_ci.maxAnisotropy = 1;
12909 sampler_ci.compareEnable = VK_FALSE;
12910 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12911 sampler_ci.minLod = 1.0;
12912 sampler_ci.maxLod = 1.0;
12913 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12914 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12915 VkSampler sampler;
12916
12917 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12918 ASSERT_VK_SUCCESS(err);
12919
12920 VkDescriptorSetLayoutBinding layout_binding;
12921 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060012922 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060012923 layout_binding.descriptorCount = 1;
12924 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12925 layout_binding.pImmutableSamplers = NULL;
12926
12927 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12928 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12929 ds_layout_ci.bindingCount = 1;
12930 ds_layout_ci.pBindings = &layout_binding;
12931 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012932 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012933 ASSERT_VK_SUCCESS(err);
12934
12935 VkDescriptorSetAllocateInfo alloc_info = {};
12936 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12937 alloc_info.descriptorSetCount = 1;
12938 alloc_info.descriptorPool = ds_pool;
12939 alloc_info.pSetLayouts = &ds_layout;
12940 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012941 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012942 ASSERT_VK_SUCCESS(err);
12943
12944 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12945 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12946 pipeline_layout_ci.pNext = NULL;
12947 pipeline_layout_ci.setLayoutCount = 1;
12948 pipeline_layout_ci.pSetLayouts = &ds_layout;
12949
12950 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012951 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012952 ASSERT_VK_SUCCESS(err);
12953
12954 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012955 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012956 ASSERT_TRUE(image.initialized());
12957
12958 VkImageView view;
12959 VkImageViewCreateInfo ivci = {};
12960 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12961 ivci.image = image.handle();
12962 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12963 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12964 ivci.subresourceRange.layerCount = 1;
12965 ivci.subresourceRange.baseMipLevel = 0;
12966 ivci.subresourceRange.levelCount = 1;
12967 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12968
12969 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12970 ASSERT_VK_SUCCESS(err);
12971
12972 VkDescriptorImageInfo image_info{};
12973 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12974 image_info.imageView = view;
12975 image_info.sampler = sampler;
12976
12977 VkWriteDescriptorSet descriptor_write = {};
12978 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12979 descriptor_write.dstSet = descriptor_set;
12980 descriptor_write.dstBinding = 0;
12981 descriptor_write.descriptorCount = 1;
12982 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12983 descriptor_write.pImageInfo = &image_info;
12984
12985 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12986
12987 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012988 char const *vsSource =
12989 "#version 450\n"
12990 "\n"
12991 "out gl_PerVertex { \n"
12992 " vec4 gl_Position;\n"
12993 "};\n"
12994 "void main(){\n"
12995 " gl_Position = vec4(1);\n"
12996 "}\n";
12997 char const *fsSource =
12998 "#version 450\n"
12999 "\n"
13000 "layout(set=0, binding=0) uniform sampler2D s;\n"
13001 "layout(location=0) out vec4 x;\n"
13002 "void main(){\n"
13003 " x = texture(s, vec2(1));\n"
13004 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060013005 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13006 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13007 VkPipelineObj pipe(m_device);
13008 pipe.AddShader(&vs);
13009 pipe.AddShader(&fs);
13010 pipe.AddColorAttachment();
13011 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13012
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013013 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013014
Tony Barbour552f6c02016-12-21 14:34:07 -070013015 m_commandBuffer->BeginCommandBuffer();
13016 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013017 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013018 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13019 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13020 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070013021
13022 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13023 VkRect2D scissor = {{0, 0}, {16, 16}};
13024 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13025 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13026
Tobin Ehlis209532e2016-09-07 13:52:18 -060013027 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013028 m_commandBuffer->EndRenderPass();
13029 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060013030 // Submit cmd buffer then destroy sampler
13031 VkSubmitInfo submit_info = {};
13032 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13033 submit_info.commandBufferCount = 1;
13034 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13035 // Submit cmd buffer and then destroy sampler while in-flight
13036 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13037
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013038 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060013039 m_errorMonitor->VerifyFound();
13040 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070013041
Tobin Ehlis209532e2016-09-07 13:52:18 -060013042 // Now we can actually destroy sampler
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013043 m_errorMonitor->SetUnexpectedError("If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle");
13044 m_errorMonitor->SetUnexpectedError("Unable to remove Sampler obj");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013045 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060013046 vkDestroyImageView(m_device->device(), view, NULL);
13047 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13048 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13049 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13050}
13051
Mark Mueller1cd9f412016-08-25 13:23:52 -060013052TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013053 TEST_DESCRIPTION(
13054 "Call VkQueueSubmit with a semaphore that is already "
13055 "signaled but not waited on by the queue. Wait on a "
13056 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060013057
Tony Barbour1fa09702017-03-16 12:09:08 -060013058 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller96a56d52016-08-24 10:28:05 -060013059 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13060
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013061 const char *queue_forward_progress_message = " that has already been signaled but not waited on by queue 0x";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013062 const char *invalid_fence_wait_message =
13063 " which has not been submitted on a Queue or during "
13064 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060013065
Tony Barbour552f6c02016-12-21 14:34:07 -070013066 m_commandBuffer->BeginCommandBuffer();
13067 m_commandBuffer->EndCommandBuffer();
Mark Mueller96a56d52016-08-24 10:28:05 -060013068
13069 VkSemaphoreCreateInfo semaphore_create_info = {};
13070 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13071 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013072 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060013073 VkSubmitInfo submit_info = {};
13074 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13075 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013076 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060013077 submit_info.signalSemaphoreCount = 1;
13078 submit_info.pSignalSemaphores = &semaphore;
13079 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070013080 m_errorMonitor->ExpectSuccess(0);
Mark Mueller96a56d52016-08-24 10:28:05 -060013081 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Dave Houltonfbf52152017-01-06 12:55:29 -070013082 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070013083 m_commandBuffer->BeginCommandBuffer();
13084 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013085 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060013086 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13087 m_errorMonitor->VerifyFound();
13088
Mark Mueller1cd9f412016-08-25 13:23:52 -060013089 VkFenceCreateInfo fence_create_info = {};
13090 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13091 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013092 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060013093
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013094 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060013095 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
13096 m_errorMonitor->VerifyFound();
13097
Mark Mueller4042b652016-09-05 22:52:21 -060013098 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060013099 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060013100 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13101}
13102
Tobin Ehlis4af23302016-07-19 10:50:30 -060013103TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013104 TEST_DESCRIPTION(
13105 "Bind a secondary command buffer with with a framebuffer "
13106 "that does not match the framebuffer for the active "
13107 "renderpass.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013108 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4af23302016-07-19 10:50:30 -060013109 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13110
13111 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013112 VkAttachmentDescription attachment = {0,
13113 VK_FORMAT_B8G8R8A8_UNORM,
13114 VK_SAMPLE_COUNT_1_BIT,
13115 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13116 VK_ATTACHMENT_STORE_OP_STORE,
13117 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13118 VK_ATTACHMENT_STORE_OP_DONT_CARE,
13119 VK_IMAGE_LAYOUT_UNDEFINED,
13120 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013121
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013122 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013123
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013124 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013125
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013126 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013127
13128 VkRenderPass rp;
13129 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13130 ASSERT_VK_SUCCESS(err);
13131
13132 // A compatible framebuffer.
13133 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013134 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013135 ASSERT_TRUE(image.initialized());
13136
13137 VkImageViewCreateInfo ivci = {
13138 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
13139 nullptr,
13140 0,
13141 image.handle(),
13142 VK_IMAGE_VIEW_TYPE_2D,
13143 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013144 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
13145 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060013146 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
13147 };
13148 VkImageView view;
13149 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
13150 ASSERT_VK_SUCCESS(err);
13151
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013152 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013153 VkFramebuffer fb;
13154 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
13155 ASSERT_VK_SUCCESS(err);
13156
13157 VkCommandBufferAllocateInfo cbai = {};
13158 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070013159 cbai.commandPool = m_commandPool->handle();
Tobin Ehlis4af23302016-07-19 10:50:30 -060013160 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
13161 cbai.commandBufferCount = 1;
13162
13163 VkCommandBuffer sec_cb;
13164 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
13165 ASSERT_VK_SUCCESS(err);
13166 VkCommandBufferBeginInfo cbbi = {};
13167 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130013168 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013169 cbii.renderPass = renderPass();
13170 cbii.framebuffer = fb;
13171 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13172 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013173 cbbi.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013174 cbbi.pInheritanceInfo = &cbii;
13175 vkBeginCommandBuffer(sec_cb, &cbbi);
13176 vkEndCommandBuffer(sec_cb);
13177
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013178 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120013179 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
13180 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013181
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013182 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013183 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060013184 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
13185 m_errorMonitor->VerifyFound();
13186 // Cleanup
13187 vkDestroyImageView(m_device->device(), view, NULL);
13188 vkDestroyRenderPass(m_device->device(), rp, NULL);
13189 vkDestroyFramebuffer(m_device->device(), fb, NULL);
13190}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013191
13192TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013193 TEST_DESCRIPTION(
13194 "If logicOp is available on the device, set it to an "
13195 "invalid value. If logicOp is not available, attempt to "
13196 "use it and verify that we see the correct error.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013197 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013198 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13199
13200 auto features = m_device->phy().features();
13201 // Set the expected error depending on whether or not logicOp available
13202 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013203 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13204 "If logic operations feature not "
13205 "enabled, logicOpEnable must be "
13206 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013207 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130013208 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013209 }
13210 // Create a pipeline using logicOp
13211 VkResult err;
13212
13213 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13214 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13215
13216 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013217 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013218 ASSERT_VK_SUCCESS(err);
13219
13220 VkPipelineViewportStateCreateInfo vp_state_ci = {};
13221 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13222 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013223 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013224 vp_state_ci.pViewports = &vp;
13225 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013226 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013227 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013228
13229 VkPipelineShaderStageCreateInfo shaderStages[2];
13230 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
13231
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013232 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13233 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013234 shaderStages[0] = vs.GetStageCreateInfo();
13235 shaderStages[1] = fs.GetStageCreateInfo();
13236
13237 VkPipelineVertexInputStateCreateInfo vi_ci = {};
13238 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13239
13240 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
13241 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13242 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13243
13244 VkPipelineRasterizationStateCreateInfo rs_ci = {};
13245 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130013246 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013247
13248 VkPipelineColorBlendAttachmentState att = {};
13249 att.blendEnable = VK_FALSE;
13250 att.colorWriteMask = 0xf;
13251
13252 VkPipelineColorBlendStateCreateInfo cb_ci = {};
13253 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13254 // Enable logicOp & set logicOp to value 1 beyond allowed entries
13255 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013256 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013257 cb_ci.attachmentCount = 1;
13258 cb_ci.pAttachments = &att;
13259
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013260 VkPipelineMultisampleStateCreateInfo ms_ci = {};
13261 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
13262 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
13263
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013264 VkGraphicsPipelineCreateInfo gp_ci = {};
13265 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13266 gp_ci.stageCount = 2;
13267 gp_ci.pStages = shaderStages;
13268 gp_ci.pVertexInputState = &vi_ci;
13269 gp_ci.pInputAssemblyState = &ia_ci;
13270 gp_ci.pViewportState = &vp_state_ci;
13271 gp_ci.pRasterizationState = &rs_ci;
13272 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013273 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013274 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13275 gp_ci.layout = pipeline_layout;
13276 gp_ci.renderPass = renderPass();
13277
13278 VkPipelineCacheCreateInfo pc_ci = {};
13279 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13280
13281 VkPipeline pipeline;
13282 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013283 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013284 ASSERT_VK_SUCCESS(err);
13285
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013286 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013287 m_errorMonitor->VerifyFound();
13288 if (VK_SUCCESS == err) {
13289 vkDestroyPipeline(m_device->device(), pipeline, NULL);
13290 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013291 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
13292 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13293}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013294
Mike Stroyanaccf7692015-05-12 16:00:45 -060013295#if GTEST_IS_THREADSAFE
13296struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013297 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013298 VkEvent event;
13299 bool bailout;
13300};
13301
Karl Schultz6addd812016-02-02 17:17:23 -070013302extern "C" void *AddToCommandBuffer(void *arg) {
13303 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013304
Mike Stroyana6d14942016-07-13 15:10:05 -060013305 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013306 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013307 if (data->bailout) {
13308 break;
13309 }
13310 }
13311 return NULL;
13312}
13313
Karl Schultz6addd812016-02-02 17:17:23 -070013314TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013315 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013316
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013317 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013318
Tony Barbour1fa09702017-03-16 12:09:08 -060013319 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanaccf7692015-05-12 16:00:45 -060013320 ASSERT_NO_FATAL_FAILURE(InitViewport());
13321 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13322
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013323 // Calls AllocateCommandBuffers
13324 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013325
13326 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013327 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013328
13329 VkEventCreateInfo event_info;
13330 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013331 VkResult err;
13332
13333 memset(&event_info, 0, sizeof(event_info));
13334 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13335
Chia-I Wuf7458c52015-10-26 21:10:41 +080013336 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013337 ASSERT_VK_SUCCESS(err);
13338
Mike Stroyanaccf7692015-05-12 16:00:45 -060013339 err = vkResetEvent(device(), event);
13340 ASSERT_VK_SUCCESS(err);
13341
13342 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013343 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013344 data.event = event;
13345 data.bailout = false;
13346 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060013347
13348 // First do some correct operations using multiple threads.
13349 // Add many entries to command buffer from another thread.
13350 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
13351 // Make non-conflicting calls from this thread at the same time.
13352 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060013353 uint32_t count;
13354 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060013355 }
13356 test_platform_thread_join(thread, NULL);
13357
13358 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060013359 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013360 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013361 // Add many entries to command buffer from this thread at the same time.
13362 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013363
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013364 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013365 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013366
Mike Stroyan10b8cb72016-01-22 15:22:03 -070013367 m_errorMonitor->SetBailout(NULL);
13368
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013369 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013370
Chia-I Wuf7458c52015-10-26 21:10:41 +080013371 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013372}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013373#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013374
Karl Schultz6addd812016-02-02 17:17:23 -070013375TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013376 TEST_DESCRIPTION(
13377 "Test that an error is produced for a spirv module "
13378 "with an impossible code size");
Chris Forbes1cc79542016-07-20 11:13:44 +120013379
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013380 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013381
Tony Barbour1fa09702017-03-16 12:09:08 -060013382 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013383 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13384
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013385 VkShaderModule module;
13386 VkShaderModuleCreateInfo moduleCreateInfo;
13387 struct icd_spv_header spv;
13388
13389 spv.magic = ICD_SPV_MAGIC;
13390 spv.version = ICD_SPV_VERSION;
13391 spv.gen_magic = 0;
13392
13393 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13394 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013395 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013396 moduleCreateInfo.codeSize = 4;
13397 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013398 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013399
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013400 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013401}
13402
Karl Schultz6addd812016-02-02 17:17:23 -070013403TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013404 TEST_DESCRIPTION(
13405 "Test that an error is produced for a spirv module "
13406 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120013407
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013408 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013409
Tony Barbour1fa09702017-03-16 12:09:08 -060013410 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013411 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13412
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013413 VkShaderModule module;
13414 VkShaderModuleCreateInfo moduleCreateInfo;
13415 struct icd_spv_header spv;
13416
13417 spv.magic = ~ICD_SPV_MAGIC;
13418 spv.version = ICD_SPV_VERSION;
13419 spv.gen_magic = 0;
13420
13421 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13422 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013423 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013424 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13425 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013426 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013427
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013428 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013429}
13430
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013431#if 0
13432// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070013433TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013434 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013435 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013436
Tony Barbour1fa09702017-03-16 12:09:08 -060013437 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013438 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13439
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013440 VkShaderModule module;
13441 VkShaderModuleCreateInfo moduleCreateInfo;
13442 struct icd_spv_header spv;
13443
13444 spv.magic = ICD_SPV_MAGIC;
13445 spv.version = ~ICD_SPV_VERSION;
13446 spv.gen_magic = 0;
13447
13448 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13449 moduleCreateInfo.pNext = NULL;
13450
Karl Schultz6addd812016-02-02 17:17:23 -070013451 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013452 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13453 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013454 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013455
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013456 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013457}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013458#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013459
Karl Schultz6addd812016-02-02 17:17:23 -070013460TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013461 TEST_DESCRIPTION(
13462 "Test that a warning is produced for a vertex output that "
13463 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013464 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013465
Tony Barbour1fa09702017-03-16 12:09:08 -060013466 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013467 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013468
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013469 char const *vsSource =
13470 "#version 450\n"
13471 "\n"
13472 "layout(location=0) out float x;\n"
13473 "out gl_PerVertex {\n"
13474 " vec4 gl_Position;\n"
13475 "};\n"
13476 "void main(){\n"
13477 " gl_Position = vec4(1);\n"
13478 " x = 0;\n"
13479 "}\n";
13480 char const *fsSource =
13481 "#version 450\n"
13482 "\n"
13483 "layout(location=0) out vec4 color;\n"
13484 "void main(){\n"
13485 " color = vec4(1);\n"
13486 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120013487
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013488 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13489 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013490
13491 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013492 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013493 pipe.AddShader(&vs);
13494 pipe.AddShader(&fs);
13495
Chris Forbes9f7ff632015-05-25 11:13:08 +120013496 VkDescriptorSetObj descriptorSet(m_device);
13497 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013498 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013499
Tony Barbour5781e8f2015-08-04 16:23:11 -060013500 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013501
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013502 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013503}
Chris Forbes9f7ff632015-05-25 11:13:08 +120013504
Mark Mueller098c9cb2016-09-08 09:01:57 -060013505TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
13506 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13507
Tony Barbour1fa09702017-03-16 12:09:08 -060013508 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013509 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13510
13511 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013512 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013513
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013514 char const *vsSource =
13515 "#version 450\n"
13516 "\n"
13517 "out gl_PerVertex {\n"
13518 " vec4 gl_Position;\n"
13519 "};\n"
13520 "void main(){\n"
13521 " gl_Position = vec4(1);\n"
13522 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013523
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013524 char const *fsSource =
13525 "#version 450\n"
13526 "\n"
13527 "layout (constant_id = 0) const float r = 0.0f;\n"
13528 "layout(location = 0) out vec4 uFragColor;\n"
13529 "void main(){\n"
13530 " uFragColor = vec4(r,1,0,1);\n"
13531 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013532
13533 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13534 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13535
13536 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13537 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13538
13539 VkPipelineLayout pipeline_layout;
13540 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13541
13542 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
13543 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13544 vp_state_create_info.viewportCount = 1;
13545 VkViewport viewport = {};
13546 vp_state_create_info.pViewports = &viewport;
13547 vp_state_create_info.scissorCount = 1;
13548 VkRect2D scissors = {};
13549 vp_state_create_info.pScissors = &scissors;
13550
13551 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
13552
13553 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
13554 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
13555 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
13556 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
13557
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013558 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060013559
13560 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
13561 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13562
13563 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
13564 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13565 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13566
13567 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
13568 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
13569 rasterization_state_create_info.pNext = nullptr;
13570 rasterization_state_create_info.lineWidth = 1.0f;
13571 rasterization_state_create_info.rasterizerDiscardEnable = true;
13572
13573 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
13574 color_blend_attachment_state.blendEnable = VK_FALSE;
13575 color_blend_attachment_state.colorWriteMask = 0xf;
13576
13577 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
13578 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13579 color_blend_state_create_info.attachmentCount = 1;
13580 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
13581
13582 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
13583 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13584 graphicspipe_create_info.stageCount = 2;
13585 graphicspipe_create_info.pStages = shader_stage_create_info;
13586 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
13587 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
13588 graphicspipe_create_info.pViewportState = &vp_state_create_info;
13589 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
13590 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
13591 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
13592 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13593 graphicspipe_create_info.layout = pipeline_layout;
13594 graphicspipe_create_info.renderPass = renderPass();
13595
13596 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
13597 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13598
13599 VkPipelineCache pipelineCache;
13600 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
13601
13602 // This structure maps constant ids to data locations.
13603 const VkSpecializationMapEntry entry =
13604 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013605 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013606
13607 uint32_t data = 1;
13608
13609 // Set up the info describing spec map and data
13610 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013611 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060013612 };
13613 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
13614
13615 VkPipeline pipeline;
13616 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
13617 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
13618 m_errorMonitor->VerifyFound();
13619
13620 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
13621 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13622}
13623
13624TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
13625 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13626
Tony Barbour1fa09702017-03-16 12:09:08 -060013627 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013628 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13629
13630 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
13631
13632 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
13633 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13634 descriptor_pool_type_count[0].descriptorCount = 1;
13635 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13636 descriptor_pool_type_count[1].descriptorCount = 1;
13637
13638 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13639 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13640 descriptor_pool_create_info.maxSets = 1;
13641 descriptor_pool_create_info.poolSizeCount = 2;
13642 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
13643 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13644
13645 VkDescriptorPool descriptorset_pool;
13646 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13647
13648 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13649 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13650 descriptorset_layout_binding.descriptorCount = 1;
13651 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
Cody Northropa6484fd2017-03-10 14:13:49 -070013652 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013653
13654 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13655 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13656 descriptorset_layout_create_info.bindingCount = 1;
13657 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13658
13659 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013660 ASSERT_VK_SUCCESS(
13661 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013662
13663 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13664 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13665 descriptorset_allocate_info.descriptorSetCount = 1;
13666 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13667 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13668 VkDescriptorSet descriptorset;
13669 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13670
13671 // Challenge core_validation with a non uniform buffer type.
13672 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
13673
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013674 char const *vsSource =
13675 "#version 450\n"
13676 "\n"
13677 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13678 " mat4 mvp;\n"
13679 "} ubuf;\n"
13680 "out gl_PerVertex {\n"
13681 " vec4 gl_Position;\n"
13682 "};\n"
13683 "void main(){\n"
13684 " gl_Position = ubuf.mvp * vec4(1);\n"
13685 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013686
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013687 char const *fsSource =
13688 "#version 450\n"
13689 "\n"
13690 "layout(location = 0) out vec4 uFragColor;\n"
13691 "void main(){\n"
13692 " uFragColor = vec4(0,1,0,1);\n"
13693 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013694
13695 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13696 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13697
13698 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13699 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13700 pipeline_layout_create_info.setLayoutCount = 1;
13701 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13702
13703 VkPipelineLayout pipeline_layout;
13704 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13705
13706 VkPipelineObj pipe(m_device);
13707 pipe.AddColorAttachment();
13708 pipe.AddShader(&vs);
13709 pipe.AddShader(&fs);
13710
13711 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
13712 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13713 m_errorMonitor->VerifyFound();
13714
13715 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13716 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13717 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13718}
13719
13720TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
13721 TEST_DESCRIPTION(
13722 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
13723
Tony Barbour1fa09702017-03-16 12:09:08 -060013724 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013725 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13726
13727 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
13728
13729 VkDescriptorPoolSize descriptor_pool_type_count = {};
13730 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13731 descriptor_pool_type_count.descriptorCount = 1;
13732
13733 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13734 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13735 descriptor_pool_create_info.maxSets = 1;
13736 descriptor_pool_create_info.poolSizeCount = 1;
13737 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
13738 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13739
13740 VkDescriptorPool descriptorset_pool;
13741 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13742
13743 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13744 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13745 descriptorset_layout_binding.descriptorCount = 1;
13746 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
13747 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
Cody Northropa6484fd2017-03-10 14:13:49 -070013748 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013749
13750 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13751 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13752 descriptorset_layout_create_info.bindingCount = 1;
13753 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13754
13755 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013756 ASSERT_VK_SUCCESS(
13757 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013758
13759 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13760 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13761 descriptorset_allocate_info.descriptorSetCount = 1;
13762 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13763 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13764 VkDescriptorSet descriptorset;
13765 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13766
13767 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
13768
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013769 char const *vsSource =
13770 "#version 450\n"
13771 "\n"
13772 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13773 " mat4 mvp;\n"
13774 "} ubuf;\n"
13775 "out gl_PerVertex {\n"
13776 " vec4 gl_Position;\n"
13777 "};\n"
13778 "void main(){\n"
13779 " gl_Position = ubuf.mvp * vec4(1);\n"
13780 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013781
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013782 char const *fsSource =
13783 "#version 450\n"
13784 "\n"
13785 "layout(location = 0) out vec4 uFragColor;\n"
13786 "void main(){\n"
13787 " uFragColor = vec4(0,1,0,1);\n"
13788 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013789
13790 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13791 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13792
13793 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13794 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13795 pipeline_layout_create_info.setLayoutCount = 1;
13796 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13797
13798 VkPipelineLayout pipeline_layout;
13799 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13800
13801 VkPipelineObj pipe(m_device);
13802 pipe.AddColorAttachment();
13803 pipe.AddShader(&vs);
13804 pipe.AddShader(&fs);
13805
13806 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
13807 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13808 m_errorMonitor->VerifyFound();
13809
13810 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13811 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13812 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13813}
13814
13815TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013816 TEST_DESCRIPTION(
13817 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
13818 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060013819
Tony Barbour1fa09702017-03-16 12:09:08 -060013820 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013821 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13822
13823 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013824 "Push constant range covering variable starting at offset 0 not accessible from stage VK_SHADER_STAGE_VERTEX_BIT";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013825
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013826 char const *vsSource =
13827 "#version 450\n"
13828 "\n"
13829 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13830 "out gl_PerVertex {\n"
13831 " vec4 gl_Position;\n"
13832 "};\n"
13833 "void main(){\n"
13834 " gl_Position = vec4(consts.x);\n"
13835 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013836
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013837 char const *fsSource =
13838 "#version 450\n"
13839 "\n"
13840 "layout(location = 0) out vec4 uFragColor;\n"
13841 "void main(){\n"
13842 " uFragColor = vec4(0,1,0,1);\n"
13843 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013844
13845 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13846 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13847
13848 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13849 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13850
13851 // Set up a push constant range
13852 VkPushConstantRange push_constant_ranges = {};
13853 // Set to the wrong stage to challenge core_validation
13854 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13855 push_constant_ranges.size = 4;
13856
13857 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
13858 pipeline_layout_create_info.pushConstantRangeCount = 1;
13859
13860 VkPipelineLayout pipeline_layout;
13861 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13862
13863 VkPipelineObj pipe(m_device);
13864 pipe.AddColorAttachment();
13865 pipe.AddShader(&vs);
13866 pipe.AddShader(&fs);
13867
13868 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
13869 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13870 m_errorMonitor->VerifyFound();
13871
13872 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13873}
13874
13875TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
13876 TEST_DESCRIPTION(
13877 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
13878
Tony Barbour1fa09702017-03-16 12:09:08 -060013879 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013880 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13881
13882 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013883 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013884
13885 // Some awkward steps are required to test with custom device features.
13886 std::vector<const char *> device_extension_names;
13887 auto features = m_device->phy().features();
13888 // Disable support for 64 bit floats
13889 features.shaderFloat64 = false;
13890 // The sacrificial device object
13891 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
13892
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013893 char const *vsSource =
13894 "#version 450\n"
13895 "\n"
13896 "out gl_PerVertex {\n"
13897 " vec4 gl_Position;\n"
13898 "};\n"
13899 "void main(){\n"
13900 " gl_Position = vec4(1);\n"
13901 "}\n";
13902 char const *fsSource =
13903 "#version 450\n"
13904 "\n"
13905 "layout(location=0) out vec4 color;\n"
13906 "void main(){\n"
13907 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
13908 " color = vec4(green);\n"
13909 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013910
13911 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13912 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13913
13914 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060013915
13916 VkPipelineObj pipe(&test_device);
13917 pipe.AddColorAttachment();
13918 pipe.AddShader(&vs);
13919 pipe.AddShader(&fs);
13920
13921 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13922 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13923 VkPipelineLayout pipeline_layout;
13924 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13925
13926 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
13927 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
13928 m_errorMonitor->VerifyFound();
13929
13930 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
13931}
13932
13933TEST_F(VkLayerTest, CreatePipelineCheckShaderBadCapability) {
13934 TEST_DESCRIPTION("Create a graphics pipeline in which a capability declared by the shader is not supported by Vulkan shaders.");
13935
Tony Barbour1fa09702017-03-16 12:09:08 -060013936 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013937 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13938
13939 const char *bad_capability_message = "Shader declares capability 53, not supported in Vulkan.";
13940
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013941 char const *vsSource =
13942 "#version 450\n"
13943 "\n"
13944 "out gl_PerVertex {\n"
13945 " vec4 gl_Position;\n"
13946 "};\n"
13947 "layout(xfb_buffer = 1) out;"
13948 "void main(){\n"
13949 " gl_Position = vec4(1);\n"
13950 "}\n";
13951 char const *fsSource =
13952 "#version 450\n"
13953 "\n"
13954 "layout(location=0) out vec4 color;\n"
13955 "void main(){\n"
13956 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
13957 " color = vec4(green);\n"
13958 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013959
13960 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13961 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13962
13963 VkPipelineObj pipe(m_device);
13964 pipe.AddColorAttachment();
13965 pipe.AddShader(&vs);
13966 pipe.AddShader(&fs);
13967
13968 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13969 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13970 VkPipelineLayout pipeline_layout;
13971 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13972
13973 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_capability_message);
13974 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13975 m_errorMonitor->VerifyFound();
13976
13977 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13978}
13979
Karl Schultz6addd812016-02-02 17:17:23 -070013980TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013981 TEST_DESCRIPTION(
13982 "Test that an error is produced for a fragment shader input "
13983 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120013984
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013985 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013986
Tony Barbour1fa09702017-03-16 12:09:08 -060013987 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013988 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120013989
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013990 char const *vsSource =
13991 "#version 450\n"
13992 "\n"
13993 "out gl_PerVertex {\n"
13994 " vec4 gl_Position;\n"
13995 "};\n"
13996 "void main(){\n"
13997 " gl_Position = vec4(1);\n"
13998 "}\n";
13999 char const *fsSource =
14000 "#version 450\n"
14001 "\n"
14002 "layout(location=0) in float x;\n"
14003 "layout(location=0) out vec4 color;\n"
14004 "void main(){\n"
14005 " color = vec4(x);\n"
14006 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120014007
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014008 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14009 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014010
14011 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014012 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014013 pipe.AddShader(&vs);
14014 pipe.AddShader(&fs);
14015
Chris Forbes59cb88d2015-05-25 11:13:13 +120014016 VkDescriptorSetObj descriptorSet(m_device);
14017 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014018 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014019
Tony Barbour5781e8f2015-08-04 16:23:11 -060014020 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014021
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014022 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014023}
14024
Karl Schultz6addd812016-02-02 17:17:23 -070014025TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014026 TEST_DESCRIPTION(
14027 "Test that an error is produced for a fragment shader input "
14028 "within an interace block, which is not present in the outputs "
14029 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014030 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014031
Tony Barbour1fa09702017-03-16 12:09:08 -060014032 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014033 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14034
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014035 char const *vsSource =
14036 "#version 450\n"
14037 "\n"
14038 "out gl_PerVertex {\n"
14039 " vec4 gl_Position;\n"
14040 "};\n"
14041 "void main(){\n"
14042 " gl_Position = vec4(1);\n"
14043 "}\n";
14044 char const *fsSource =
14045 "#version 450\n"
14046 "\n"
14047 "in block { layout(location=0) float x; } ins;\n"
14048 "layout(location=0) out vec4 color;\n"
14049 "void main(){\n"
14050 " color = vec4(ins.x);\n"
14051 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014052
14053 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14054 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14055
14056 VkPipelineObj pipe(m_device);
14057 pipe.AddColorAttachment();
14058 pipe.AddShader(&vs);
14059 pipe.AddShader(&fs);
14060
14061 VkDescriptorSetObj descriptorSet(m_device);
14062 descriptorSet.AppendDummy();
14063 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14064
14065 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14066
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014067 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014068}
14069
Karl Schultz6addd812016-02-02 17:17:23 -070014070TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014071 TEST_DESCRIPTION(
14072 "Test that an error is produced for mismatched array sizes "
14073 "across the vertex->fragment shader interface");
14074 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14075 "Type mismatch on location 0.0: 'ptr to "
14076 "output arr[2] of float32' vs 'ptr to "
14077 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130014078
Tony Barbour1fa09702017-03-16 12:09:08 -060014079 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes0036fd12016-01-26 14:19:49 +130014080 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14081
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014082 char const *vsSource =
14083 "#version 450\n"
14084 "\n"
14085 "layout(location=0) out float x[2];\n"
14086 "out gl_PerVertex {\n"
14087 " vec4 gl_Position;\n"
14088 "};\n"
14089 "void main(){\n"
14090 " x[0] = 0; x[1] = 0;\n"
14091 " gl_Position = vec4(1);\n"
14092 "}\n";
14093 char const *fsSource =
14094 "#version 450\n"
14095 "\n"
14096 "layout(location=0) in float x[1];\n"
14097 "layout(location=0) out vec4 color;\n"
14098 "void main(){\n"
14099 " color = vec4(x[0]);\n"
14100 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130014101
14102 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14103 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14104
14105 VkPipelineObj pipe(m_device);
14106 pipe.AddColorAttachment();
14107 pipe.AddShader(&vs);
14108 pipe.AddShader(&fs);
14109
14110 VkDescriptorSetObj descriptorSet(m_device);
14111 descriptorSet.AppendDummy();
14112 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14113
14114 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14115
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014116 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130014117}
14118
Karl Schultz6addd812016-02-02 17:17:23 -070014119TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014120 TEST_DESCRIPTION(
14121 "Test that an error is produced for mismatched types across "
14122 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014123 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014124
Tony Barbour1fa09702017-03-16 12:09:08 -060014125 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014126 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120014127
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014128 char const *vsSource =
14129 "#version 450\n"
14130 "\n"
14131 "layout(location=0) out int x;\n"
14132 "out gl_PerVertex {\n"
14133 " vec4 gl_Position;\n"
14134 "};\n"
14135 "void main(){\n"
14136 " x = 0;\n"
14137 " gl_Position = vec4(1);\n"
14138 "}\n";
14139 char const *fsSource =
14140 "#version 450\n"
14141 "\n"
14142 "layout(location=0) in float x;\n" /* VS writes int */
14143 "layout(location=0) out vec4 color;\n"
14144 "void main(){\n"
14145 " color = vec4(x);\n"
14146 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120014147
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014148 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14149 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120014150
14151 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014152 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120014153 pipe.AddShader(&vs);
14154 pipe.AddShader(&fs);
14155
Chris Forbesb56af562015-05-25 11:13:17 +120014156 VkDescriptorSetObj descriptorSet(m_device);
14157 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014158 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120014159
Tony Barbour5781e8f2015-08-04 16:23:11 -060014160 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120014161
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014162 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120014163}
14164
Karl Schultz6addd812016-02-02 17:17:23 -070014165TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014166 TEST_DESCRIPTION(
14167 "Test that an error is produced for mismatched types across "
14168 "the vertex->fragment shader interface, when the variable is contained within "
14169 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014170 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014171
Tony Barbour1fa09702017-03-16 12:09:08 -060014172 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014173 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14174
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014175 char const *vsSource =
14176 "#version 450\n"
14177 "\n"
14178 "out block { layout(location=0) int x; } outs;\n"
14179 "out gl_PerVertex {\n"
14180 " vec4 gl_Position;\n"
14181 "};\n"
14182 "void main(){\n"
14183 " outs.x = 0;\n"
14184 " gl_Position = vec4(1);\n"
14185 "}\n";
14186 char const *fsSource =
14187 "#version 450\n"
14188 "\n"
14189 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
14190 "layout(location=0) out vec4 color;\n"
14191 "void main(){\n"
14192 " color = vec4(ins.x);\n"
14193 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014194
14195 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14196 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14197
14198 VkPipelineObj pipe(m_device);
14199 pipe.AddColorAttachment();
14200 pipe.AddShader(&vs);
14201 pipe.AddShader(&fs);
14202
14203 VkDescriptorSetObj descriptorSet(m_device);
14204 descriptorSet.AppendDummy();
14205 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14206
14207 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14208
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014209 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014210}
14211
14212TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014213 TEST_DESCRIPTION(
14214 "Test that an error is produced for location mismatches across "
14215 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
14216 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014217 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "location 0.0 which is not written by vertex shader");
Chris Forbese9928822016-02-17 14:44:52 +130014218
Tony Barbour1fa09702017-03-16 12:09:08 -060014219 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014220 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14221
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014222 char const *vsSource =
14223 "#version 450\n"
14224 "\n"
14225 "out block { layout(location=1) float x; } outs;\n"
14226 "out gl_PerVertex {\n"
14227 " vec4 gl_Position;\n"
14228 "};\n"
14229 "void main(){\n"
14230 " outs.x = 0;\n"
14231 " gl_Position = vec4(1);\n"
14232 "}\n";
14233 char const *fsSource =
14234 "#version 450\n"
14235 "\n"
14236 "in block { layout(location=0) float x; } ins;\n"
14237 "layout(location=0) out vec4 color;\n"
14238 "void main(){\n"
14239 " color = vec4(ins.x);\n"
14240 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014241
14242 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14243 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14244
14245 VkPipelineObj pipe(m_device);
14246 pipe.AddColorAttachment();
14247 pipe.AddShader(&vs);
14248 pipe.AddShader(&fs);
14249
14250 VkDescriptorSetObj descriptorSet(m_device);
14251 descriptorSet.AppendDummy();
14252 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14253
14254 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14255
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014256 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014257}
14258
14259TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014260 TEST_DESCRIPTION(
14261 "Test that an error is produced for component mismatches across the "
14262 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
14263 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014264 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "location 0.1 which is not written by vertex shader");
Chris Forbese9928822016-02-17 14:44:52 +130014265
Tony Barbour1fa09702017-03-16 12:09:08 -060014266 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014267 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14268
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014269 char const *vsSource =
14270 "#version 450\n"
14271 "\n"
14272 "out block { layout(location=0, component=0) float x; } outs;\n"
14273 "out gl_PerVertex {\n"
14274 " vec4 gl_Position;\n"
14275 "};\n"
14276 "void main(){\n"
14277 " outs.x = 0;\n"
14278 " gl_Position = vec4(1);\n"
14279 "}\n";
14280 char const *fsSource =
14281 "#version 450\n"
14282 "\n"
14283 "in block { layout(location=0, component=1) float x; } ins;\n"
14284 "layout(location=0) out vec4 color;\n"
14285 "void main(){\n"
14286 " color = vec4(ins.x);\n"
14287 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014288
14289 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14290 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14291
14292 VkPipelineObj pipe(m_device);
14293 pipe.AddColorAttachment();
14294 pipe.AddShader(&vs);
14295 pipe.AddShader(&fs);
14296
14297 VkDescriptorSetObj descriptorSet(m_device);
14298 descriptorSet.AppendDummy();
14299 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14300
14301 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14302
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014303 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014304}
14305
Chris Forbes1f3b0152016-11-30 12:48:40 +130014306TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
14307 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14308
Tony Barbour1fa09702017-03-16 12:09:08 -060014309 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes1f3b0152016-11-30 12:48:40 +130014310 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14311
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014312 char const *vsSource =
14313 "#version 450\n"
14314 "layout(location=0) out mediump float x;\n"
14315 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14316 char const *fsSource =
14317 "#version 450\n"
14318 "layout(location=0) in highp float x;\n"
14319 "layout(location=0) out vec4 color;\n"
14320 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130014321
14322 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14323 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14324
14325 VkPipelineObj pipe(m_device);
14326 pipe.AddColorAttachment();
14327 pipe.AddShader(&vs);
14328 pipe.AddShader(&fs);
14329
14330 VkDescriptorSetObj descriptorSet(m_device);
14331 descriptorSet.AppendDummy();
14332 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14333
14334 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14335
14336 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14337
14338 m_errorMonitor->VerifyFound();
14339}
14340
Chris Forbes870a39e2016-11-30 12:55:56 +130014341TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
14342 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14343
Tony Barbour1fa09702017-03-16 12:09:08 -060014344 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes870a39e2016-11-30 12:55:56 +130014345 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14346
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014347 char const *vsSource =
14348 "#version 450\n"
14349 "out block { layout(location=0) mediump float x; };\n"
14350 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14351 char const *fsSource =
14352 "#version 450\n"
14353 "in block { layout(location=0) highp float x; };\n"
14354 "layout(location=0) out vec4 color;\n"
14355 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130014356
14357 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14358 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14359
14360 VkPipelineObj pipe(m_device);
14361 pipe.AddColorAttachment();
14362 pipe.AddShader(&vs);
14363 pipe.AddShader(&fs);
14364
14365 VkDescriptorSetObj descriptorSet(m_device);
14366 descriptorSet.AppendDummy();
14367 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14368
14369 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14370
14371 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14372
14373 m_errorMonitor->VerifyFound();
14374}
14375
Karl Schultz6addd812016-02-02 17:17:23 -070014376TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014377 TEST_DESCRIPTION(
14378 "Test that a warning is produced for a vertex attribute which is "
14379 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014380 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014381
Tony Barbour1fa09702017-03-16 12:09:08 -060014382 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014383 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120014384
14385 VkVertexInputBindingDescription input_binding;
14386 memset(&input_binding, 0, sizeof(input_binding));
14387
14388 VkVertexInputAttributeDescription input_attrib;
14389 memset(&input_attrib, 0, sizeof(input_attrib));
14390 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14391
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014392 char const *vsSource =
14393 "#version 450\n"
14394 "\n"
14395 "out gl_PerVertex {\n"
14396 " vec4 gl_Position;\n"
14397 "};\n"
14398 "void main(){\n"
14399 " gl_Position = vec4(1);\n"
14400 "}\n";
14401 char const *fsSource =
14402 "#version 450\n"
14403 "\n"
14404 "layout(location=0) out vec4 color;\n"
14405 "void main(){\n"
14406 " color = vec4(1);\n"
14407 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120014408
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014409 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14410 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120014411
14412 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014413 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120014414 pipe.AddShader(&vs);
14415 pipe.AddShader(&fs);
14416
14417 pipe.AddVertexInputBindings(&input_binding, 1);
14418 pipe.AddVertexInputAttribs(&input_attrib, 1);
14419
Chris Forbesde136e02015-05-25 11:13:28 +120014420 VkDescriptorSetObj descriptorSet(m_device);
14421 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014422 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120014423
Tony Barbour5781e8f2015-08-04 16:23:11 -060014424 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120014425
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014426 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120014427}
14428
Karl Schultz6addd812016-02-02 17:17:23 -070014429TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014430 TEST_DESCRIPTION(
14431 "Test that a warning is produced for a location mismatch on "
14432 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014434
Tony Barbour1fa09702017-03-16 12:09:08 -060014435 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes7d83cd52016-01-15 11:32:03 +130014436 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14437
14438 VkVertexInputBindingDescription input_binding;
14439 memset(&input_binding, 0, sizeof(input_binding));
14440
14441 VkVertexInputAttributeDescription input_attrib;
14442 memset(&input_attrib, 0, sizeof(input_attrib));
14443 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14444
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014445 char const *vsSource =
14446 "#version 450\n"
14447 "\n"
14448 "layout(location=1) in float x;\n"
14449 "out gl_PerVertex {\n"
14450 " vec4 gl_Position;\n"
14451 "};\n"
14452 "void main(){\n"
14453 " gl_Position = vec4(x);\n"
14454 "}\n";
14455 char const *fsSource =
14456 "#version 450\n"
14457 "\n"
14458 "layout(location=0) out vec4 color;\n"
14459 "void main(){\n"
14460 " color = vec4(1);\n"
14461 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130014462
14463 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14464 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14465
14466 VkPipelineObj pipe(m_device);
14467 pipe.AddColorAttachment();
14468 pipe.AddShader(&vs);
14469 pipe.AddShader(&fs);
14470
14471 pipe.AddVertexInputBindings(&input_binding, 1);
14472 pipe.AddVertexInputAttribs(&input_attrib, 1);
14473
14474 VkDescriptorSetObj descriptorSet(m_device);
14475 descriptorSet.AppendDummy();
14476 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14477
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070014478 m_errorMonitor->SetUnexpectedError("Vertex shader consumes input at location 1 but not provided");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014479 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14480
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014481 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130014482}
14483
Karl Schultz6addd812016-02-02 17:17:23 -070014484TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014485 TEST_DESCRIPTION(
14486 "Test that an error is produced for a vertex shader input which is not "
14487 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14489 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014490
Tony Barbour1fa09702017-03-16 12:09:08 -060014491 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014492 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120014493
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014494 char const *vsSource =
14495 "#version 450\n"
14496 "\n"
14497 "layout(location=0) in vec4 x;\n" /* not provided */
14498 "out gl_PerVertex {\n"
14499 " vec4 gl_Position;\n"
14500 "};\n"
14501 "void main(){\n"
14502 " gl_Position = x;\n"
14503 "}\n";
14504 char const *fsSource =
14505 "#version 450\n"
14506 "\n"
14507 "layout(location=0) out vec4 color;\n"
14508 "void main(){\n"
14509 " color = vec4(1);\n"
14510 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120014511
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014512 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14513 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120014514
14515 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014516 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120014517 pipe.AddShader(&vs);
14518 pipe.AddShader(&fs);
14519
Chris Forbes62e8e502015-05-25 11:13:29 +120014520 VkDescriptorSetObj descriptorSet(m_device);
14521 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014522 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120014523
Tony Barbour5781e8f2015-08-04 16:23:11 -060014524 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120014525
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014526 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120014527}
14528
Karl Schultz6addd812016-02-02 17:17:23 -070014529TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014530 TEST_DESCRIPTION(
14531 "Test that an error is produced for a mismatch between the "
14532 "fundamental type (float/int/uint) of an attribute and the "
14533 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060014534 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "location 0 does not match vertex shader input type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014535
Tony Barbour1fa09702017-03-16 12:09:08 -060014536 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014537 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014538
14539 VkVertexInputBindingDescription input_binding;
14540 memset(&input_binding, 0, sizeof(input_binding));
14541
14542 VkVertexInputAttributeDescription input_attrib;
14543 memset(&input_attrib, 0, sizeof(input_attrib));
14544 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14545
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014546 char const *vsSource =
14547 "#version 450\n"
14548 "\n"
14549 "layout(location=0) in int x;\n" /* attrib provided float */
14550 "out gl_PerVertex {\n"
14551 " vec4 gl_Position;\n"
14552 "};\n"
14553 "void main(){\n"
14554 " gl_Position = vec4(x);\n"
14555 "}\n";
14556 char const *fsSource =
14557 "#version 450\n"
14558 "\n"
14559 "layout(location=0) out vec4 color;\n"
14560 "void main(){\n"
14561 " color = vec4(1);\n"
14562 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120014563
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014564 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14565 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014566
14567 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014568 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014569 pipe.AddShader(&vs);
14570 pipe.AddShader(&fs);
14571
14572 pipe.AddVertexInputBindings(&input_binding, 1);
14573 pipe.AddVertexInputAttribs(&input_attrib, 1);
14574
Chris Forbesc97d98e2015-05-25 11:13:31 +120014575 VkDescriptorSetObj descriptorSet(m_device);
14576 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014577 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014578
Tony Barbour5781e8f2015-08-04 16:23:11 -060014579 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014580
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014581 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014582}
14583
Chris Forbesc68b43c2016-04-06 11:18:47 +120014584TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014585 TEST_DESCRIPTION(
14586 "Test that an error is produced for a pipeline containing multiple "
14587 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014588 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14589 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120014590
Tony Barbour1fa09702017-03-16 12:09:08 -060014591 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc68b43c2016-04-06 11:18:47 +120014592 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14593
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014594 char const *vsSource =
14595 "#version 450\n"
14596 "\n"
14597 "out gl_PerVertex {\n"
14598 " vec4 gl_Position;\n"
14599 "};\n"
14600 "void main(){\n"
14601 " gl_Position = vec4(1);\n"
14602 "}\n";
14603 char const *fsSource =
14604 "#version 450\n"
14605 "\n"
14606 "layout(location=0) out vec4 color;\n"
14607 "void main(){\n"
14608 " color = vec4(1);\n"
14609 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120014610
14611 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14612 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14613
14614 VkPipelineObj pipe(m_device);
14615 pipe.AddColorAttachment();
14616 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014617 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120014618 pipe.AddShader(&fs);
14619
14620 VkDescriptorSetObj descriptorSet(m_device);
14621 descriptorSet.AppendDummy();
14622 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14623
14624 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14625
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014626 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120014627}
14628
Chris Forbes82ff92a2016-09-09 10:50:24 +120014629TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014630 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120014631
Tony Barbour1fa09702017-03-16 12:09:08 -060014632 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes82ff92a2016-09-09 10:50:24 +120014633 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14634
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014635 char const *vsSource =
14636 "#version 450\n"
14637 "out gl_PerVertex {\n"
14638 " vec4 gl_Position;\n"
14639 "};\n"
14640 "void main(){\n"
14641 " gl_Position = vec4(0);\n"
14642 "}\n";
14643 char const *fsSource =
14644 "#version 450\n"
14645 "\n"
14646 "layout(location=0) out vec4 color;\n"
14647 "void main(){\n"
14648 " color = vec4(1);\n"
14649 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120014650
14651 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14652 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
14653
14654 VkPipelineObj pipe(m_device);
14655 pipe.AddColorAttachment();
14656 pipe.AddShader(&vs);
14657 pipe.AddShader(&fs);
14658
14659 VkDescriptorSetObj descriptorSet(m_device);
14660 descriptorSet.AppendDummy();
14661 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14662
14663 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14664
14665 m_errorMonitor->VerifyFound();
14666}
14667
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014668TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014669 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14670 "pDepthStencilState is NULL when rasterization is enabled and subpass "
14671 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014672
Tony Barbour1fa09702017-03-16 12:09:08 -060014673 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014674 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14675
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014676 char const *vsSource =
14677 "#version 450\n"
14678 "void main(){ gl_Position = vec4(0); }\n";
14679 char const *fsSource =
14680 "#version 450\n"
14681 "\n"
14682 "layout(location=0) out vec4 color;\n"
14683 "void main(){\n"
14684 " color = vec4(1);\n"
14685 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014686
14687 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14688 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14689
14690 VkPipelineObj pipe(m_device);
14691 pipe.AddColorAttachment();
14692 pipe.AddShader(&vs);
14693 pipe.AddShader(&fs);
14694
14695 VkDescriptorSetObj descriptorSet(m_device);
14696 descriptorSet.AppendDummy();
14697 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14698
14699 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014700 {
14701 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14702 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14703 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014704 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014705 {
14706 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14707 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14708 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014709 },
14710 };
14711 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014712 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014713 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014714 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
14715 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014716 VkRenderPass rp;
14717 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14718 ASSERT_VK_SUCCESS(err);
14719
14720 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
14721
14722 m_errorMonitor->VerifyFound();
14723
14724 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14725}
14726
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014727TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014728 TEST_DESCRIPTION(
14729 "Test that an error is produced for a variable output from "
14730 "the TCS without the patch decoration, but consumed in the TES "
14731 "with the decoration.");
14732 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14733 "is per-vertex in tessellation control shader stage "
14734 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120014735
Tony Barbour1fa09702017-03-16 12:09:08 -060014736 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa0193bc2016-04-04 19:19:47 +120014737 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14738
Chris Forbesc1e852d2016-04-04 19:26:42 +120014739 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070014740 printf(" Device does not support tessellation shaders; skipped.\n");
Chris Forbesc1e852d2016-04-04 19:26:42 +120014741 return;
14742 }
14743
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014744 char const *vsSource =
14745 "#version 450\n"
14746 "void main(){}\n";
14747 char const *tcsSource =
14748 "#version 450\n"
14749 "layout(location=0) out int x[];\n"
14750 "layout(vertices=3) out;\n"
14751 "void main(){\n"
14752 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14753 " gl_TessLevelInner[0] = 1;\n"
14754 " x[gl_InvocationID] = gl_InvocationID;\n"
14755 "}\n";
14756 char const *tesSource =
14757 "#version 450\n"
14758 "layout(triangles, equal_spacing, cw) in;\n"
14759 "layout(location=0) patch in int x;\n"
14760 "out gl_PerVertex { vec4 gl_Position; };\n"
14761 "void main(){\n"
14762 " gl_Position.xyz = gl_TessCoord;\n"
14763 " gl_Position.w = x;\n"
14764 "}\n";
14765 char const *fsSource =
14766 "#version 450\n"
14767 "layout(location=0) out vec4 color;\n"
14768 "void main(){\n"
14769 " color = vec4(1);\n"
14770 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120014771
14772 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14773 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
14774 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
14775 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14776
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014777 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
14778 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014779
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014780 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014781
14782 VkPipelineObj pipe(m_device);
14783 pipe.SetInputAssembly(&iasci);
14784 pipe.SetTessellation(&tsci);
14785 pipe.AddColorAttachment();
14786 pipe.AddShader(&vs);
14787 pipe.AddShader(&tcs);
14788 pipe.AddShader(&tes);
14789 pipe.AddShader(&fs);
14790
14791 VkDescriptorSetObj descriptorSet(m_device);
14792 descriptorSet.AppendDummy();
14793 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14794
14795 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14796
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014797 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120014798}
14799
Karl Schultz6addd812016-02-02 17:17:23 -070014800TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014801 TEST_DESCRIPTION(
14802 "Test that an error is produced for a vertex attribute setup where multiple "
14803 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014804 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14805 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014806
Tony Barbour1fa09702017-03-16 12:09:08 -060014807 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014808 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014809
14810 /* Two binding descriptions for binding 0 */
14811 VkVertexInputBindingDescription input_bindings[2];
14812 memset(input_bindings, 0, sizeof(input_bindings));
14813
14814 VkVertexInputAttributeDescription input_attrib;
14815 memset(&input_attrib, 0, sizeof(input_attrib));
14816 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14817
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014818 char const *vsSource =
14819 "#version 450\n"
14820 "\n"
14821 "layout(location=0) in float x;\n" /* attrib provided float */
14822 "out gl_PerVertex {\n"
14823 " vec4 gl_Position;\n"
14824 "};\n"
14825 "void main(){\n"
14826 " gl_Position = vec4(x);\n"
14827 "}\n";
14828 char const *fsSource =
14829 "#version 450\n"
14830 "\n"
14831 "layout(location=0) out vec4 color;\n"
14832 "void main(){\n"
14833 " color = vec4(1);\n"
14834 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120014835
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014836 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14837 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014838
14839 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014840 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014841 pipe.AddShader(&vs);
14842 pipe.AddShader(&fs);
14843
14844 pipe.AddVertexInputBindings(input_bindings, 2);
14845 pipe.AddVertexInputAttribs(&input_attrib, 1);
14846
Chris Forbes280ba2c2015-06-12 11:16:41 +120014847 VkDescriptorSetObj descriptorSet(m_device);
14848 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014849 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014850
Tony Barbour5781e8f2015-08-04 16:23:11 -060014851 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014852
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014853 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014854}
Chris Forbes8f68b562015-05-25 11:13:32 +120014855
Karl Schultz6addd812016-02-02 17:17:23 -070014856TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014857 TEST_DESCRIPTION(
14858 "Test that an error is produced for a fragment shader which does not "
14859 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014861
Tony Barbour1fa09702017-03-16 12:09:08 -060014862 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014863
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014864 char const *vsSource =
14865 "#version 450\n"
14866 "\n"
14867 "out gl_PerVertex {\n"
14868 " vec4 gl_Position;\n"
14869 "};\n"
14870 "void main(){\n"
14871 " gl_Position = vec4(1);\n"
14872 "}\n";
14873 char const *fsSource =
14874 "#version 450\n"
14875 "\n"
14876 "void main(){\n"
14877 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014878
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014879 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14880 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014881
14882 VkPipelineObj pipe(m_device);
14883 pipe.AddShader(&vs);
14884 pipe.AddShader(&fs);
14885
Chia-I Wu08accc62015-07-07 11:50:03 +080014886 /* set up CB 0, not written */
14887 pipe.AddColorAttachment();
14888 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014889
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014890 VkDescriptorSetObj descriptorSet(m_device);
14891 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014892 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014893
Tony Barbour5781e8f2015-08-04 16:23:11 -060014894 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014895
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014896 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014897}
14898
Karl Schultz6addd812016-02-02 17:17:23 -070014899TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014900 TEST_DESCRIPTION(
14901 "Test that a warning is produced for a fragment shader which provides a spurious "
14902 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060014904 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014905
Tony Barbour1fa09702017-03-16 12:09:08 -060014906 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014907
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014908 char const *vsSource =
14909 "#version 450\n"
14910 "\n"
14911 "out gl_PerVertex {\n"
14912 " vec4 gl_Position;\n"
14913 "};\n"
14914 "void main(){\n"
14915 " gl_Position = vec4(1);\n"
14916 "}\n";
14917 char const *fsSource =
14918 "#version 450\n"
14919 "\n"
14920 "layout(location=0) out vec4 x;\n"
14921 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
14922 "void main(){\n"
14923 " x = vec4(1);\n"
14924 " y = vec4(1);\n"
14925 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014926
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014927 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14928 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014929
14930 VkPipelineObj pipe(m_device);
14931 pipe.AddShader(&vs);
14932 pipe.AddShader(&fs);
14933
Chia-I Wu08accc62015-07-07 11:50:03 +080014934 /* set up CB 0, not written */
14935 pipe.AddColorAttachment();
14936 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014937 /* FS writes CB 1, but we don't configure it */
14938
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014939 VkDescriptorSetObj descriptorSet(m_device);
14940 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014941 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014942
Tony Barbour5781e8f2015-08-04 16:23:11 -060014943 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014944
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014945 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014946}
14947
Karl Schultz6addd812016-02-02 17:17:23 -070014948TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014949 TEST_DESCRIPTION(
14950 "Test that an error is produced for a mismatch between the fundamental "
14951 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014953
Tony Barbour1fa09702017-03-16 12:09:08 -060014954 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014955
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014956 char const *vsSource =
14957 "#version 450\n"
14958 "\n"
14959 "out gl_PerVertex {\n"
14960 " vec4 gl_Position;\n"
14961 "};\n"
14962 "void main(){\n"
14963 " gl_Position = vec4(1);\n"
14964 "}\n";
14965 char const *fsSource =
14966 "#version 450\n"
14967 "\n"
14968 "layout(location=0) out ivec4 x;\n" /* not UNORM */
14969 "void main(){\n"
14970 " x = ivec4(1);\n"
14971 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120014972
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014973 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14974 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014975
14976 VkPipelineObj pipe(m_device);
14977 pipe.AddShader(&vs);
14978 pipe.AddShader(&fs);
14979
Chia-I Wu08accc62015-07-07 11:50:03 +080014980 /* set up CB 0; type is UNORM by default */
14981 pipe.AddColorAttachment();
14982 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014983
Chris Forbesa36d69e2015-05-25 11:13:44 +120014984 VkDescriptorSetObj descriptorSet(m_device);
14985 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014986 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014987
Tony Barbour5781e8f2015-08-04 16:23:11 -060014988 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014989
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014990 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120014991}
Chris Forbes7b1b8932015-06-05 14:43:36 +120014992
Karl Schultz6addd812016-02-02 17:17:23 -070014993TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014994 TEST_DESCRIPTION(
14995 "Test that an error is produced for a shader consuming a uniform "
14996 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014997 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014998
Tony Barbour1fa09702017-03-16 12:09:08 -060014999 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes556c76c2015-08-14 12:04:59 +120015000
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015001 char const *vsSource =
15002 "#version 450\n"
15003 "\n"
15004 "out gl_PerVertex {\n"
15005 " vec4 gl_Position;\n"
15006 "};\n"
15007 "void main(){\n"
15008 " gl_Position = vec4(1);\n"
15009 "}\n";
15010 char const *fsSource =
15011 "#version 450\n"
15012 "\n"
15013 "layout(location=0) out vec4 x;\n"
15014 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
15015 "void main(){\n"
15016 " x = vec4(bar.y);\n"
15017 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120015018
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015019 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15020 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120015021
Chris Forbes556c76c2015-08-14 12:04:59 +120015022 VkPipelineObj pipe(m_device);
15023 pipe.AddShader(&vs);
15024 pipe.AddShader(&fs);
15025
15026 /* set up CB 0; type is UNORM by default */
15027 pipe.AddColorAttachment();
15028 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15029
15030 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015031 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120015032
15033 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15034
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015035 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120015036}
15037
Chris Forbes5c59e902016-02-26 16:56:09 +130015038TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015039 TEST_DESCRIPTION(
15040 "Test that an error is produced for a shader consuming push constants "
15041 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015042 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130015043
Tony Barbour1fa09702017-03-16 12:09:08 -060015044 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5c59e902016-02-26 16:56:09 +130015045
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015046 char const *vsSource =
15047 "#version 450\n"
15048 "\n"
15049 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
15050 "out gl_PerVertex {\n"
15051 " vec4 gl_Position;\n"
15052 "};\n"
15053 "void main(){\n"
15054 " gl_Position = vec4(consts.x);\n"
15055 "}\n";
15056 char const *fsSource =
15057 "#version 450\n"
15058 "\n"
15059 "layout(location=0) out vec4 x;\n"
15060 "void main(){\n"
15061 " x = vec4(1);\n"
15062 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130015063
15064 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15065 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15066
15067 VkPipelineObj pipe(m_device);
15068 pipe.AddShader(&vs);
15069 pipe.AddShader(&fs);
15070
15071 /* set up CB 0; type is UNORM by default */
15072 pipe.AddColorAttachment();
15073 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15074
15075 VkDescriptorSetObj descriptorSet(m_device);
15076 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15077
15078 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15079
15080 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015081 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130015082}
15083
Chris Forbes3fb17902016-08-22 14:57:55 +120015084TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015085 TEST_DESCRIPTION(
15086 "Test that an error is produced for a shader consuming an input attachment "
15087 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120015088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15089 "consumes input attachment index 0 but not provided in subpass");
15090
Tony Barbour1fa09702017-03-16 12:09:08 -060015091 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3fb17902016-08-22 14:57:55 +120015092
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015093 char const *vsSource =
15094 "#version 450\n"
15095 "\n"
15096 "out gl_PerVertex {\n"
15097 " vec4 gl_Position;\n"
15098 "};\n"
15099 "void main(){\n"
15100 " gl_Position = vec4(1);\n"
15101 "}\n";
15102 char const *fsSource =
15103 "#version 450\n"
15104 "\n"
15105 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15106 "layout(location=0) out vec4 color;\n"
15107 "void main() {\n"
15108 " color = subpassLoad(x);\n"
15109 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120015110
15111 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15112 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15113
15114 VkPipelineObj pipe(m_device);
15115 pipe.AddShader(&vs);
15116 pipe.AddShader(&fs);
15117 pipe.AddColorAttachment();
15118 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15119
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015120 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15121 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120015122 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015123 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015124 ASSERT_VK_SUCCESS(err);
15125
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015126 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120015127 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015128 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015129 ASSERT_VK_SUCCESS(err);
15130
15131 // error here.
15132 pipe.CreateVKPipeline(pl, renderPass());
15133
15134 m_errorMonitor->VerifyFound();
15135
15136 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15137 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15138}
15139
Chris Forbes5a9a0472016-08-22 16:02:09 +120015140TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015141 TEST_DESCRIPTION(
15142 "Test that an error is produced for a shader consuming an input attachment "
15143 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120015144 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15145 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
15146
Tony Barbour1fa09702017-03-16 12:09:08 -060015147 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5a9a0472016-08-22 16:02:09 +120015148
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015149 char const *vsSource =
15150 "#version 450\n"
15151 "\n"
15152 "out gl_PerVertex {\n"
15153 " vec4 gl_Position;\n"
15154 "};\n"
15155 "void main(){\n"
15156 " gl_Position = vec4(1);\n"
15157 "}\n";
15158 char const *fsSource =
15159 "#version 450\n"
15160 "\n"
15161 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15162 "layout(location=0) out vec4 color;\n"
15163 "void main() {\n"
15164 " color = subpassLoad(x);\n"
15165 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120015166
15167 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15168 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15169
15170 VkPipelineObj pipe(m_device);
15171 pipe.AddShader(&vs);
15172 pipe.AddShader(&fs);
15173 pipe.AddColorAttachment();
15174 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15175
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015176 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15177 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015178 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015179 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015180 ASSERT_VK_SUCCESS(err);
15181
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015182 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015183 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015184 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015185 ASSERT_VK_SUCCESS(err);
15186
15187 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015188 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15189 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15190 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
15191 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15192 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_GENERAL},
Chris Forbes5a9a0472016-08-22 16:02:09 +120015193 };
15194 VkAttachmentReference color = {
15195 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15196 };
15197 VkAttachmentReference input = {
15198 1, VK_IMAGE_LAYOUT_GENERAL,
15199 };
15200
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015201 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015202
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015203 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015204 VkRenderPass rp;
15205 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15206 ASSERT_VK_SUCCESS(err);
15207
15208 // error here.
15209 pipe.CreateVKPipeline(pl, rp);
15210
15211 m_errorMonitor->VerifyFound();
15212
15213 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15214 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15215 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15216}
15217
Chris Forbes541f7b02016-08-22 15:30:27 +120015218TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015219 TEST_DESCRIPTION(
15220 "Test that an error is produced for a shader consuming an input attachment "
15221 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120015222 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070015223 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120015224
Tony Barbour1fa09702017-03-16 12:09:08 -060015225 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes541f7b02016-08-22 15:30:27 +120015226
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015227 char const *vsSource =
15228 "#version 450\n"
15229 "\n"
15230 "out gl_PerVertex {\n"
15231 " vec4 gl_Position;\n"
15232 "};\n"
15233 "void main(){\n"
15234 " gl_Position = vec4(1);\n"
15235 "}\n";
15236 char const *fsSource =
15237 "#version 450\n"
15238 "\n"
15239 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
15240 "layout(location=0) out vec4 color;\n"
15241 "void main() {\n"
15242 " color = subpassLoad(xs[0]);\n"
15243 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120015244
15245 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15246 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15247
15248 VkPipelineObj pipe(m_device);
15249 pipe.AddShader(&vs);
15250 pipe.AddShader(&fs);
15251 pipe.AddColorAttachment();
15252 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15253
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015254 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15255 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120015256 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015257 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015258 ASSERT_VK_SUCCESS(err);
15259
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015260 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120015261 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015262 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015263 ASSERT_VK_SUCCESS(err);
15264
15265 // error here.
15266 pipe.CreateVKPipeline(pl, renderPass());
15267
15268 m_errorMonitor->VerifyFound();
15269
15270 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15271 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15272}
15273
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015274TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015275 TEST_DESCRIPTION(
15276 "Test that an error is produced for a compute pipeline consuming a "
15277 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015278 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015279
Tony Barbour1fa09702017-03-16 12:09:08 -060015280 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015281
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015282 char const *csSource =
15283 "#version 450\n"
15284 "\n"
15285 "layout(local_size_x=1) in;\n"
15286 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15287 "void main(){\n"
15288 " x = vec4(1);\n"
15289 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015290
15291 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15292
15293 VkDescriptorSetObj descriptorSet(m_device);
15294 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15295
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015296 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15297 nullptr,
15298 0,
15299 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15300 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15301 descriptorSet.GetPipelineLayout(),
15302 VK_NULL_HANDLE,
15303 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015304
15305 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015306 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015307
15308 m_errorMonitor->VerifyFound();
15309
15310 if (err == VK_SUCCESS) {
15311 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15312 }
15313}
15314
Chris Forbes22a9b092016-07-19 14:34:05 +120015315TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015316 TEST_DESCRIPTION(
15317 "Test that an error is produced for a pipeline consuming a "
15318 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015319 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15320 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120015321
Tony Barbour1fa09702017-03-16 12:09:08 -060015322 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes22a9b092016-07-19 14:34:05 +120015323
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015324 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
15325 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120015326 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015327 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015328 ASSERT_VK_SUCCESS(err);
15329
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015330 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120015331 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015332 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015333 ASSERT_VK_SUCCESS(err);
15334
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015335 char const *csSource =
15336 "#version 450\n"
15337 "\n"
15338 "layout(local_size_x=1) in;\n"
15339 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15340 "void main() {\n"
15341 " x.x = 1.0f;\n"
15342 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120015343 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15344
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015345 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15346 nullptr,
15347 0,
15348 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15349 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15350 pl,
15351 VK_NULL_HANDLE,
15352 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120015353
15354 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015355 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120015356
15357 m_errorMonitor->VerifyFound();
15358
15359 if (err == VK_SUCCESS) {
15360 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15361 }
15362
15363 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15364 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15365}
15366
Chris Forbes50020592016-07-27 13:52:41 +120015367TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015368 TEST_DESCRIPTION(
15369 "Test that an error is produced when an image view type "
15370 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120015371
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015372 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires an image view of type VK_IMAGE_VIEW_TYPE_3D");
Chris Forbes50020592016-07-27 13:52:41 +120015373
Tony Barbour1fa09702017-03-16 12:09:08 -060015374 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes50020592016-07-27 13:52:41 +120015375 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15376
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015377 char const *vsSource =
15378 "#version 450\n"
15379 "\n"
15380 "out gl_PerVertex { vec4 gl_Position; };\n"
15381 "void main() { gl_Position = vec4(0); }\n";
15382 char const *fsSource =
15383 "#version 450\n"
15384 "\n"
15385 "layout(set=0, binding=0) uniform sampler3D s;\n"
15386 "layout(location=0) out vec4 color;\n"
15387 "void main() {\n"
15388 " color = texture(s, vec3(0));\n"
15389 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120015390 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15391 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15392
15393 VkPipelineObj pipe(m_device);
15394 pipe.AddShader(&vs);
15395 pipe.AddShader(&fs);
15396 pipe.AddColorAttachment();
15397
15398 VkTextureObj texture(m_device, nullptr);
15399 VkSamplerObj sampler(m_device);
15400
15401 VkDescriptorSetObj descriptorSet(m_device);
15402 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15403 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15404
15405 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15406 ASSERT_VK_SUCCESS(err);
15407
Tony Barbour552f6c02016-12-21 14:34:07 -070015408 m_commandBuffer->BeginCommandBuffer();
15409 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120015410
15411 m_commandBuffer->BindPipeline(pipe);
15412 m_commandBuffer->BindDescriptorSet(descriptorSet);
15413
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015414 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120015415 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015416 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120015417 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15418
15419 // error produced here.
15420 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15421
15422 m_errorMonitor->VerifyFound();
15423
Tony Barbour552f6c02016-12-21 14:34:07 -070015424 m_commandBuffer->EndRenderPass();
15425 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120015426}
15427
Chris Forbes5533bfc2016-07-27 14:12:34 +120015428TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015429 TEST_DESCRIPTION(
15430 "Test that an error is produced when a multisampled images "
15431 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015432
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015434
Tony Barbour1fa09702017-03-16 12:09:08 -060015435 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5533bfc2016-07-27 14:12:34 +120015436 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15437
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015438 char const *vsSource =
15439 "#version 450\n"
15440 "\n"
15441 "out gl_PerVertex { vec4 gl_Position; };\n"
15442 "void main() { gl_Position = vec4(0); }\n";
15443 char const *fsSource =
15444 "#version 450\n"
15445 "\n"
15446 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
15447 "layout(location=0) out vec4 color;\n"
15448 "void main() {\n"
15449 " color = texelFetch(s, ivec2(0), 0);\n"
15450 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120015451 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15452 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15453
15454 VkPipelineObj pipe(m_device);
15455 pipe.AddShader(&vs);
15456 pipe.AddShader(&fs);
15457 pipe.AddColorAttachment();
15458
15459 VkTextureObj texture(m_device, nullptr);
15460 VkSamplerObj sampler(m_device);
15461
15462 VkDescriptorSetObj descriptorSet(m_device);
15463 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15464 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15465
15466 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15467 ASSERT_VK_SUCCESS(err);
15468
Tony Barbour552f6c02016-12-21 14:34:07 -070015469 m_commandBuffer->BeginCommandBuffer();
15470 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120015471
15472 m_commandBuffer->BindPipeline(pipe);
15473 m_commandBuffer->BindDescriptorSet(descriptorSet);
15474
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015475 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015476 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015477 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015478 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15479
15480 // error produced here.
15481 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15482
15483 m_errorMonitor->VerifyFound();
15484
Tony Barbour552f6c02016-12-21 14:34:07 -070015485 m_commandBuffer->EndRenderPass();
15486 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120015487}
15488
Mark Youngc48c4c12016-04-11 14:26:49 -060015489TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015490 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015491
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015492 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15493 {
15494 VkFormatProperties properties;
15495 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15496 if (properties.optimalTilingFeatures == 0) {
15497 printf(" Image format not supported; skipped.\n");
15498 return;
15499 }
15500 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015501
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015502 VkImageCreateInfo info = {};
15503 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15504 info.pNext = NULL;
15505 info.imageType = VK_IMAGE_TYPE_2D;
15506 info.format = format;
15507 info.extent.height = 32;
15508 info.extent.depth = 1;
15509 info.mipLevels = 1;
15510 info.arrayLayers = 1;
15511 info.samples = VK_SAMPLE_COUNT_1_BIT;
15512 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15513 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15514 info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015515
15516 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015517 {
15518 VkImageFormatProperties properties;
15519 auto const result = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), info.format, info.imageType,
15520 info.tiling, info.usage, info.flags, &properties);
15521 ASSERT_VK_SUCCESS(result);
15522 info.extent.width = properties.maxExtent.width + 1;
15523 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015524
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015525 VkImage image;
15526 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
15527 vkCreateImage(m_device->device(), &info, NULL, &image);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015528 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015529}
15530
Mark Youngc48c4c12016-04-11 14:26:49 -060015531TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015532 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc48c4c12016-04-11 14:26:49 -060015533
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015534 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15535 {
15536 VkFormatProperties properties;
15537 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15538 if (properties.optimalTilingFeatures == 0) {
15539 printf(" Image format not supported; skipped.\n");
15540 return;
15541 }
15542 }
Mark Youngc48c4c12016-04-11 14:26:49 -060015543
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015544 VkImageCreateInfo info = {};
15545 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15546 info.pNext = NULL;
15547 info.imageType = VK_IMAGE_TYPE_2D;
15548 info.format = format;
15549 info.extent.height = 32;
15550 info.extent.depth = 1;
15551 info.mipLevels = 1;
15552 info.arrayLayers = 1;
15553 info.samples = VK_SAMPLE_COUNT_1_BIT;
15554 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15555 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15556 info.flags = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015557
15558 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015559 info.extent.width = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015560
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015561 VkImage image;
15562 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00716);
15563 m_errorMonitor->SetUnexpectedError("parameter pCreateInfo->extent.width must be greater than 0");
15564 vkCreateImage(m_device->device(), &info, NULL, &image);
Mark Youngc48c4c12016-04-11 14:26:49 -060015565 m_errorMonitor->VerifyFound();
15566}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070015567
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015568TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015569 TEST_DESCRIPTION(
15570 "Create a render pass with an attachment description "
15571 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015572
Tony Barbour1fa09702017-03-16 12:09:08 -060015573 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015574 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15575
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070015576 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015577
15578 VkAttachmentReference color_attach = {};
15579 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
15580 color_attach.attachment = 0;
15581 VkSubpassDescription subpass = {};
15582 subpass.colorAttachmentCount = 1;
15583 subpass.pColorAttachments = &color_attach;
15584
15585 VkRenderPassCreateInfo rpci = {};
15586 rpci.subpassCount = 1;
15587 rpci.pSubpasses = &subpass;
15588 rpci.attachmentCount = 1;
15589 VkAttachmentDescription attach_desc = {};
15590 attach_desc.format = VK_FORMAT_UNDEFINED;
15591 rpci.pAttachments = &attach_desc;
15592 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
15593 VkRenderPass rp;
15594 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
15595
15596 m_errorMonitor->VerifyFound();
15597
15598 if (result == VK_SUCCESS) {
15599 vkDestroyRenderPass(m_device->device(), rp, NULL);
15600 }
15601}
15602
Karl Schultz6addd812016-02-02 17:17:23 -070015603TEST_F(VkLayerTest, InvalidImageView) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015604 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehliscde08892015-09-22 10:11:37 -060015605
Mike Stroyana3082432015-09-25 13:39:21 -060015606 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070015607 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15608 const int32_t tex_width = 32;
15609 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060015610
15611 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015612 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15613 image_create_info.pNext = NULL;
15614 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15615 image_create_info.format = tex_format;
15616 image_create_info.extent.width = tex_width;
15617 image_create_info.extent.height = tex_height;
15618 image_create_info.extent.depth = 1;
15619 image_create_info.mipLevels = 1;
15620 image_create_info.arrayLayers = 1;
15621 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15622 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15623 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15624 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060015625
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015626 VkImage image;
15627 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060015628 ASSERT_VK_SUCCESS(err);
15629
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015630 VkMemoryRequirements requirements;
15631 vkGetImageMemoryRequirements(m_device->device(), image, &requirements);
15632
15633 VkMemoryAllocateInfo alloc_info{};
15634 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15635 alloc_info.pNext = NULL;
15636 alloc_info.memoryTypeIndex = 0;
15637 alloc_info.allocationSize = requirements.size;
15638 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
15639 ASSERT_TRUE(pass);
15640
15641 VkDeviceMemory memory;
15642 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
15643 ASSERT_VK_SUCCESS(err);
15644
15645 err = vkBindImageMemory(m_device->device(), image, memory, 0);
15646
Tobin Ehliscde08892015-09-22 10:11:37 -060015647 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015648 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015649 image_view_create_info.image = image;
15650 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15651 image_view_create_info.format = tex_format;
15652 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015653 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070015654 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015655 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015656
15657 VkImageView view;
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015658 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015659 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015660 m_errorMonitor->VerifyFound();
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015661
15662 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060015663 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015664}
Mike Stroyana3082432015-09-25 13:39:21 -060015665
Mark Youngd339ba32016-05-30 13:28:35 -060015666TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15667 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060015668 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060015669 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060015670
Tony Barbour1fa09702017-03-16 12:09:08 -060015671 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -060015672
15673 // Create an image and try to create a view with no memory backing the image
15674 VkImage image;
15675
15676 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15677 const int32_t tex_width = 32;
15678 const int32_t tex_height = 32;
15679
15680 VkImageCreateInfo image_create_info = {};
15681 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15682 image_create_info.pNext = NULL;
15683 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15684 image_create_info.format = tex_format;
15685 image_create_info.extent.width = tex_width;
15686 image_create_info.extent.height = tex_height;
15687 image_create_info.extent.depth = 1;
15688 image_create_info.mipLevels = 1;
15689 image_create_info.arrayLayers = 1;
15690 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15691 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15692 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15693 image_create_info.flags = 0;
15694
15695 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15696 ASSERT_VK_SUCCESS(err);
15697
15698 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015699 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060015700 image_view_create_info.image = image;
15701 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15702 image_view_create_info.format = tex_format;
15703 image_view_create_info.subresourceRange.layerCount = 1;
15704 image_view_create_info.subresourceRange.baseMipLevel = 0;
15705 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015706 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060015707
15708 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015709 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060015710
15711 m_errorMonitor->VerifyFound();
15712 vkDestroyImage(m_device->device(), image, NULL);
15713 // If last error is success, it still created the view, so delete it.
15714 if (err == VK_SUCCESS) {
15715 vkDestroyImageView(m_device->device(), view, NULL);
15716 }
Mark Youngd339ba32016-05-30 13:28:35 -060015717}
15718
Karl Schultz6addd812016-02-02 17:17:23 -070015719TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015720 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015721 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015722
Tony Barbour1fa09702017-03-16 12:09:08 -060015723 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015724
Karl Schultz6addd812016-02-02 17:17:23 -070015725 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015726 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015727 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015728 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015729
15730 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015731 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015732 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015733 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15734 image_view_create_info.format = tex_format;
15735 image_view_create_info.subresourceRange.baseMipLevel = 0;
15736 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015737 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015738 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015739 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015740
15741 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015742 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015743
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015744 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015745}
15746
Mike Weiblena1e13f42017-02-09 21:25:59 -070015747TEST_F(VkLayerTest, ExerciseGetImageSubresourceLayout) {
15748 TEST_DESCRIPTION("Test vkGetImageSubresourceLayout() valid usages");
15749
Tony Barbour1fa09702017-03-16 12:09:08 -060015750 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblena1e13f42017-02-09 21:25:59 -070015751 VkSubresourceLayout subres_layout = {};
15752
15753 // VU 00732: image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR
15754 {
15755 const VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL; // ERROR: violates VU 00732
15756 VkImageObj img(m_device);
15757 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, tiling);
15758 ASSERT_TRUE(img.initialized());
15759
15760 VkImageSubresource subres = {};
15761 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15762 subres.mipLevel = 0;
15763 subres.arrayLayer = 0;
15764
15765 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00732);
15766 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15767 m_errorMonitor->VerifyFound();
15768 }
15769
15770 // VU 00733: The aspectMask member of pSubresource must only have a single bit set
15771 {
15772 VkImageObj img(m_device);
15773 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15774 ASSERT_TRUE(img.initialized());
15775
15776 VkImageSubresource subres = {};
15777 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT; // ERROR: triggers VU 00733
15778 subres.mipLevel = 0;
15779 subres.arrayLayer = 0;
15780
15781 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00733);
15782 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
15783 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15784 m_errorMonitor->VerifyFound();
15785 }
15786
15787 // 00739 mipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created
15788 {
15789 VkImageObj img(m_device);
15790 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15791 ASSERT_TRUE(img.initialized());
15792
15793 VkImageSubresource subres = {};
15794 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15795 subres.mipLevel = 1; // ERROR: triggers VU 00739
15796 subres.arrayLayer = 0;
15797
15798 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00739);
15799 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15800 m_errorMonitor->VerifyFound();
15801 }
15802
15803 // 00740 arrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when the image was created
15804 {
15805 VkImageObj img(m_device);
15806 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15807 ASSERT_TRUE(img.initialized());
15808
15809 VkImageSubresource subres = {};
15810 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15811 subres.mipLevel = 0;
15812 subres.arrayLayer = 1; // ERROR: triggers VU 00740
15813
15814 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00740);
15815 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15816 m_errorMonitor->VerifyFound();
15817 }
15818}
15819
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015820TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070015821 VkResult err;
15822 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015823
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015824 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015825
Tony Barbour1fa09702017-03-16 12:09:08 -060015826 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060015827
15828 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015829 VkImage srcImage;
15830 VkImage dstImage;
15831 VkDeviceMemory srcMem;
15832 VkDeviceMemory destMem;
15833 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015834
15835 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015836 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15837 image_create_info.pNext = NULL;
15838 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15839 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15840 image_create_info.extent.width = 32;
15841 image_create_info.extent.height = 32;
15842 image_create_info.extent.depth = 1;
15843 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015844 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070015845 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15846 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15847 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15848 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015849
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015850 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015851 ASSERT_VK_SUCCESS(err);
15852
Mark Lobodzinski867787a2016-10-14 11:49:55 -060015853 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015854 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015855 ASSERT_VK_SUCCESS(err);
15856
15857 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015858 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015859 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15860 memAlloc.pNext = NULL;
15861 memAlloc.allocationSize = 0;
15862 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015863
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015864 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015865 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015866 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015867 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015868 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015869 ASSERT_VK_SUCCESS(err);
15870
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015871 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015872 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015873 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015874 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015875 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015876 ASSERT_VK_SUCCESS(err);
15877
15878 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15879 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015880 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015881 ASSERT_VK_SUCCESS(err);
15882
Tony Barbour552f6c02016-12-21 14:34:07 -070015883 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015884 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015885 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015886 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015887 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015888 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015889 copyRegion.srcOffset.x = 0;
15890 copyRegion.srcOffset.y = 0;
15891 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015892 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015893 copyRegion.dstSubresource.mipLevel = 0;
15894 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015895 // Introduce failure by forcing the dst layerCount to differ from src
15896 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015897 copyRegion.dstOffset.x = 0;
15898 copyRegion.dstOffset.y = 0;
15899 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015900 copyRegion.extent.width = 1;
15901 copyRegion.extent.height = 1;
15902 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015903 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015904 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015905
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015906 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015907
Chia-I Wuf7458c52015-10-26 21:10:41 +080015908 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015909 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015910 vkFreeMemory(m_device->device(), srcMem, NULL);
15911 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015912}
15913
Tony Barbourd6673642016-05-05 14:46:39 -060015914TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060015915 TEST_DESCRIPTION("Creating images with unsuported formats ");
15916
Tony Barbour1fa09702017-03-16 12:09:08 -060015917 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060015918 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourd6673642016-05-05 14:46:39 -060015919
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015920 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130015921 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015922 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015923 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15924 image_create_info.format = VK_FORMAT_UNDEFINED;
15925 image_create_info.extent.width = 32;
15926 image_create_info.extent.height = 32;
15927 image_create_info.extent.depth = 1;
15928 image_create_info.mipLevels = 1;
15929 image_create_info.arrayLayers = 1;
15930 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15931 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15932 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015933
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015934 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15935 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015936
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015937 VkImage image;
15938 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015939 m_errorMonitor->VerifyFound();
15940
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015941 // Look for a format that is COMPLETELY unsupported with this hardware
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015942 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Tony Barbourd6673642016-05-05 14:46:39 -060015943 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
15944 VkFormat format = static_cast<VkFormat>(f);
15945 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015946 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060015947 unsupported = format;
15948 break;
15949 }
15950 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015951
Tony Barbourd6673642016-05-05 14:46:39 -060015952 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060015953 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015954 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060015955
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015956 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Tony Barbourd6673642016-05-05 14:46:39 -060015957 m_errorMonitor->VerifyFound();
15958 }
15959}
15960
15961TEST_F(VkLayerTest, ImageLayerViewTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060015962 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
15963
Tony Barbour1fa09702017-03-16 12:09:08 -060015964 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070015965 auto depth_format = find_depth_stencil_format(m_device);
15966 if (!depth_format) {
15967 return;
15968 }
Tony Barbourd6673642016-05-05 14:46:39 -060015969
15970 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015971 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Tony Barbourd6673642016-05-05 14:46:39 -060015972 VK_IMAGE_TILING_OPTIMAL, 0);
15973 ASSERT_TRUE(image.initialized());
15974
15975 VkImageView imgView;
15976 VkImageViewCreateInfo imgViewInfo = {};
15977 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
15978 imgViewInfo.image = image.handle();
15979 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
15980 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15981 imgViewInfo.subresourceRange.layerCount = 1;
15982 imgViewInfo.subresourceRange.baseMipLevel = 0;
15983 imgViewInfo.subresourceRange.levelCount = 1;
15984 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15985
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015986 // View can't have baseMipLevel >= image's mipLevels - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060015987 imgViewInfo.subresourceRange.baseMipLevel = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015988 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060015989 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15990 m_errorMonitor->VerifyFound();
15991 imgViewInfo.subresourceRange.baseMipLevel = 0;
15992
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015993 // View can't have baseArrayLayer >= image's arraySize - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060015994 imgViewInfo.subresourceRange.baseArrayLayer = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015995 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060015996 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15997 m_errorMonitor->VerifyFound();
15998 imgViewInfo.subresourceRange.baseArrayLayer = 0;
15999
Tony Barbourd6673642016-05-05 14:46:39 -060016000 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
16001 imgViewInfo.subresourceRange.levelCount = 0;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016002 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016003 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16004 m_errorMonitor->VerifyFound();
16005 imgViewInfo.subresourceRange.levelCount = 1;
16006
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016007 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
16008 imgViewInfo.subresourceRange.layerCount = 0;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016009 m_errorMonitor->SetDesiredFailureMsg(
16010 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16011 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060016012 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16013 m_errorMonitor->VerifyFound();
16014 imgViewInfo.subresourceRange.layerCount = 1;
16015
Tony Barbourd6673642016-05-05 14:46:39 -060016016 // Can't use depth format for view into color image - Expect INVALID_FORMAT
Tony Barbourf887b162017-03-09 10:06:46 -070016017 imgViewInfo.format = depth_format;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016018 m_errorMonitor->SetDesiredFailureMsg(
16019 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16020 "Formats MUST be IDENTICAL unless VK_IMAGE_CREATE_MUTABLE_FORMAT BIT was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060016021 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16022 m_errorMonitor->VerifyFound();
16023 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16024
Tony Barbourd6673642016-05-05 14:46:39 -060016025 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
16026 // VIEW_CREATE_ERROR
16027 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016028 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060016029 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16030 m_errorMonitor->VerifyFound();
16031 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16032
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016033 // TODO: Update framework to easily passing mutable flag into ImageObj init
16034 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070016035 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
16036 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16037 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060016038 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
16039 // VIEW_CREATE_ERROR
16040 VkImageCreateInfo mutImgInfo = image.create_info();
16041 VkImage mutImage;
16042 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016043 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060016044 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
16045 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016046 VkResult ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
Tony Barbourd6673642016-05-05 14:46:39 -060016047 ASSERT_VK_SUCCESS(ret);
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016048
16049 VkMemoryRequirements requirements;
16050 vkGetImageMemoryRequirements(m_device->device(), mutImage, &requirements);
16051
16052 VkMemoryAllocateInfo alloc_info{};
16053 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16054 alloc_info.pNext = NULL;
16055 alloc_info.memoryTypeIndex = 0;
16056 alloc_info.allocationSize = requirements.size;
16057 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16058 ASSERT_TRUE(pass);
16059
16060 VkDeviceMemory memory;
16061 ret = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16062 ASSERT_VK_SUCCESS(ret);
16063
16064 ret = vkBindImageMemory(m_device->device(), mutImage, memory, 0);
16065 ASSERT_VK_SUCCESS(ret);
16066
Tony Barbourd6673642016-05-05 14:46:39 -060016067 imgViewInfo.image = mutImage;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016068 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tony Barbourd6673642016-05-05 14:46:39 -060016069 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16070 m_errorMonitor->VerifyFound();
16071 imgViewInfo.image = image.handle();
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016072
16073 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourd6673642016-05-05 14:46:39 -060016074 vkDestroyImage(m_device->handle(), mutImage, NULL);
16075}
16076
Dave Houlton75967fc2017-03-06 17:21:16 -070016077TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
16078 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
16079
Tony Barbour1fa09702017-03-16 12:09:08 -060016080 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton75967fc2017-03-06 17:21:16 -070016081
Jamie Madill35127872017-03-15 16:17:46 -040016082 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton75967fc2017-03-06 17:21:16 -070016083 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
16084 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
16085 if (device_features.textureCompressionBC) {
16086 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
16087 } else if (device_features.textureCompressionETC2) {
16088 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
16089 } else if (device_features.textureCompressionASTC_LDR) {
16090 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
16091 } else {
16092 printf(" No compressed formats supported - CompressedImageMipCopyTests skipped.\n");
16093 return;
16094 }
16095
16096 VkImageCreateInfo ci;
16097 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16098 ci.pNext = NULL;
16099 ci.flags = 0;
16100 ci.imageType = VK_IMAGE_TYPE_2D;
16101 ci.format = compressed_format;
16102 ci.extent = {32, 32, 1};
16103 ci.mipLevels = 6;
16104 ci.arrayLayers = 1;
16105 ci.samples = VK_SAMPLE_COUNT_1_BIT;
16106 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
16107 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16108 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16109 ci.queueFamilyIndexCount = 0;
16110 ci.pQueueFamilyIndices = NULL;
16111 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16112
16113 VkImageObj image(m_device);
16114 image.init(&ci);
16115 ASSERT_TRUE(image.initialized());
16116
16117 VkImageObj odd_image(m_device);
16118 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
16119 odd_image.init(&ci);
16120 ASSERT_TRUE(odd_image.initialized());
16121
16122 // Allocate buffers
16123 VkMemoryPropertyFlags reqs = 0;
16124 vk_testing::Buffer buffer_1024, buffer_64, buffer_16, buffer_8;
16125 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
16126 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
16127 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
16128 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
16129
16130 VkBufferImageCopy region = {};
16131 region.bufferRowLength = 0;
16132 region.bufferImageHeight = 0;
16133 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16134 region.imageSubresource.layerCount = 1;
16135 region.imageOffset = {0, 0, 0};
16136 region.bufferOffset = 0;
16137
16138 // start recording
16139 m_commandBuffer->BeginCommandBuffer();
16140
16141 // Mip level copies that work - 5 levels
16142 m_errorMonitor->ExpectSuccess();
16143
16144 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
16145 region.imageExtent = {32, 32, 1};
16146 region.imageSubresource.mipLevel = 0;
16147 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1,
16148 &region);
16149 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16150 &region);
16151
16152 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
16153 region.imageExtent = {8, 8, 1};
16154 region.imageSubresource.mipLevel = 2;
16155 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1,
16156 &region);
16157 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16158 &region);
16159
16160 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
16161 region.imageExtent = {4, 4, 1};
16162 region.imageSubresource.mipLevel = 3;
16163 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16164 &region);
16165 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16166 &region);
16167
16168 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
16169 region.imageExtent = {2, 2, 1};
16170 region.imageSubresource.mipLevel = 4;
16171 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16172 &region);
16173 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16174 &region);
16175
16176 region.imageExtent = {1, 1, 1};
16177 region.imageSubresource.mipLevel = 5;
16178 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16179 &region);
16180 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16181 &region);
16182 m_errorMonitor->VerifyNotFound();
16183
16184 // Buffer must accomodate a full compressed block, regardless of texel count
16185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16186 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1,
16187 &region);
16188 m_errorMonitor->VerifyFound();
16189 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227);
16190 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16191 &region);
16192 m_errorMonitor->VerifyFound();
16193
16194 // Copy width < compressed block size, but not the full mip width
16195 region.imageExtent = {1, 2, 1};
16196 region.imageSubresource.mipLevel = 4;
16197 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16198 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16199 &region);
16200 m_errorMonitor->VerifyFound();
16201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16202 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16203 &region);
16204 m_errorMonitor->VerifyFound();
16205
16206 // Copy height < compressed block size but not the full mip height
16207 region.imageExtent = {2, 1, 1};
16208 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16209 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16210 &region);
16211 m_errorMonitor->VerifyFound();
16212 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16213 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16214 &region);
16215 m_errorMonitor->VerifyFound();
16216
16217 // Offsets must be multiple of compressed block size
16218 region.imageOffset = {1, 1, 0};
16219 region.imageExtent = {1, 1, 1};
16220 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16221 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16222 &region);
16223 m_errorMonitor->VerifyFound();
16224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16225 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16226 &region);
16227 m_errorMonitor->VerifyFound();
16228
16229 // Offset + extent width = mip width - should succeed
16230 region.imageOffset = {4, 4, 0};
16231 region.imageExtent = {3, 4, 1};
16232 region.imageSubresource.mipLevel = 2;
16233 m_errorMonitor->ExpectSuccess();
16234 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16235 &region);
16236 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16237 &region);
16238 m_errorMonitor->VerifyNotFound();
16239
16240 // Offset + extent width > mip width, but still within the final compressed block - should succeed
16241 region.imageExtent = {4, 4, 1};
16242 m_errorMonitor->ExpectSuccess();
16243 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16244 &region);
16245 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16246 &region);
16247 m_errorMonitor->VerifyNotFound();
16248
16249 // Offset + extent width < mip width and not a multiple of block width - should fail
16250 region.imageExtent = {3, 3, 1};
16251 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16252 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16253 &region);
16254 m_errorMonitor->VerifyFound();
16255 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16256 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16257 &region);
16258 m_errorMonitor->VerifyFound();
16259}
16260
Dave Houlton59a20702017-02-02 17:26:23 -070016261TEST_F(VkLayerTest, ImageBufferCopyTests) {
16262 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
16263
Tony Barbour1fa09702017-03-16 12:09:08 -060016264 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070016265 VkFormatProperties format_props = m_device->format_properties(VK_FORMAT_D24_UNORM_S8_UINT);
16266 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
16267 printf(" VK_FORMAT_D24_UNORM_S8_UINT not supported. Skipped.\n");
16268 return;
16269 }
Dave Houlton584d51e2017-02-16 12:52:54 -070016270
16271 // Bail if any dimension of transfer granularity is 0.
16272 auto index = m_device->graphics_queue_node_index_;
16273 auto queue_family_properties = m_device->phy().queue_properties();
16274 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
16275 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
16276 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
16277 printf(" Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n");
16278 return;
16279 }
16280
Dave Houlton59a20702017-02-02 17:26:23 -070016281 VkImageObj image_64k(m_device); // 128^2 texels, 64k
16282 VkImageObj image_16k(m_device); // 64^2 texels, 16k
16283 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
Dave Houltonf3229d52017-02-21 15:59:08 -070016284 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
16285 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
16286 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
16287 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
16288
Dave Houlton59a20702017-02-02 17:26:23 -070016289 image_64k.init(128, 128, VK_FORMAT_R8G8B8A8_UINT,
16290 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16291 VK_IMAGE_TILING_OPTIMAL, 0);
16292 image_16k.init(64, 64, VK_FORMAT_R8G8B8A8_UINT,
16293 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16294 VK_IMAGE_TILING_OPTIMAL, 0);
16295 image_16k_depth.init(64, 64, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16296 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton59a20702017-02-02 17:26:23 -070016297 ASSERT_TRUE(image_64k.initialized());
16298 ASSERT_TRUE(image_16k.initialized());
16299 ASSERT_TRUE(image_16k_depth.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016300
Dave Houltonf3229d52017-02-21 15:59:08 -070016301 // Verify all needed Depth/Stencil formats are supported
16302 bool missing_ds_support = false;
16303 VkFormatProperties props = {0, 0, 0};
16304 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
16305 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16306 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
16307 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16308 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
16309 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16310 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
16311 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16312
16313 if (!missing_ds_support) {
16314 ds_image_4D_1S.init(
16315 256, 256, VK_FORMAT_D32_SFLOAT_S8_UINT,
16316 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16317 VK_IMAGE_TILING_OPTIMAL, 0);
16318 ASSERT_TRUE(ds_image_4D_1S.initialized());
16319
16320 ds_image_3D_1S.init(
16321 256, 256, VK_FORMAT_D24_UNORM_S8_UINT,
16322 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16323 VK_IMAGE_TILING_OPTIMAL, 0);
16324 ASSERT_TRUE(ds_image_3D_1S.initialized());
16325
16326 ds_image_2D.init(
16327 256, 256, VK_FORMAT_D16_UNORM,
16328 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16329 VK_IMAGE_TILING_OPTIMAL, 0);
16330 ASSERT_TRUE(ds_image_2D.initialized());
16331
16332 ds_image_1S.init(
16333 256, 256, VK_FORMAT_S8_UINT,
16334 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16335 VK_IMAGE_TILING_OPTIMAL, 0);
16336 ASSERT_TRUE(ds_image_1S.initialized());
16337 }
16338
16339 // Allocate buffers
16340 vk_testing::Buffer buffer_256k, buffer_128k, buffer_64k, buffer_16k;
Dave Houlton59a20702017-02-02 17:26:23 -070016341 VkMemoryPropertyFlags reqs = 0;
Dave Houltonf3229d52017-02-21 15:59:08 -070016342 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
16343 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
16344 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
16345 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
Dave Houlton59a20702017-02-02 17:26:23 -070016346
16347 VkBufferImageCopy region = {};
16348 region.bufferRowLength = 0;
16349 region.bufferImageHeight = 0;
16350 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16351 region.imageSubresource.layerCount = 1;
16352 region.imageOffset = {0, 0, 0};
16353 region.imageExtent = {64, 64, 1};
16354 region.bufferOffset = 0;
16355
16356 // attempt copies before putting command buffer in recording state
16357 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01240);
16358 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16359 &region);
16360 m_errorMonitor->VerifyFound();
16361
16362 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01258);
16363 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16364 &region);
16365 m_errorMonitor->VerifyFound();
16366
16367 // start recording
16368 m_commandBuffer->BeginCommandBuffer();
16369
16370 // successful copies
16371 m_errorMonitor->ExpectSuccess();
16372 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16373 &region);
16374 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16375 &region);
16376 region.imageOffset.x = 16; // 16k copy, offset requires larger image
16377 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16378 &region);
16379 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
16380 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16381 &region);
16382 region.imageOffset.x = 0;
16383 region.imageExtent.height = 64;
16384 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
16385 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16386 &region);
16387 m_errorMonitor->VerifyNotFound();
16388
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016389 // image/buffer too small (extent too large) on copy to image
Dave Houlton59a20702017-02-02 17:26:23 -070016390 region.imageExtent = {65, 64, 1};
16391 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16392 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16393 &region);
16394 m_errorMonitor->VerifyFound();
16395
16396 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16397 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16398 &region);
16399 m_errorMonitor->VerifyFound();
16400
16401 // image/buffer too small (offset) on copy to image
16402 region.imageExtent = {64, 64, 1};
16403 region.imageOffset = {0, 4, 0};
16404 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16405 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16406 &region);
16407 m_errorMonitor->VerifyFound();
16408
16409 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16410 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16411 &region);
16412 m_errorMonitor->VerifyFound();
16413
16414 // image/buffer too small on copy to buffer
16415 region.imageExtent = {64, 64, 1};
16416 region.imageOffset = {0, 0, 0};
Mark Lobodzinski80871462017-02-16 10:37:27 -070016417 region.bufferOffset = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016418 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246); // buffer too small
16419 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16420 &region);
16421 m_errorMonitor->VerifyFound();
16422
16423 region.imageExtent = {64, 65, 1};
16424 region.bufferOffset = 0;
16425 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01245); // image too small
16426 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16427 &region);
16428 m_errorMonitor->VerifyFound();
16429
16430 // buffer size ok but rowlength causes loose packing
16431 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16432 region.imageExtent = {64, 64, 1};
16433 region.bufferRowLength = 68;
16434 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16435 &region);
16436 m_errorMonitor->VerifyFound();
16437
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016438 // An extent with zero area should produce a warning, but no error
16439 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT, "} has zero area");
16440 region.imageExtent.width = 0;
16441 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16442 &region);
16443 m_errorMonitor->VerifyFound();
16444
Dave Houlton59a20702017-02-02 17:26:23 -070016445 // aspect bits
16446 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01280); // more than 1 aspect bit set
16447 region.imageExtent = {64, 64, 1};
16448 region.bufferRowLength = 0;
16449 region.bufferImageHeight = 0;
16450 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16451 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16452 buffer_16k.handle(), 1, &region);
16453 m_errorMonitor->VerifyFound();
16454
16455 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // mis-matched aspect
16456 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16457 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16458 &region);
16459 m_errorMonitor->VerifyFound();
16460
16461 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // different mis-matched aspect
16462 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16463 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16464 buffer_16k.handle(), 1, &region);
16465 m_errorMonitor->VerifyFound();
16466
Dave Houltonf3229d52017-02-21 15:59:08 -070016467 // Test Depth/Stencil copies
16468 if (missing_ds_support) {
16469 printf(" Depth / Stencil formats unsupported - skipping D/S tests.\n");
16470 } else {
16471 VkBufferImageCopy ds_region = {};
16472 ds_region.bufferOffset = 0;
16473 ds_region.bufferRowLength = 0;
16474 ds_region.bufferImageHeight = 0;
16475 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16476 ds_region.imageSubresource.mipLevel = 0;
16477 ds_region.imageSubresource.baseArrayLayer = 0;
16478 ds_region.imageSubresource.layerCount = 1;
16479 ds_region.imageOffset = {0, 0, 0};
16480 ds_region.imageExtent = {256, 256, 1};
16481
16482 // Depth copies that should succeed
16483 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
16484 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16485 buffer_256k.handle(), 1, &ds_region);
16486 m_errorMonitor->VerifyNotFound();
16487
16488 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
16489 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16490 buffer_256k.handle(), 1, &ds_region);
16491 m_errorMonitor->VerifyNotFound();
16492
16493 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
16494 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16495 buffer_128k.handle(), 1, &ds_region);
16496 m_errorMonitor->VerifyNotFound();
16497
16498 // Depth copies that should fail
16499 ds_region.bufferOffset = 4;
16500 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16501 VALIDATION_ERROR_01246); // Extract 4b depth per texel, pack into 256k buffer
16502 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16503 buffer_256k.handle(), 1, &ds_region);
16504 m_errorMonitor->VerifyFound();
16505
16506 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16507 VALIDATION_ERROR_01246); // Extract 3b depth per texel, pack (loose) into 256k buffer
16508 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16509 buffer_256k.handle(), 1, &ds_region);
16510 m_errorMonitor->VerifyFound();
16511
16512 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16513 VALIDATION_ERROR_01246); // Copy 2b depth per texel, into 128k buffer
16514 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16515 buffer_128k.handle(), 1, &ds_region);
16516 m_errorMonitor->VerifyFound();
16517
16518 // Stencil copies that should succeed
16519 ds_region.bufferOffset = 0;
16520 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
16521 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16522 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16523 buffer_64k.handle(), 1, &ds_region);
16524 m_errorMonitor->VerifyNotFound();
16525
16526 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16527 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16528 buffer_64k.handle(), 1, &ds_region);
16529 m_errorMonitor->VerifyNotFound();
16530
16531 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
16532 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16533 buffer_64k.handle(), 1, &ds_region);
16534 m_errorMonitor->VerifyNotFound();
16535
16536 // Stencil copies that should fail
16537 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16538 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16539 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16540 buffer_16k.handle(), 1, &ds_region);
16541 m_errorMonitor->VerifyFound();
16542
16543 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16544 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16545 ds_region.bufferRowLength = 260;
16546 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16547 buffer_64k.handle(), 1, &ds_region);
16548 m_errorMonitor->VerifyFound();
16549
16550 ds_region.bufferRowLength = 0;
16551 ds_region.bufferOffset = 4;
16552 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16553 VALIDATION_ERROR_01246); // Copy 1b depth per texel, into 64k buffer
16554 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16555 buffer_64k.handle(), 1, &ds_region);
16556 m_errorMonitor->VerifyFound();
16557 }
16558
Dave Houlton584d51e2017-02-16 12:52:54 -070016559 // Test compressed formats, if supported
Jamie Madill35127872017-03-15 16:17:46 -040016560 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton584d51e2017-02-16 12:52:54 -070016561 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houltonf3229d52017-02-21 15:59:08 -070016562 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
16563 device_features.textureCompressionASTC_LDR)) {
16564 printf(" No compressed formats supported - block compression tests skipped.\n");
16565 } else {
Dave Houlton67e9b532017-03-02 17:00:10 -070016566 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
16567 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
Dave Houlton584d51e2017-02-16 12:52:54 -070016568 if (device_features.textureCompressionBC) {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016569 image_16k_4x4comp.init(128, 128, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton67e9b532017-03-02 17:00:10 -070016570 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
16571 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016572 } else if (device_features.textureCompressionETC2) {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016573 image_16k_4x4comp.init(128, 128, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
Dave Houlton584d51e2017-02-16 12:52:54 -070016574 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton67e9b532017-03-02 17:00:10 -070016575 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16576 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016577 } else {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016578 image_16k_4x4comp.init(128, 128, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16579 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton67e9b532017-03-02 17:00:10 -070016580 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16581 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016582 }
16583 ASSERT_TRUE(image_16k_4x4comp.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016584
Dave Houlton584d51e2017-02-16 12:52:54 -070016585 // Just fits
16586 m_errorMonitor->ExpectSuccess();
16587 region.imageExtent = {128, 128, 1};
16588 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16589 buffer_16k.handle(), 1, &region);
16590 m_errorMonitor->VerifyNotFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016591
Dave Houlton584d51e2017-02-16 12:52:54 -070016592 // with offset, too big for buffer
16593 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16594 region.bufferOffset = 16;
16595 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16596 buffer_16k.handle(), 1, &region);
16597 m_errorMonitor->VerifyFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016598 region.bufferOffset = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016599
Dave Houlton67e9b532017-03-02 17:00:10 -070016600 // extents that are not a multiple of compressed block size
16601 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16602 region.imageExtent.width = 66;
16603 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16604 buffer_16k.handle(), 1, &region);
16605 m_errorMonitor->VerifyFound();
16606 region.imageExtent.width = 128;
16607
16608 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016609 region.imageExtent.height = 2;
Dave Houlton67e9b532017-03-02 17:00:10 -070016610 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16611 buffer_16k.handle(), 1, &region);
16612 m_errorMonitor->VerifyFound();
16613 region.imageExtent.height = 128;
16614
16615 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
16616
16617 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
16618 m_errorMonitor->ExpectSuccess();
16619 region.imageExtent.width = 66;
16620 region.imageOffset.x = 64;
16621 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16622 buffer_16k.handle(), 1, &region);
16623 region.imageExtent.width = 16;
16624 region.imageOffset.x = 0;
16625 region.imageExtent.height = 2;
16626 region.imageOffset.y = 128;
16627 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016628 buffer_16k.handle(), 1, &region);
16629 m_errorMonitor->VerifyNotFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016630 region.imageOffset = {0, 0, 0};
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016631
Dave Houlton584d51e2017-02-16 12:52:54 -070016632 // buffer offset must be a multiple of texel block size (16)
16633 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01274);
16634 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
16635 region.imageExtent = {64, 64, 1};
16636 region.bufferOffset = 24;
16637 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16638 buffer_16k.handle(), 1, &region);
16639 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016640
Dave Houlton584d51e2017-02-16 12:52:54 -070016641 // rowlength not a multiple of block width (4)
16642 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01271);
16643 region.bufferOffset = 0;
16644 region.bufferRowLength = 130;
16645 region.bufferImageHeight = 0;
16646 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16647 buffer_64k.handle(), 1, &region);
16648 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016649
Dave Houlton584d51e2017-02-16 12:52:54 -070016650 // imageheight not a multiple of block height (4)
16651 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01272);
16652 region.bufferRowLength = 0;
16653 region.bufferImageHeight = 130;
16654 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16655 buffer_64k.handle(), 1, &region);
16656 m_errorMonitor->VerifyFound();
Dave Houlton584d51e2017-02-16 12:52:54 -070016657 }
Dave Houlton59a20702017-02-02 17:26:23 -070016658}
16659
Tony Barbourd6673642016-05-05 14:46:39 -060016660TEST_F(VkLayerTest, MiscImageLayerTests) {
Mark Lobodzinskie6911292017-02-15 14:38:51 -070016661 TEST_DESCRIPTION("Image-related tests that don't belong elsewhare");
Tony Barbourd6673642016-05-05 14:46:39 -060016662
Tony Barbour1fa09702017-03-16 12:09:08 -060016663 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016664
Rene Lindsay135204f2016-12-22 17:11:09 -070016665 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060016666 VkImageObj image(m_device);
Rene Lindsay135204f2016-12-22 17:11:09 -070016667 image.init(128, 128, VK_FORMAT_R16G16B16A16_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016668 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060016669 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060016670 vk_testing::Buffer buffer;
16671 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070016672 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060016673 VkBufferImageCopy region = {};
16674 region.bufferRowLength = 128;
16675 region.bufferImageHeight = 128;
16676 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16677 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070016678 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016679 region.imageExtent.height = 4;
16680 region.imageExtent.width = 4;
16681 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070016682
16683 VkImageObj image2(m_device);
16684 image2.init(128, 128, VK_FORMAT_R8G8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016685 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070016686 ASSERT_TRUE(image2.initialized());
16687 vk_testing::Buffer buffer2;
16688 VkMemoryPropertyFlags reqs2 = 0;
16689 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
16690 VkBufferImageCopy region2 = {};
16691 region2.bufferRowLength = 128;
16692 region2.bufferImageHeight = 128;
16693 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16694 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
16695 region2.imageSubresource.layerCount = 1;
16696 region2.imageExtent.height = 4;
16697 region2.imageExtent.width = 4;
16698 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016699 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060016700
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016701 // Image must have offset.z of 0 and extent.depth of 1
16702 // Introduce failure by setting imageExtent.depth to 0
16703 region.imageExtent.depth = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016704 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016705 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016706 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016707 m_errorMonitor->VerifyFound();
16708
16709 region.imageExtent.depth = 1;
16710
16711 // Image must have offset.z of 0 and extent.depth of 1
16712 // Introduce failure by setting imageOffset.z to 4
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016713 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016714 region.imageOffset.z = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016715 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016716 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016717 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016718 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016719 m_errorMonitor->VerifyFound();
16720
16721 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016722 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
16723 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070016724 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016726 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16727 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016728 m_errorMonitor->VerifyFound();
16729
16730 // BufferOffset must be a multiple of 4
16731 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070016732 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016733 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070016734 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
16735 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016736 m_errorMonitor->VerifyFound();
16737
16738 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
16739 region.bufferOffset = 0;
16740 region.imageExtent.height = 128;
16741 region.imageExtent.width = 128;
16742 // Introduce failure by setting bufferRowLength > 0 but less than width
16743 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016744 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016745 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16746 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016747 m_errorMonitor->VerifyFound();
16748
16749 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
16750 region.bufferRowLength = 128;
16751 // Introduce failure by setting bufferRowHeight > 0 but less than height
16752 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016753 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016754 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16755 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016756 m_errorMonitor->VerifyFound();
16757
16758 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060016759 VkImageObj intImage1(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070016760 intImage1.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16761 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016762 VkImageObj intImage2(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070016763 intImage2.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16764 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016765 VkImageBlit blitRegion = {};
16766 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16767 blitRegion.srcSubresource.baseArrayLayer = 0;
16768 blitRegion.srcSubresource.layerCount = 1;
16769 blitRegion.srcSubresource.mipLevel = 0;
16770 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16771 blitRegion.dstSubresource.baseArrayLayer = 0;
16772 blitRegion.dstSubresource.layerCount = 1;
16773 blitRegion.dstSubresource.mipLevel = 0;
16774
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016775 // Look for NULL-blit warning
Jeremy Hayesf8e749f2017-03-15 09:40:27 -060016776 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
16777 "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
16778 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
16779 "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016780 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.layout(), intImage2.handle(),
16781 intImage2.layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016782 m_errorMonitor->VerifyFound();
16783
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070016784 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060016785 VkImageMemoryBarrier img_barrier;
16786 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
16787 img_barrier.pNext = NULL;
16788 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
16789 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
16790 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16791 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16792 img_barrier.image = image.handle();
16793 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16794 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16795 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16796 img_barrier.subresourceRange.baseArrayLayer = 0;
16797 img_barrier.subresourceRange.baseMipLevel = 0;
Tony Barbourd6673642016-05-05 14:46:39 -060016798 img_barrier.subresourceRange.layerCount = 0;
16799 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016800 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
16801 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060016802 m_errorMonitor->VerifyFound();
16803 img_barrier.subresourceRange.layerCount = 1;
16804}
16805
16806TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060016807 TEST_DESCRIPTION("Exceed the limits of image format ");
16808
Tony Barbour1fa09702017-03-16 12:09:08 -060016809 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016810
16811 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
16812 {
16813 VkFormatProperties properties;
16814 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
16815 if (properties.linearTilingFeatures == 0) {
16816 printf(" Image format not supported; skipped.\n");
16817 return;
16818 }
16819 }
16820
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016821 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060016822 VkImageCreateInfo image_create_info = {};
16823 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16824 image_create_info.pNext = NULL;
16825 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016826 image_create_info.format = format;
Tony Barbourd6673642016-05-05 14:46:39 -060016827 image_create_info.extent.width = 32;
16828 image_create_info.extent.height = 32;
16829 image_create_info.extent.depth = 1;
16830 image_create_info.mipLevels = 1;
16831 image_create_info.arrayLayers = 1;
16832 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16833 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16834 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16835 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16836 image_create_info.flags = 0;
16837
16838 VkImage nullImg;
16839 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016840 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
16841 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070016842 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016843 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16844 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16845 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070016846 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016847
Tony Barbour0907e362017-03-09 15:05:30 -070016848 uint32_t maxDim =
16849 std::max(std::max(image_create_info.extent.width, image_create_info.extent.height), image_create_info.extent.depth);
16850 // If max mip levels exceeds image extents, skip the max mip levels test
16851 if ((imgFmtProps.maxMipLevels + 1) <= (floor(log2(maxDim)) + 1)) {
16852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
16853 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
16854 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16855 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16856 m_errorMonitor->VerifyFound();
16857 image_create_info.mipLevels = 1;
16858 }
Tony Barbourd6673642016-05-05 14:46:39 -060016859
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016860 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060016861 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
16862 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16863 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16864 m_errorMonitor->VerifyFound();
16865 image_create_info.arrayLayers = 1;
16866
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060016868 int samples = imgFmtProps.sampleCounts >> 1;
16869 image_create_info.samples = (VkSampleCountFlagBits)samples;
16870 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16871 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16872 m_errorMonitor->VerifyFound();
16873 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16874
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016875 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16876 "pCreateInfo->initialLayout, must be "
16877 "VK_IMAGE_LAYOUT_UNDEFINED or "
16878 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060016879 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16880 // Expect INVALID_LAYOUT
16881 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16882 m_errorMonitor->VerifyFound();
16883 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16884}
16885
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016886TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016887 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060016888 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016889
Tony Barbour1fa09702017-03-16 12:09:08 -060016890 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016891
16892 VkImageObj src_image(m_device);
16893 src_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
16894 VkImageObj dst_image(m_device);
16895 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
16896
Tony Barbour552f6c02016-12-21 14:34:07 -070016897 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016898 VkImageCopy copy_region;
16899 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16900 copy_region.srcSubresource.mipLevel = 0;
16901 copy_region.srcSubresource.baseArrayLayer = 0;
16902 copy_region.srcSubresource.layerCount = 0;
16903 copy_region.srcOffset.x = 0;
16904 copy_region.srcOffset.y = 0;
16905 copy_region.srcOffset.z = 0;
16906 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16907 copy_region.dstSubresource.mipLevel = 0;
16908 copy_region.dstSubresource.baseArrayLayer = 0;
16909 copy_region.dstSubresource.layerCount = 0;
16910 copy_region.dstOffset.x = 0;
16911 copy_region.dstOffset.y = 0;
16912 copy_region.dstOffset.z = 0;
16913 copy_region.extent.width = 64;
16914 copy_region.extent.height = 64;
16915 copy_region.extent.depth = 1;
16916 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
16917 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070016918 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016919
16920 m_errorMonitor->VerifyFound();
16921}
16922
16923TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016924 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060016925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016926
Tony Barbour1fa09702017-03-16 12:09:08 -060016927 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016928
16929 VkImageObj src_image(m_device);
16930 src_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
16931 VkImageObj dst_image(m_device);
16932 dst_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
16933
Tony Barbour552f6c02016-12-21 14:34:07 -070016934 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016935 VkImageCopy copy_region;
16936 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16937 copy_region.srcSubresource.mipLevel = 0;
16938 copy_region.srcSubresource.baseArrayLayer = 0;
16939 copy_region.srcSubresource.layerCount = 0;
16940 copy_region.srcOffset.x = 0;
16941 copy_region.srcOffset.y = 0;
16942 copy_region.srcOffset.z = 0;
16943 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16944 copy_region.dstSubresource.mipLevel = 0;
16945 copy_region.dstSubresource.baseArrayLayer = 0;
16946 copy_region.dstSubresource.layerCount = 0;
16947 copy_region.dstOffset.x = 0;
16948 copy_region.dstOffset.y = 0;
16949 copy_region.dstOffset.z = 0;
16950 copy_region.extent.width = 64;
16951 copy_region.extent.height = 64;
16952 copy_region.extent.depth = 1;
16953 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
16954 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070016955 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016956
16957 m_errorMonitor->VerifyFound();
16958}
16959
Karl Schultz6addd812016-02-02 17:17:23 -070016960TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060016961 VkResult err;
16962 bool pass;
16963
16964 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016965 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060016966
Tony Barbour1fa09702017-03-16 12:09:08 -060016967 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -060016968
16969 // Create two images of different types and try to copy between them
16970 VkImage srcImage;
16971 VkImage dstImage;
16972 VkDeviceMemory srcMem;
16973 VkDeviceMemory destMem;
16974 VkMemoryRequirements memReqs;
16975
16976 VkImageCreateInfo image_create_info = {};
16977 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16978 image_create_info.pNext = NULL;
16979 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16980 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16981 image_create_info.extent.width = 32;
16982 image_create_info.extent.height = 32;
16983 image_create_info.extent.depth = 1;
16984 image_create_info.mipLevels = 1;
16985 image_create_info.arrayLayers = 1;
16986 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16987 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16988 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16989 image_create_info.flags = 0;
16990
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016991 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060016992 ASSERT_VK_SUCCESS(err);
16993
16994 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16995 // Introduce failure by creating second image with a different-sized format.
16996 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
16997
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016998 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060016999 ASSERT_VK_SUCCESS(err);
17000
17001 // Allocate memory
17002 VkMemoryAllocateInfo memAlloc = {};
17003 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17004 memAlloc.pNext = NULL;
17005 memAlloc.allocationSize = 0;
17006 memAlloc.memoryTypeIndex = 0;
17007
17008 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
17009 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017010 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017011 ASSERT_TRUE(pass);
17012 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
17013 ASSERT_VK_SUCCESS(err);
17014
17015 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
17016 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017017 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017018 ASSERT_TRUE(pass);
17019 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
17020 ASSERT_VK_SUCCESS(err);
17021
17022 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17023 ASSERT_VK_SUCCESS(err);
17024 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
17025 ASSERT_VK_SUCCESS(err);
17026
Tony Barbour552f6c02016-12-21 14:34:07 -070017027 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017028 VkImageCopy copyRegion;
17029 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17030 copyRegion.srcSubresource.mipLevel = 0;
17031 copyRegion.srcSubresource.baseArrayLayer = 0;
17032 copyRegion.srcSubresource.layerCount = 0;
17033 copyRegion.srcOffset.x = 0;
17034 copyRegion.srcOffset.y = 0;
17035 copyRegion.srcOffset.z = 0;
17036 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17037 copyRegion.dstSubresource.mipLevel = 0;
17038 copyRegion.dstSubresource.baseArrayLayer = 0;
17039 copyRegion.dstSubresource.layerCount = 0;
17040 copyRegion.dstOffset.x = 0;
17041 copyRegion.dstOffset.y = 0;
17042 copyRegion.dstOffset.z = 0;
17043 copyRegion.extent.width = 1;
17044 copyRegion.extent.height = 1;
17045 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017046 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017047 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017048
17049 m_errorMonitor->VerifyFound();
17050
17051 vkDestroyImage(m_device->device(), srcImage, NULL);
17052 vkDestroyImage(m_device->device(), dstImage, NULL);
17053 vkFreeMemory(m_device->device(), srcMem, NULL);
17054 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017055}
17056
Karl Schultz6addd812016-02-02 17:17:23 -070017057TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
17058 VkResult err;
17059 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017060
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017061 // Create a depth image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017062 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17063 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017064
Tony Barbour1fa09702017-03-16 12:09:08 -060017065 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070017066 auto depth_format = find_depth_stencil_format(m_device);
17067 if (!depth_format) {
17068 return;
17069 }
Mike Stroyana3082432015-09-25 13:39:21 -060017070
17071 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017072 VkImage srcImage;
17073 VkImage dstImage;
17074 VkDeviceMemory srcMem;
17075 VkDeviceMemory destMem;
17076 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017077
17078 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017079 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17080 image_create_info.pNext = NULL;
17081 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017082 image_create_info.format = VK_FORMAT_D32_SFLOAT;
Karl Schultz6addd812016-02-02 17:17:23 -070017083 image_create_info.extent.width = 32;
17084 image_create_info.extent.height = 32;
17085 image_create_info.extent.depth = 1;
17086 image_create_info.mipLevels = 1;
17087 image_create_info.arrayLayers = 1;
17088 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17089 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17090 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17091 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017092
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017093 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017094 ASSERT_VK_SUCCESS(err);
17095
Karl Schultzbdb75952016-04-19 11:36:49 -060017096 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17097
Mark Lobodzinskidb117632016-03-31 10:45:56 -060017098 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070017099 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tony Barbourf887b162017-03-09 10:06:46 -070017100 image_create_info.format = depth_format;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060017101 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017102
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017103 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017104 ASSERT_VK_SUCCESS(err);
17105
17106 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017107 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017108 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17109 memAlloc.pNext = NULL;
17110 memAlloc.allocationSize = 0;
17111 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017112
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017113 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017114 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017115 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017116 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017117 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017118 ASSERT_VK_SUCCESS(err);
17119
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017120 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017121 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017122 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017123 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017124 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017125 ASSERT_VK_SUCCESS(err);
17126
17127 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17128 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017129 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017130 ASSERT_VK_SUCCESS(err);
17131
Tony Barbour552f6c02016-12-21 14:34:07 -070017132 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017133 VkImageCopy copyRegion;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017134 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017135 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017136 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017137 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017138 copyRegion.srcOffset.x = 0;
17139 copyRegion.srcOffset.y = 0;
17140 copyRegion.srcOffset.z = 0;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017141 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017142 copyRegion.dstSubresource.mipLevel = 0;
17143 copyRegion.dstSubresource.baseArrayLayer = 0;
17144 copyRegion.dstSubresource.layerCount = 0;
17145 copyRegion.dstOffset.x = 0;
17146 copyRegion.dstOffset.y = 0;
17147 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017148 copyRegion.extent.width = 1;
17149 copyRegion.extent.height = 1;
17150 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017151 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017152 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017153
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017154 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017155
Chia-I Wuf7458c52015-10-26 21:10:41 +080017156 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017157 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017158 vkFreeMemory(m_device->device(), srcMem, NULL);
17159 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017160}
17161
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017162TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
17163 TEST_DESCRIPTION("Image copies with sample count mis-matches");
Dave Houlton33c22b72017-02-28 13:16:02 -070017164
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017165 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton33c22b72017-02-28 13:16:02 -070017166
17167 VkImageFormatProperties image_format_properties;
17168 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
17169 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
17170 &image_format_properties);
17171
17172 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
17173 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
17174 printf(" Image multi-sample support not found; skipped.\n");
17175 return;
17176 }
17177
17178 VkImageCreateInfo ci;
17179 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17180 ci.pNext = NULL;
17181 ci.flags = 0;
17182 ci.imageType = VK_IMAGE_TYPE_2D;
17183 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17184 ci.extent = {128, 128, 1};
17185 ci.mipLevels = 1;
17186 ci.arrayLayers = 1;
17187 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17188 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17189 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17190 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17191 ci.queueFamilyIndexCount = 0;
17192 ci.pQueueFamilyIndices = NULL;
17193 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17194
17195 VkImageObj image1(m_device);
17196 image1.init(&ci);
17197 ASSERT_TRUE(image1.initialized());
17198
17199 ci.samples = VK_SAMPLE_COUNT_2_BIT;
17200 VkImageObj image2(m_device);
17201 image2.init(&ci);
17202 ASSERT_TRUE(image2.initialized());
17203
17204 ci.samples = VK_SAMPLE_COUNT_4_BIT;
17205 VkImageObj image4(m_device);
17206 image4.init(&ci);
17207 ASSERT_TRUE(image4.initialized());
17208
17209 m_commandBuffer->BeginCommandBuffer();
17210
17211 VkImageCopy copyRegion;
17212 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17213 copyRegion.srcSubresource.mipLevel = 0;
17214 copyRegion.srcSubresource.baseArrayLayer = 0;
17215 copyRegion.srcSubresource.layerCount = 1;
17216 copyRegion.srcOffset = {0, 0, 0};
17217 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17218 copyRegion.dstSubresource.mipLevel = 0;
17219 copyRegion.dstSubresource.baseArrayLayer = 0;
17220 copyRegion.dstSubresource.layerCount = 1;
17221 copyRegion.dstOffset = {0, 0, 0};
17222 copyRegion.extent = {128, 128, 1};
17223
17224 // Copy a single sample image to/from a multi-sample image
17225 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17226 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17227 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17228 m_errorMonitor->VerifyFound();
17229
17230 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17231 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(),
17232 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17233 m_errorMonitor->VerifyFound();
17234
17235 // Copy between multi-sample images with different sample counts
17236 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17237 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17238 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17239 m_errorMonitor->VerifyFound();
17240
17241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17242 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(),
17243 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17244 m_errorMonitor->VerifyFound();
17245
17246 m_commandBuffer->EndCommandBuffer();
17247}
17248
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017249TEST_F(VkLayerTest, CopyImageAspectMismatch) {
17250 TEST_DESCRIPTION("Image copies with aspect mask errors");
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017251 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour9357d542017-03-24 15:42:21 -060017252 auto ds_format = find_depth_stencil_format(m_device);
17253 if (!ds_format) {
17254 return;
17255 }
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017256
17257 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
17258 color_image.init(128, 128, VK_FORMAT_R32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
17259 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 -060017260 ds_image.init(128, 128, ds_format, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL,
17261 0);
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017262 ASSERT_TRUE(color_image.initialized());
17263 ASSERT_TRUE(depth_image.initialized());
17264 ASSERT_TRUE(ds_image.initialized());
17265
17266 VkImageCopy copyRegion;
17267 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17268 copyRegion.srcSubresource.mipLevel = 0;
17269 copyRegion.srcSubresource.baseArrayLayer = 0;
17270 copyRegion.srcSubresource.layerCount = 1;
17271 copyRegion.srcOffset = {0, 0, 0};
17272 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17273 copyRegion.dstSubresource.mipLevel = 0;
17274 copyRegion.dstSubresource.baseArrayLayer = 0;
17275 copyRegion.dstSubresource.layerCount = 1;
17276 copyRegion.dstOffset = {64, 0, 0};
17277 copyRegion.extent = {64, 128, 1};
17278
17279 // Submitting command before command buffer is in recording state
17280 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "You must call vkBeginCommandBuffer");// VALIDATION_ERROR_01192);
17281 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17282 m_errorMonitor->VerifyFound();
17283
17284 m_commandBuffer->BeginCommandBuffer();
17285
17286 // Src and dest aspect masks don't match
17287 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
17288 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01197);
17289 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17290 m_errorMonitor->VerifyFound();
17291 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17292
17293 // Illegal combinations of aspect bits - VU 01221
17294 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
17295 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
17296 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01221);
17297 // These aspect/format mismatches are redundant but unavoidable here
17298 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17299 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
17300 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17301 m_errorMonitor->VerifyFound();
17302 // Metadata aspect is illegal - VU 01222
17303 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17304 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17305 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01222);
17306 // These aspect/format mismatches are redundant but unavoidable here
17307 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17308 m_errorMonitor->VerifyFound();
17309
17310 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17311 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17312
17313 // Aspect mask doesn't match source image format - VU 01200
17314 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17315 // Again redundant but unavoidable when provoking vu01200 w/o vu01201
17316 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17317 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17318 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17319 m_errorMonitor->VerifyFound();
17320
17321 // Aspect mask doesn't match dest image format - VU 01201
17322 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17323 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17324 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
17325 // Again redundant but unavoidable when provoking vu01201 w/o vu01200
17326 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17327 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17328 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17329 m_errorMonitor->VerifyFound();
17330
17331 m_commandBuffer->EndCommandBuffer();
17332}
17333
Karl Schultz6addd812016-02-02 17:17:23 -070017334TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
17335 VkResult err;
17336 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017337
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017338 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17339 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017340
Tony Barbour1fa09702017-03-16 12:09:08 -060017341 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017342
17343 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017344 VkImage srcImage;
17345 VkImage dstImage;
17346 VkDeviceMemory srcMem;
17347 VkDeviceMemory destMem;
17348 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017349
17350 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017351 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17352 image_create_info.pNext = NULL;
17353 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17354 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17355 image_create_info.extent.width = 32;
17356 image_create_info.extent.height = 1;
17357 image_create_info.extent.depth = 1;
17358 image_create_info.mipLevels = 1;
17359 image_create_info.arrayLayers = 1;
17360 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17361 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17362 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17363 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017364
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017365 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017366 ASSERT_VK_SUCCESS(err);
17367
Karl Schultz6addd812016-02-02 17:17:23 -070017368 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017369
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017370 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017371 ASSERT_VK_SUCCESS(err);
17372
17373 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017374 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017375 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17376 memAlloc.pNext = NULL;
17377 memAlloc.allocationSize = 0;
17378 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017379
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017380 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017381 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017382 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017383 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017384 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017385 ASSERT_VK_SUCCESS(err);
17386
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017387 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017388 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017389 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017390 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017391 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017392 ASSERT_VK_SUCCESS(err);
17393
17394 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17395 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017396 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017397 ASSERT_VK_SUCCESS(err);
17398
Tony Barbour552f6c02016-12-21 14:34:07 -070017399 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017400 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017401 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17402 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017403 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017404 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017405 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017406 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017407 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017408 resolveRegion.srcOffset.x = 0;
17409 resolveRegion.srcOffset.y = 0;
17410 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017411 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017412 resolveRegion.dstSubresource.mipLevel = 0;
17413 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017414 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017415 resolveRegion.dstOffset.x = 0;
17416 resolveRegion.dstOffset.y = 0;
17417 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017418 resolveRegion.extent.width = 1;
17419 resolveRegion.extent.height = 1;
17420 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017421 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017422 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017423
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017424 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017425
Chia-I Wuf7458c52015-10-26 21:10:41 +080017426 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017427 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017428 vkFreeMemory(m_device->device(), srcMem, NULL);
17429 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017430}
17431
Karl Schultz6addd812016-02-02 17:17:23 -070017432TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
17433 VkResult err;
17434 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017435
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017436 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17437 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017438
Tony Barbour1fa09702017-03-16 12:09:08 -060017439 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017440
Chris Forbesa7530692016-05-08 12:35:39 +120017441 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017442 VkImage srcImage;
17443 VkImage dstImage;
17444 VkDeviceMemory srcMem;
17445 VkDeviceMemory destMem;
17446 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017447
17448 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017449 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17450 image_create_info.pNext = NULL;
17451 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17452 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17453 image_create_info.extent.width = 32;
17454 image_create_info.extent.height = 1;
17455 image_create_info.extent.depth = 1;
17456 image_create_info.mipLevels = 1;
17457 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120017458 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017459 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17460 // Note: Some implementations expect color attachment usage for any
17461 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017462 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017463 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017464
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017465 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017466 ASSERT_VK_SUCCESS(err);
17467
Karl Schultz6addd812016-02-02 17:17:23 -070017468 // Note: Some implementations expect color attachment usage for any
17469 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017470 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017471
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017472 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017473 ASSERT_VK_SUCCESS(err);
17474
17475 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017476 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017477 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17478 memAlloc.pNext = NULL;
17479 memAlloc.allocationSize = 0;
17480 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017481
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017482 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017483 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017484 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017485 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017486 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017487 ASSERT_VK_SUCCESS(err);
17488
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017489 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017490 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017491 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017492 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017493 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017494 ASSERT_VK_SUCCESS(err);
17495
17496 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17497 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017498 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017499 ASSERT_VK_SUCCESS(err);
17500
Tony Barbour552f6c02016-12-21 14:34:07 -070017501 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017502 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017503 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17504 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017505 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017506 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017507 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017508 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017509 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017510 resolveRegion.srcOffset.x = 0;
17511 resolveRegion.srcOffset.y = 0;
17512 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017513 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017514 resolveRegion.dstSubresource.mipLevel = 0;
17515 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017516 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017517 resolveRegion.dstOffset.x = 0;
17518 resolveRegion.dstOffset.y = 0;
17519 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017520 resolveRegion.extent.width = 1;
17521 resolveRegion.extent.height = 1;
17522 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017523 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017524 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017525
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017526 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017527
Chia-I Wuf7458c52015-10-26 21:10:41 +080017528 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017529 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017530 vkFreeMemory(m_device->device(), srcMem, NULL);
17531 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017532}
17533
Karl Schultz6addd812016-02-02 17:17:23 -070017534TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
17535 VkResult err;
17536 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017537
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017538 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017539 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017540
Tony Barbour1fa09702017-03-16 12:09:08 -060017541 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017542
17543 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017544 VkImage srcImage;
17545 VkImage dstImage;
17546 VkDeviceMemory srcMem;
17547 VkDeviceMemory destMem;
17548 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017549
17550 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017551 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17552 image_create_info.pNext = NULL;
17553 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17554 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17555 image_create_info.extent.width = 32;
17556 image_create_info.extent.height = 1;
17557 image_create_info.extent.depth = 1;
17558 image_create_info.mipLevels = 1;
17559 image_create_info.arrayLayers = 1;
17560 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17561 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17562 // Note: Some implementations expect color attachment usage for any
17563 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017564 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017565 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017566
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017567 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017568 ASSERT_VK_SUCCESS(err);
17569
Karl Schultz6addd812016-02-02 17:17:23 -070017570 // Set format to something other than source image
17571 image_create_info.format = VK_FORMAT_R32_SFLOAT;
17572 // Note: Some implementations expect color attachment usage for any
17573 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017574 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017575 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017576
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017577 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017578 ASSERT_VK_SUCCESS(err);
17579
17580 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017581 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017582 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17583 memAlloc.pNext = NULL;
17584 memAlloc.allocationSize = 0;
17585 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017586
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017587 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017588 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017589 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017590 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017591 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017592 ASSERT_VK_SUCCESS(err);
17593
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017594 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017595 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017596 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017597 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017598 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017599 ASSERT_VK_SUCCESS(err);
17600
17601 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17602 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017603 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017604 ASSERT_VK_SUCCESS(err);
17605
Tony Barbour552f6c02016-12-21 14:34:07 -070017606 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017607 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017608 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17609 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017610 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017611 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017612 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017613 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017614 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017615 resolveRegion.srcOffset.x = 0;
17616 resolveRegion.srcOffset.y = 0;
17617 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017618 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017619 resolveRegion.dstSubresource.mipLevel = 0;
17620 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017621 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017622 resolveRegion.dstOffset.x = 0;
17623 resolveRegion.dstOffset.y = 0;
17624 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017625 resolveRegion.extent.width = 1;
17626 resolveRegion.extent.height = 1;
17627 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017628 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017629 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017630
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017631 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017632
Chia-I Wuf7458c52015-10-26 21:10:41 +080017633 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017634 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017635 vkFreeMemory(m_device->device(), srcMem, NULL);
17636 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017637}
17638
Karl Schultz6addd812016-02-02 17:17:23 -070017639TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
17640 VkResult err;
17641 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017642
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017643 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017644 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017645
Tony Barbour1fa09702017-03-16 12:09:08 -060017646 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017647
17648 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017649 VkImage srcImage;
17650 VkImage dstImage;
17651 VkDeviceMemory srcMem;
17652 VkDeviceMemory destMem;
17653 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017654
17655 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017656 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17657 image_create_info.pNext = NULL;
17658 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17659 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17660 image_create_info.extent.width = 32;
17661 image_create_info.extent.height = 1;
17662 image_create_info.extent.depth = 1;
17663 image_create_info.mipLevels = 1;
17664 image_create_info.arrayLayers = 1;
17665 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17666 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
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_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017670 image_create_info.flags = 0;
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, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017673 ASSERT_VK_SUCCESS(err);
17674
Karl Schultz6addd812016-02-02 17:17:23 -070017675 image_create_info.imageType = VK_IMAGE_TYPE_1D;
17676 // Note: Some implementations expect color attachment usage for any
17677 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017678 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017679 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017680
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017681 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017682 ASSERT_VK_SUCCESS(err);
17683
17684 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017685 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017686 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17687 memAlloc.pNext = NULL;
17688 memAlloc.allocationSize = 0;
17689 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017690
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017691 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017692 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017693 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017694 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017695 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017696 ASSERT_VK_SUCCESS(err);
17697
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017698 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017699 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017700 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017701 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017702 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017703 ASSERT_VK_SUCCESS(err);
17704
17705 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17706 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017707 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017708 ASSERT_VK_SUCCESS(err);
17709
Tony Barbour552f6c02016-12-21 14:34:07 -070017710 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017711 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017712 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17713 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017714 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017715 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017716 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017717 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017718 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017719 resolveRegion.srcOffset.x = 0;
17720 resolveRegion.srcOffset.y = 0;
17721 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017722 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017723 resolveRegion.dstSubresource.mipLevel = 0;
17724 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017725 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017726 resolveRegion.dstOffset.x = 0;
17727 resolveRegion.dstOffset.y = 0;
17728 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017729 resolveRegion.extent.width = 1;
17730 resolveRegion.extent.height = 1;
17731 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017732 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017733 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017734
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017735 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017736
Chia-I Wuf7458c52015-10-26 21:10:41 +080017737 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017738 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017739 vkFreeMemory(m_device->device(), srcMem, NULL);
17740 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017741}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017742
Karl Schultz6addd812016-02-02 17:17:23 -070017743TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017744 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070017745 // to using a DS format, then cause it to hit error due to COLOR_BIT not
17746 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017747 // The image format check comes 2nd in validation so we trigger it first,
17748 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070017749 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017750
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017751 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17752 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017753
Tony Barbour1fa09702017-03-16 12:09:08 -060017754 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070017755 auto depth_format = find_depth_stencil_format(m_device);
17756 if (!depth_format) {
17757 return;
17758 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017759
Chia-I Wu1b99bb22015-10-27 19:25:11 +080017760 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017761 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17762 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017763
17764 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017765 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17766 ds_pool_ci.pNext = NULL;
17767 ds_pool_ci.maxSets = 1;
17768 ds_pool_ci.poolSizeCount = 1;
17769 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017770
17771 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017772 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017773 ASSERT_VK_SUCCESS(err);
17774
17775 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017776 dsl_binding.binding = 0;
17777 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17778 dsl_binding.descriptorCount = 1;
17779 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
17780 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017781
17782 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017783 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17784 ds_layout_ci.pNext = NULL;
17785 ds_layout_ci.bindingCount = 1;
17786 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017787 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017788 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017789 ASSERT_VK_SUCCESS(err);
17790
17791 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017792 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080017793 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070017794 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017795 alloc_info.descriptorPool = ds_pool;
17796 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017797 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017798 ASSERT_VK_SUCCESS(err);
17799
Karl Schultz6addd812016-02-02 17:17:23 -070017800 VkImage image_bad;
17801 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017802 // One bad format and one good format for Color attachment
Tony Barbourf887b162017-03-09 10:06:46 -070017803 const VkFormat tex_format_bad = depth_format;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017804 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070017805 const int32_t tex_width = 32;
17806 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017807
17808 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017809 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17810 image_create_info.pNext = NULL;
17811 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17812 image_create_info.format = tex_format_bad;
17813 image_create_info.extent.width = tex_width;
17814 image_create_info.extent.height = tex_height;
17815 image_create_info.extent.depth = 1;
17816 image_create_info.mipLevels = 1;
17817 image_create_info.arrayLayers = 1;
17818 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17819 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017820 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017821 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017822
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017823 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017824 ASSERT_VK_SUCCESS(err);
17825 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017826 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
17827 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017828 ASSERT_VK_SUCCESS(err);
17829
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017830 // ---Bind image memory---
17831 VkMemoryRequirements img_mem_reqs;
17832 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
17833 VkMemoryAllocateInfo image_alloc_info = {};
17834 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17835 image_alloc_info.pNext = NULL;
17836 image_alloc_info.memoryTypeIndex = 0;
17837 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017838 bool pass =
17839 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 -070017840 ASSERT_TRUE(pass);
17841 VkDeviceMemory mem;
17842 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
17843 ASSERT_VK_SUCCESS(err);
17844 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
17845 ASSERT_VK_SUCCESS(err);
17846 // -----------------------
17847
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017848 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130017849 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070017850 image_view_create_info.image = image_bad;
17851 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
17852 image_view_create_info.format = tex_format_bad;
17853 image_view_create_info.subresourceRange.baseArrayLayer = 0;
17854 image_view_create_info.subresourceRange.baseMipLevel = 0;
17855 image_view_create_info.subresourceRange.layerCount = 1;
17856 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017857 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017858
17859 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017860 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017861
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017862 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017863
Chia-I Wuf7458c52015-10-26 21:10:41 +080017864 vkDestroyImage(m_device->device(), image_bad, NULL);
17865 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017866 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17867 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017868
17869 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017870}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017871
17872TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017873 TEST_DESCRIPTION(
17874 "Call ClearColorImage w/ a depth|stencil image and "
17875 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017876
Tony Barbour1fa09702017-03-16 12:09:08 -060017877 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070017878 auto depth_format = find_depth_stencil_format(m_device);
17879 if (!depth_format) {
17880 return;
17881 }
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017882 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
17883
Tony Barbour552f6c02016-12-21 14:34:07 -070017884 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017885
17886 // Color image
17887 VkClearColorValue clear_color;
17888 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
17889 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
17890 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
17891 const int32_t img_width = 32;
17892 const int32_t img_height = 32;
17893 VkImageCreateInfo image_create_info = {};
17894 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17895 image_create_info.pNext = NULL;
17896 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17897 image_create_info.format = color_format;
17898 image_create_info.extent.width = img_width;
17899 image_create_info.extent.height = img_height;
17900 image_create_info.extent.depth = 1;
17901 image_create_info.mipLevels = 1;
17902 image_create_info.arrayLayers = 1;
17903 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17904 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17905 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
17906
17907 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017908 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017909
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017910 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017911
17912 // Depth/Stencil image
17913 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017914 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017915 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
17916 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070017917 ds_image_create_info.format = depth_format;
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017918 ds_image_create_info.extent.width = 64;
17919 ds_image_create_info.extent.height = 64;
17920 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070017921 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 -060017922
17923 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017924 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017925
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017926 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 -060017927
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017928 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017929
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017930 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017931 &color_range);
17932
17933 m_errorMonitor->VerifyFound();
17934
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017935 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17936 "vkCmdClearColorImage called with "
17937 "image created without "
17938 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060017939
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070017940 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060017941 &color_range);
17942
17943 m_errorMonitor->VerifyFound();
17944
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017945 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17947 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017948
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017949 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
17950 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017951
17952 m_errorMonitor->VerifyFound();
17953}
Tobin Ehliscde08892015-09-22 10:11:37 -060017954
Mike Schuchardt35fece12017-03-07 14:40:28 -070017955TEST_F(VkLayerTest, CommandQueueFlags) {
17956 TEST_DESCRIPTION(
17957 "Allocate a command buffer on a queue that does not support graphics and try to issue a "
17958 "graphics-only command");
17959
17960 ASSERT_NO_FATAL_FAILURE(Init());
17961
17962 uint32_t queueFamilyIndex = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_GRAPHICS_BIT);
17963 if(queueFamilyIndex == UINT32_MAX) {
17964 printf(" Non-graphics queue family not found; skipped.\n");
17965 return;
17966 } else {
17967 // Create command pool on a non-graphics queue
17968 VkCommandPoolObj command_pool(m_device, queueFamilyIndex);
17969
17970 // Setup command buffer on pool
17971 VkCommandBufferObj command_buffer(m_device, &command_pool);
17972 command_buffer.BeginCommandBuffer();
17973
17974 // Issue a graphics only command
17975 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01446);
17976 VkViewport viewport = {0, 0, 16, 16, 0, 1};
17977 command_buffer.SetViewport(0, 1, &viewport);
17978 m_errorMonitor->VerifyFound();
17979 }
17980}
17981
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017982// WSI Enabled Tests
17983//
Chris Forbes09368e42016-10-13 11:59:22 +130017984#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017985TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
17986
17987#if defined(VK_USE_PLATFORM_XCB_KHR)
17988 VkSurfaceKHR surface = VK_NULL_HANDLE;
17989
17990 VkResult err;
17991 bool pass;
17992 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
17993 VkSwapchainCreateInfoKHR swapchain_create_info = {};
17994 // uint32_t swapchain_image_count = 0;
17995 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
17996 // uint32_t image_index = 0;
17997 // VkPresentInfoKHR present_info = {};
17998
Tony Barbour1fa09702017-03-16 12:09:08 -060017999 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018000
18001 // Use the create function from one of the VK_KHR_*_surface extension in
18002 // order to create a surface, testing all known errors in the process,
18003 // before successfully creating a surface:
18004 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
18005 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
18006 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
18007 pass = (err != VK_SUCCESS);
18008 ASSERT_TRUE(pass);
18009 m_errorMonitor->VerifyFound();
18010
18011 // Next, try to create a surface with the wrong
18012 // VkXcbSurfaceCreateInfoKHR::sType:
18013 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
18014 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18015 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18016 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18017 pass = (err != VK_SUCCESS);
18018 ASSERT_TRUE(pass);
18019 m_errorMonitor->VerifyFound();
18020
18021 // Create a native window, and then correctly create a surface:
18022 xcb_connection_t *connection;
18023 xcb_screen_t *screen;
18024 xcb_window_t xcb_window;
18025 xcb_intern_atom_reply_t *atom_wm_delete_window;
18026
18027 const xcb_setup_t *setup;
18028 xcb_screen_iterator_t iter;
18029 int scr;
18030 uint32_t value_mask, value_list[32];
18031 int width = 1;
18032 int height = 1;
18033
18034 connection = xcb_connect(NULL, &scr);
18035 ASSERT_TRUE(connection != NULL);
18036 setup = xcb_get_setup(connection);
18037 iter = xcb_setup_roots_iterator(setup);
18038 while (scr-- > 0)
18039 xcb_screen_next(&iter);
18040 screen = iter.data;
18041
18042 xcb_window = xcb_generate_id(connection);
18043
18044 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
18045 value_list[0] = screen->black_pixel;
18046 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
18047
18048 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
18049 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
18050
18051 /* Magic code that will send notification when window is destroyed */
18052 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
18053 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
18054
18055 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
18056 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
18057 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
18058 free(reply);
18059
18060 xcb_map_window(connection, xcb_window);
18061
18062 // Force the x/y coordinates to 100,100 results are identical in consecutive
18063 // runs
18064 const uint32_t coords[] = { 100, 100 };
18065 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
18066
18067 // Finally, try to correctly create a surface:
18068 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
18069 xcb_create_info.pNext = NULL;
18070 xcb_create_info.flags = 0;
18071 xcb_create_info.connection = connection;
18072 xcb_create_info.window = xcb_window;
18073 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18074 pass = (err == VK_SUCCESS);
18075 ASSERT_TRUE(pass);
18076
18077 // Check if surface supports presentation:
18078
18079 // 1st, do so without having queried the queue families:
18080 VkBool32 supported = false;
18081 // TODO: Get the following error to come out:
18082 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18083 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
18084 "function");
18085 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18086 pass = (err != VK_SUCCESS);
18087 // ASSERT_TRUE(pass);
18088 // m_errorMonitor->VerifyFound();
18089
18090 // Next, query a queue family index that's too large:
18091 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18092 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
18093 pass = (err != VK_SUCCESS);
18094 ASSERT_TRUE(pass);
18095 m_errorMonitor->VerifyFound();
18096
18097 // Finally, do so correctly:
18098 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18099 // SUPPORTED
18100 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18101 pass = (err == VK_SUCCESS);
18102 ASSERT_TRUE(pass);
18103
18104 // Before proceeding, try to create a swapchain without having called
18105 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
18106 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18107 swapchain_create_info.pNext = NULL;
18108 swapchain_create_info.flags = 0;
18109 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18110 swapchain_create_info.surface = surface;
18111 swapchain_create_info.imageArrayLayers = 1;
18112 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
18113 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
18114 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18115 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
18116 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18117 pass = (err != VK_SUCCESS);
18118 ASSERT_TRUE(pass);
18119 m_errorMonitor->VerifyFound();
18120
18121 // Get the surface capabilities:
18122 VkSurfaceCapabilitiesKHR surface_capabilities;
18123
18124 // Do so correctly (only error logged by this entrypoint is if the
18125 // extension isn't enabled):
18126 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
18127 pass = (err == VK_SUCCESS);
18128 ASSERT_TRUE(pass);
18129
18130 // Get the surface formats:
18131 uint32_t surface_format_count;
18132
18133 // First, try without a pointer to surface_format_count:
18134 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
18135 "specified as NULL");
18136 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
18137 pass = (err == VK_SUCCESS);
18138 ASSERT_TRUE(pass);
18139 m_errorMonitor->VerifyFound();
18140
18141 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
18142 // correctly done a 1st try (to get the count):
18143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18144 surface_format_count = 0;
18145 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
18146 pass = (err == VK_SUCCESS);
18147 ASSERT_TRUE(pass);
18148 m_errorMonitor->VerifyFound();
18149
18150 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18151 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18152 pass = (err == VK_SUCCESS);
18153 ASSERT_TRUE(pass);
18154
18155 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18156 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
18157
18158 // Next, do a 2nd try with surface_format_count being set too high:
18159 surface_format_count += 5;
18160 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18161 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18162 pass = (err == VK_SUCCESS);
18163 ASSERT_TRUE(pass);
18164 m_errorMonitor->VerifyFound();
18165
18166 // Finally, do a correct 1st and 2nd try:
18167 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18168 pass = (err == VK_SUCCESS);
18169 ASSERT_TRUE(pass);
18170 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18171 pass = (err == VK_SUCCESS);
18172 ASSERT_TRUE(pass);
18173
18174 // Get the surface present modes:
18175 uint32_t surface_present_mode_count;
18176
18177 // First, try without a pointer to surface_format_count:
18178 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
18179 "specified as NULL");
18180
18181 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
18182 pass = (err == VK_SUCCESS);
18183 ASSERT_TRUE(pass);
18184 m_errorMonitor->VerifyFound();
18185
18186 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
18187 // correctly done a 1st try (to get the count):
18188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18189 surface_present_mode_count = 0;
18190 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
18191 (VkPresentModeKHR *)&surface_present_mode_count);
18192 pass = (err == VK_SUCCESS);
18193 ASSERT_TRUE(pass);
18194 m_errorMonitor->VerifyFound();
18195
18196 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18197 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18198 pass = (err == VK_SUCCESS);
18199 ASSERT_TRUE(pass);
18200
18201 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18202 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
18203
18204 // Next, do a 2nd try with surface_format_count being set too high:
18205 surface_present_mode_count += 5;
18206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18207 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18208 pass = (err == VK_SUCCESS);
18209 ASSERT_TRUE(pass);
18210 m_errorMonitor->VerifyFound();
18211
18212 // Finally, do a correct 1st and 2nd try:
18213 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18214 pass = (err == VK_SUCCESS);
18215 ASSERT_TRUE(pass);
18216 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18217 pass = (err == VK_SUCCESS);
18218 ASSERT_TRUE(pass);
18219
18220 // Create a swapchain:
18221
18222 // First, try without a pointer to swapchain_create_info:
18223 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
18224 "specified as NULL");
18225
18226 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
18227 pass = (err != VK_SUCCESS);
18228 ASSERT_TRUE(pass);
18229 m_errorMonitor->VerifyFound();
18230
18231 // Next, call with a non-NULL swapchain_create_info, that has the wrong
18232 // sType:
18233 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18234 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18235
18236 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18237 pass = (err != VK_SUCCESS);
18238 ASSERT_TRUE(pass);
18239 m_errorMonitor->VerifyFound();
18240
18241 // Next, call with a NULL swapchain pointer:
18242 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18243 swapchain_create_info.pNext = NULL;
18244 swapchain_create_info.flags = 0;
18245 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
18246 "specified as NULL");
18247
18248 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
18249 pass = (err != VK_SUCCESS);
18250 ASSERT_TRUE(pass);
18251 m_errorMonitor->VerifyFound();
18252
18253 // TODO: Enhance swapchain layer so that
18254 // swapchain_create_info.queueFamilyIndexCount is checked against something?
18255
18256 // Next, call with a queue family index that's too large:
18257 uint32_t queueFamilyIndex[2] = { 100000, 0 };
18258 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18259 swapchain_create_info.queueFamilyIndexCount = 2;
18260 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
18261 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18262 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18263 pass = (err != VK_SUCCESS);
18264 ASSERT_TRUE(pass);
18265 m_errorMonitor->VerifyFound();
18266
18267 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
18268 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18269 swapchain_create_info.queueFamilyIndexCount = 1;
18270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18271 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
18272 "pCreateInfo->pQueueFamilyIndices).");
18273 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18274 pass = (err != VK_SUCCESS);
18275 ASSERT_TRUE(pass);
18276 m_errorMonitor->VerifyFound();
18277
18278 // Next, call with an invalid imageSharingMode:
18279 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
18280 swapchain_create_info.queueFamilyIndexCount = 1;
18281 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18282 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
18283 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18284 pass = (err != VK_SUCCESS);
18285 ASSERT_TRUE(pass);
18286 m_errorMonitor->VerifyFound();
18287 // Fix for the future:
18288 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18289 // SUPPORTED
18290 swapchain_create_info.queueFamilyIndexCount = 0;
18291 queueFamilyIndex[0] = 0;
18292 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
18293
18294 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
18295 // Get the images from a swapchain:
18296 // Acquire an image from a swapchain:
18297 // Present an image to a swapchain:
18298 // Destroy the swapchain:
18299
18300 // TODOs:
18301 //
18302 // - Try destroying the device without first destroying the swapchain
18303 //
18304 // - Try destroying the device without first destroying the surface
18305 //
18306 // - Try destroying the surface without first destroying the swapchain
18307
18308 // Destroy the surface:
18309 vkDestroySurfaceKHR(instance(), surface, NULL);
18310
18311 // Tear down the window:
18312 xcb_destroy_window(connection, xcb_window);
18313 xcb_disconnect(connection);
18314
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018315#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018316 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018317#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018318}
Chris Forbes09368e42016-10-13 11:59:22 +130018319#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018320
18321//
18322// POSITIVE VALIDATION TESTS
18323//
18324// These tests do not expect to encounter ANY validation errors pass only if this is true
18325
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018326TEST_F(VkPositiveLayerTest, SecondaryCommandBufferClearColorAttachments) {
18327 TEST_DESCRIPTION("Create a secondary command buffer and record a CmdClearAttachments call into it");
Tony Barbour1fa09702017-03-16 12:09:08 -060018328 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018329 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18330
18331 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18332 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018333 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018334 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18335 command_buffer_allocate_info.commandBufferCount = 1;
18336
18337 VkCommandBuffer secondary_command_buffer;
18338 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18339 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18340 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18341 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18342 command_buffer_inheritance_info.renderPass = m_renderPass;
18343 command_buffer_inheritance_info.framebuffer = m_framebuffer;
18344
18345 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18346 command_buffer_begin_info.flags =
18347 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
18348 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18349
18350 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18351 VkClearAttachment color_attachment;
18352 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18353 color_attachment.clearValue.color.float32[0] = 0;
18354 color_attachment.clearValue.color.float32[1] = 0;
18355 color_attachment.clearValue.color.float32[2] = 0;
18356 color_attachment.clearValue.color.float32[3] = 0;
18357 color_attachment.colorAttachment = 0;
18358 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
18359 vkCmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
18360}
18361
Tobin Ehlise0006882016-11-03 10:14:28 -060018362TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018363 TEST_DESCRIPTION(
18364 "Perform an image layout transition in a secondary command buffer followed "
18365 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060018366 VkResult err;
18367 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060018368 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070018369 auto depth_format = find_depth_stencil_format(m_device);
18370 if (!depth_format) {
18371 return;
18372 }
Tobin Ehlise0006882016-11-03 10:14:28 -060018373 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18374 // Allocate a secondary and primary cmd buffer
18375 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18376 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018377 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Tobin Ehlise0006882016-11-03 10:14:28 -060018378 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18379 command_buffer_allocate_info.commandBufferCount = 1;
18380
18381 VkCommandBuffer secondary_command_buffer;
18382 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18383 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18384 VkCommandBuffer primary_command_buffer;
18385 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
18386 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18387 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18388 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18389 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18390 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
18391 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18392
18393 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18394 ASSERT_VK_SUCCESS(err);
18395 VkImageObj image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -070018396 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 -060018397 ASSERT_TRUE(image.initialized());
18398 VkImageMemoryBarrier img_barrier = {};
18399 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18400 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18401 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18402 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18403 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18404 img_barrier.image = image.handle();
18405 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18406 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18407 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18408 img_barrier.subresourceRange.baseArrayLayer = 0;
18409 img_barrier.subresourceRange.baseMipLevel = 0;
18410 img_barrier.subresourceRange.layerCount = 1;
18411 img_barrier.subresourceRange.levelCount = 1;
18412 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
18413 0, nullptr, 1, &img_barrier);
18414 err = vkEndCommandBuffer(secondary_command_buffer);
18415 ASSERT_VK_SUCCESS(err);
18416
18417 // Now update primary cmd buffer to execute secondary and transitions image
18418 command_buffer_begin_info.pInheritanceInfo = nullptr;
18419 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
18420 ASSERT_VK_SUCCESS(err);
18421 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
18422 VkImageMemoryBarrier img_barrier2 = {};
18423 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18424 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18425 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18426 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18427 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18428 img_barrier2.image = image.handle();
18429 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18430 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18431 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18432 img_barrier2.subresourceRange.baseArrayLayer = 0;
18433 img_barrier2.subresourceRange.baseMipLevel = 0;
18434 img_barrier2.subresourceRange.layerCount = 1;
18435 img_barrier2.subresourceRange.levelCount = 1;
18436 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
18437 nullptr, 1, &img_barrier2);
18438 err = vkEndCommandBuffer(primary_command_buffer);
18439 ASSERT_VK_SUCCESS(err);
18440 VkSubmitInfo submit_info = {};
18441 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18442 submit_info.commandBufferCount = 1;
18443 submit_info.pCommandBuffers = &primary_command_buffer;
18444 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18445 ASSERT_VK_SUCCESS(err);
18446 m_errorMonitor->VerifyNotFound();
18447 err = vkDeviceWaitIdle(m_device->device());
18448 ASSERT_VK_SUCCESS(err);
Mike Schuchardt06304c22017-03-01 17:09:09 -070018449 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &secondary_command_buffer);
18450 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &primary_command_buffer);
Tobin Ehlise0006882016-11-03 10:14:28 -060018451}
18452
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018453// This is a positive test. No failures are expected.
18454TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018455 TEST_DESCRIPTION(
18456 "Ensure that the vkUpdateDescriptorSets validation code "
18457 "is ignoring VkWriteDescriptorSet members that are not "
18458 "related to the descriptor type specified by "
18459 "VkWriteDescriptorSet::descriptorType. Correct "
18460 "validation behavior will result in the test running to "
18461 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018462
18463 const uintptr_t invalid_ptr = 0xcdcdcdcd;
18464
Tony Barbour1fa09702017-03-16 12:09:08 -060018465 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018466
18467 // Image Case
18468 {
18469 m_errorMonitor->ExpectSuccess();
18470
18471 VkImage image;
18472 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
18473 const int32_t tex_width = 32;
18474 const int32_t tex_height = 32;
18475 VkImageCreateInfo image_create_info = {};
18476 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18477 image_create_info.pNext = NULL;
18478 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18479 image_create_info.format = tex_format;
18480 image_create_info.extent.width = tex_width;
18481 image_create_info.extent.height = tex_height;
18482 image_create_info.extent.depth = 1;
18483 image_create_info.mipLevels = 1;
18484 image_create_info.arrayLayers = 1;
18485 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18486 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18487 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18488 image_create_info.flags = 0;
18489 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
18490 ASSERT_VK_SUCCESS(err);
18491
18492 VkMemoryRequirements memory_reqs;
18493 VkDeviceMemory image_memory;
18494 bool pass;
18495 VkMemoryAllocateInfo memory_info = {};
18496 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18497 memory_info.pNext = NULL;
18498 memory_info.allocationSize = 0;
18499 memory_info.memoryTypeIndex = 0;
18500 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
18501 memory_info.allocationSize = memory_reqs.size;
18502 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18503 ASSERT_TRUE(pass);
18504 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
18505 ASSERT_VK_SUCCESS(err);
18506 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
18507 ASSERT_VK_SUCCESS(err);
18508
18509 VkImageViewCreateInfo image_view_create_info = {};
18510 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
18511 image_view_create_info.image = image;
18512 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18513 image_view_create_info.format = tex_format;
18514 image_view_create_info.subresourceRange.layerCount = 1;
18515 image_view_create_info.subresourceRange.baseMipLevel = 0;
18516 image_view_create_info.subresourceRange.levelCount = 1;
18517 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18518
18519 VkImageView view;
18520 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
18521 ASSERT_VK_SUCCESS(err);
18522
18523 VkDescriptorPoolSize ds_type_count = {};
18524 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18525 ds_type_count.descriptorCount = 1;
18526
18527 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18528 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18529 ds_pool_ci.pNext = NULL;
18530 ds_pool_ci.maxSets = 1;
18531 ds_pool_ci.poolSizeCount = 1;
18532 ds_pool_ci.pPoolSizes = &ds_type_count;
18533
18534 VkDescriptorPool ds_pool;
18535 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18536 ASSERT_VK_SUCCESS(err);
18537
18538 VkDescriptorSetLayoutBinding dsl_binding = {};
18539 dsl_binding.binding = 0;
18540 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18541 dsl_binding.descriptorCount = 1;
18542 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18543 dsl_binding.pImmutableSamplers = NULL;
18544
18545 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18546 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18547 ds_layout_ci.pNext = NULL;
18548 ds_layout_ci.bindingCount = 1;
18549 ds_layout_ci.pBindings = &dsl_binding;
18550 VkDescriptorSetLayout ds_layout;
18551 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18552 ASSERT_VK_SUCCESS(err);
18553
18554 VkDescriptorSet descriptor_set;
18555 VkDescriptorSetAllocateInfo alloc_info = {};
18556 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18557 alloc_info.descriptorSetCount = 1;
18558 alloc_info.descriptorPool = ds_pool;
18559 alloc_info.pSetLayouts = &ds_layout;
18560 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18561 ASSERT_VK_SUCCESS(err);
18562
18563 VkDescriptorImageInfo image_info = {};
18564 image_info.imageView = view;
18565 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
18566
18567 VkWriteDescriptorSet descriptor_write;
18568 memset(&descriptor_write, 0, sizeof(descriptor_write));
18569 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18570 descriptor_write.dstSet = descriptor_set;
18571 descriptor_write.dstBinding = 0;
18572 descriptor_write.descriptorCount = 1;
18573 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18574 descriptor_write.pImageInfo = &image_info;
18575
18576 // Set pBufferInfo and pTexelBufferView to invalid values, which should
18577 // be
18578 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
18579 // This will most likely produce a crash if the parameter_validation
18580 // layer
18581 // does not correctly ignore pBufferInfo.
18582 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18583 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18584
18585 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18586
18587 m_errorMonitor->VerifyNotFound();
18588
18589 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18590 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18591 vkDestroyImageView(m_device->device(), view, NULL);
18592 vkDestroyImage(m_device->device(), image, NULL);
18593 vkFreeMemory(m_device->device(), image_memory, NULL);
18594 }
18595
18596 // Buffer Case
18597 {
18598 m_errorMonitor->ExpectSuccess();
18599
18600 VkBuffer buffer;
18601 uint32_t queue_family_index = 0;
18602 VkBufferCreateInfo buffer_create_info = {};
18603 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18604 buffer_create_info.size = 1024;
18605 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18606 buffer_create_info.queueFamilyIndexCount = 1;
18607 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18608
18609 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18610 ASSERT_VK_SUCCESS(err);
18611
18612 VkMemoryRequirements memory_reqs;
18613 VkDeviceMemory buffer_memory;
18614 bool pass;
18615 VkMemoryAllocateInfo memory_info = {};
18616 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18617 memory_info.pNext = NULL;
18618 memory_info.allocationSize = 0;
18619 memory_info.memoryTypeIndex = 0;
18620
18621 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18622 memory_info.allocationSize = memory_reqs.size;
18623 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18624 ASSERT_TRUE(pass);
18625
18626 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18627 ASSERT_VK_SUCCESS(err);
18628 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18629 ASSERT_VK_SUCCESS(err);
18630
18631 VkDescriptorPoolSize ds_type_count = {};
18632 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18633 ds_type_count.descriptorCount = 1;
18634
18635 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18636 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18637 ds_pool_ci.pNext = NULL;
18638 ds_pool_ci.maxSets = 1;
18639 ds_pool_ci.poolSizeCount = 1;
18640 ds_pool_ci.pPoolSizes = &ds_type_count;
18641
18642 VkDescriptorPool ds_pool;
18643 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18644 ASSERT_VK_SUCCESS(err);
18645
18646 VkDescriptorSetLayoutBinding dsl_binding = {};
18647 dsl_binding.binding = 0;
18648 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18649 dsl_binding.descriptorCount = 1;
18650 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18651 dsl_binding.pImmutableSamplers = NULL;
18652
18653 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18654 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18655 ds_layout_ci.pNext = NULL;
18656 ds_layout_ci.bindingCount = 1;
18657 ds_layout_ci.pBindings = &dsl_binding;
18658 VkDescriptorSetLayout ds_layout;
18659 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18660 ASSERT_VK_SUCCESS(err);
18661
18662 VkDescriptorSet descriptor_set;
18663 VkDescriptorSetAllocateInfo alloc_info = {};
18664 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18665 alloc_info.descriptorSetCount = 1;
18666 alloc_info.descriptorPool = ds_pool;
18667 alloc_info.pSetLayouts = &ds_layout;
18668 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18669 ASSERT_VK_SUCCESS(err);
18670
18671 VkDescriptorBufferInfo buffer_info = {};
18672 buffer_info.buffer = buffer;
18673 buffer_info.offset = 0;
18674 buffer_info.range = 1024;
18675
18676 VkWriteDescriptorSet descriptor_write;
18677 memset(&descriptor_write, 0, sizeof(descriptor_write));
18678 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18679 descriptor_write.dstSet = descriptor_set;
18680 descriptor_write.dstBinding = 0;
18681 descriptor_write.descriptorCount = 1;
18682 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18683 descriptor_write.pBufferInfo = &buffer_info;
18684
18685 // Set pImageInfo and pTexelBufferView to invalid values, which should
18686 // be
18687 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
18688 // This will most likely produce a crash if the parameter_validation
18689 // layer
18690 // does not correctly ignore pImageInfo.
18691 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18692 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18693
18694 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18695
18696 m_errorMonitor->VerifyNotFound();
18697
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018698 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18699 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18700 vkDestroyBuffer(m_device->device(), buffer, NULL);
18701 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18702 }
18703
18704 // Texel Buffer Case
18705 {
18706 m_errorMonitor->ExpectSuccess();
18707
18708 VkBuffer buffer;
18709 uint32_t queue_family_index = 0;
18710 VkBufferCreateInfo buffer_create_info = {};
18711 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18712 buffer_create_info.size = 1024;
18713 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
18714 buffer_create_info.queueFamilyIndexCount = 1;
18715 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18716
18717 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18718 ASSERT_VK_SUCCESS(err);
18719
18720 VkMemoryRequirements memory_reqs;
18721 VkDeviceMemory buffer_memory;
18722 bool pass;
18723 VkMemoryAllocateInfo memory_info = {};
18724 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18725 memory_info.pNext = NULL;
18726 memory_info.allocationSize = 0;
18727 memory_info.memoryTypeIndex = 0;
18728
18729 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18730 memory_info.allocationSize = memory_reqs.size;
18731 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18732 ASSERT_TRUE(pass);
18733
18734 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18735 ASSERT_VK_SUCCESS(err);
18736 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18737 ASSERT_VK_SUCCESS(err);
18738
18739 VkBufferViewCreateInfo buff_view_ci = {};
18740 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
18741 buff_view_ci.buffer = buffer;
18742 buff_view_ci.format = VK_FORMAT_R8_UNORM;
18743 buff_view_ci.range = VK_WHOLE_SIZE;
18744 VkBufferView buffer_view;
18745 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
18746
18747 VkDescriptorPoolSize ds_type_count = {};
18748 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18749 ds_type_count.descriptorCount = 1;
18750
18751 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18752 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18753 ds_pool_ci.pNext = NULL;
18754 ds_pool_ci.maxSets = 1;
18755 ds_pool_ci.poolSizeCount = 1;
18756 ds_pool_ci.pPoolSizes = &ds_type_count;
18757
18758 VkDescriptorPool ds_pool;
18759 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18760 ASSERT_VK_SUCCESS(err);
18761
18762 VkDescriptorSetLayoutBinding dsl_binding = {};
18763 dsl_binding.binding = 0;
18764 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18765 dsl_binding.descriptorCount = 1;
18766 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18767 dsl_binding.pImmutableSamplers = NULL;
18768
18769 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18770 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18771 ds_layout_ci.pNext = NULL;
18772 ds_layout_ci.bindingCount = 1;
18773 ds_layout_ci.pBindings = &dsl_binding;
18774 VkDescriptorSetLayout ds_layout;
18775 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18776 ASSERT_VK_SUCCESS(err);
18777
18778 VkDescriptorSet descriptor_set;
18779 VkDescriptorSetAllocateInfo alloc_info = {};
18780 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18781 alloc_info.descriptorSetCount = 1;
18782 alloc_info.descriptorPool = ds_pool;
18783 alloc_info.pSetLayouts = &ds_layout;
18784 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18785 ASSERT_VK_SUCCESS(err);
18786
18787 VkWriteDescriptorSet descriptor_write;
18788 memset(&descriptor_write, 0, sizeof(descriptor_write));
18789 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18790 descriptor_write.dstSet = descriptor_set;
18791 descriptor_write.dstBinding = 0;
18792 descriptor_write.descriptorCount = 1;
18793 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18794 descriptor_write.pTexelBufferView = &buffer_view;
18795
18796 // Set pImageInfo and pBufferInfo to invalid values, which should be
18797 // ignored for descriptorType ==
18798 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
18799 // This will most likely produce a crash if the parameter_validation
18800 // layer
18801 // does not correctly ignore pImageInfo and pBufferInfo.
18802 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18803 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18804
18805 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18806
18807 m_errorMonitor->VerifyNotFound();
18808
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018809 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18810 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18811 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
18812 vkDestroyBuffer(m_device->device(), buffer, NULL);
18813 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18814 }
18815}
18816
Tobin Ehlisf7428442016-10-25 07:58:24 -060018817TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
18818 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
18819
Tony Barbour1fa09702017-03-16 12:09:08 -060018820 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf7428442016-10-25 07:58:24 -060018821 // Create layout where two binding #s are "1"
18822 static const uint32_t NUM_BINDINGS = 3;
18823 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
18824 dsl_binding[0].binding = 1;
18825 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18826 dsl_binding[0].descriptorCount = 1;
18827 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18828 dsl_binding[0].pImmutableSamplers = NULL;
18829 dsl_binding[1].binding = 0;
18830 dsl_binding[1].descriptorCount = 1;
18831 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18832 dsl_binding[1].descriptorCount = 1;
18833 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18834 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018835 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060018836 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18837 dsl_binding[2].descriptorCount = 1;
18838 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18839 dsl_binding[2].pImmutableSamplers = NULL;
18840
18841 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18842 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18843 ds_layout_ci.pNext = NULL;
18844 ds_layout_ci.bindingCount = NUM_BINDINGS;
18845 ds_layout_ci.pBindings = dsl_binding;
18846 VkDescriptorSetLayout ds_layout;
18847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
18848 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18849 m_errorMonitor->VerifyFound();
18850}
18851
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060018852TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018853 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
18854
Tony Barbour1fa09702017-03-16 12:09:08 -060018855 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018856
Tony Barbour552f6c02016-12-21 14:34:07 -070018857 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018858
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060018859 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
18860
18861 {
18862 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
18863 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
18864 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18865 m_errorMonitor->VerifyFound();
18866 }
18867
18868 {
18869 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
18870 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
18871 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18872 m_errorMonitor->VerifyFound();
18873 }
18874
18875 {
18876 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
18877 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
18878 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18879 m_errorMonitor->VerifyFound();
18880 }
18881
18882 {
18883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
18884 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
18885 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18886 m_errorMonitor->VerifyFound();
18887 }
18888
18889 {
18890 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
18891 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
18892 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18893 m_errorMonitor->VerifyFound();
18894 }
18895
18896 {
18897 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
18898 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
18899 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18900 m_errorMonitor->VerifyFound();
18901 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018902
18903 {
18904 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
18905 VkRect2D scissor = {{-1, 0}, {16, 16}};
18906 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18907 m_errorMonitor->VerifyFound();
18908 }
18909
18910 {
18911 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
18912 VkRect2D scissor = {{0, -2}, {16, 16}};
18913 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18914 m_errorMonitor->VerifyFound();
18915 }
18916
18917 {
18918 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
18919 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
18920 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18921 m_errorMonitor->VerifyFound();
18922 }
18923
18924 {
18925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
18926 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
18927 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18928 m_errorMonitor->VerifyFound();
18929 }
18930
Tony Barbour552f6c02016-12-21 14:34:07 -070018931 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018932}
18933
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018934// This is a positive test. No failures are expected.
18935TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
18936 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
18937 VkResult err;
18938
Tony Barbour1fa09702017-03-16 12:09:08 -060018939 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018940 m_errorMonitor->ExpectSuccess();
18941 VkDescriptorPoolSize ds_type_count = {};
18942 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18943 ds_type_count.descriptorCount = 2;
18944
18945 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18946 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18947 ds_pool_ci.pNext = NULL;
18948 ds_pool_ci.maxSets = 1;
18949 ds_pool_ci.poolSizeCount = 1;
18950 ds_pool_ci.pPoolSizes = &ds_type_count;
18951
18952 VkDescriptorPool ds_pool;
18953 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18954 ASSERT_VK_SUCCESS(err);
18955
18956 // Create layout with two uniform buffer descriptors w/ empty binding between them
18957 static const uint32_t NUM_BINDINGS = 3;
18958 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
18959 dsl_binding[0].binding = 0;
18960 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18961 dsl_binding[0].descriptorCount = 1;
18962 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
18963 dsl_binding[0].pImmutableSamplers = NULL;
18964 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018965 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018966 dsl_binding[2].binding = 2;
18967 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18968 dsl_binding[2].descriptorCount = 1;
18969 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
18970 dsl_binding[2].pImmutableSamplers = NULL;
18971
18972 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18973 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18974 ds_layout_ci.pNext = NULL;
18975 ds_layout_ci.bindingCount = NUM_BINDINGS;
18976 ds_layout_ci.pBindings = dsl_binding;
18977 VkDescriptorSetLayout ds_layout;
18978 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18979 ASSERT_VK_SUCCESS(err);
18980
18981 VkDescriptorSet descriptor_set = {};
18982 VkDescriptorSetAllocateInfo alloc_info = {};
18983 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18984 alloc_info.descriptorSetCount = 1;
18985 alloc_info.descriptorPool = ds_pool;
18986 alloc_info.pSetLayouts = &ds_layout;
18987 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18988 ASSERT_VK_SUCCESS(err);
18989
18990 // Create a buffer to be used for update
18991 VkBufferCreateInfo buff_ci = {};
18992 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18993 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18994 buff_ci.size = 256;
18995 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
18996 VkBuffer buffer;
18997 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
18998 ASSERT_VK_SUCCESS(err);
18999 // Have to bind memory to buffer before descriptor update
19000 VkMemoryAllocateInfo mem_alloc = {};
19001 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19002 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019003 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019004 mem_alloc.memoryTypeIndex = 0;
19005
19006 VkMemoryRequirements mem_reqs;
19007 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19008 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
19009 if (!pass) {
19010 vkDestroyBuffer(m_device->device(), buffer, NULL);
19011 return;
19012 }
19013
19014 VkDeviceMemory mem;
19015 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
19016 ASSERT_VK_SUCCESS(err);
19017 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19018 ASSERT_VK_SUCCESS(err);
19019
19020 // Only update the descriptor at binding 2
19021 VkDescriptorBufferInfo buff_info = {};
19022 buff_info.buffer = buffer;
19023 buff_info.offset = 0;
19024 buff_info.range = VK_WHOLE_SIZE;
19025 VkWriteDescriptorSet descriptor_write = {};
19026 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19027 descriptor_write.dstBinding = 2;
19028 descriptor_write.descriptorCount = 1;
19029 descriptor_write.pTexelBufferView = nullptr;
19030 descriptor_write.pBufferInfo = &buff_info;
19031 descriptor_write.pImageInfo = nullptr;
19032 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19033 descriptor_write.dstSet = descriptor_set;
19034
19035 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19036
19037 m_errorMonitor->VerifyNotFound();
19038 // Cleanup
19039 vkFreeMemory(m_device->device(), mem, NULL);
19040 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19041 vkDestroyBuffer(m_device->device(), buffer, NULL);
19042 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19043}
19044
19045// This is a positive test. No failures are expected.
19046TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
19047 VkResult err;
19048 bool pass;
19049
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019050 TEST_DESCRIPTION(
19051 "Create a buffer, allocate memory, bind memory, destroy "
19052 "the buffer, create an image, and bind the same memory to "
19053 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019054
19055 m_errorMonitor->ExpectSuccess();
19056
Tony Barbour1fa09702017-03-16 12:09:08 -060019057 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019058
19059 VkBuffer buffer;
19060 VkImage image;
19061 VkDeviceMemory mem;
19062 VkMemoryRequirements mem_reqs;
19063
19064 VkBufferCreateInfo buf_info = {};
19065 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19066 buf_info.pNext = NULL;
19067 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19068 buf_info.size = 256;
19069 buf_info.queueFamilyIndexCount = 0;
19070 buf_info.pQueueFamilyIndices = NULL;
19071 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19072 buf_info.flags = 0;
19073 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
19074 ASSERT_VK_SUCCESS(err);
19075
19076 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19077
19078 VkMemoryAllocateInfo alloc_info = {};
19079 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19080 alloc_info.pNext = NULL;
19081 alloc_info.memoryTypeIndex = 0;
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019082
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019083 // Ensure memory is big enough for both bindings
19084 alloc_info.allocationSize = 0x10000;
19085
19086 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19087 if (!pass) {
19088 vkDestroyBuffer(m_device->device(), buffer, NULL);
19089 return;
19090 }
19091
19092 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19093 ASSERT_VK_SUCCESS(err);
19094
19095 uint8_t *pData;
19096 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
19097 ASSERT_VK_SUCCESS(err);
19098
19099 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
19100
19101 vkUnmapMemory(m_device->device(), mem);
19102
19103 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19104 ASSERT_VK_SUCCESS(err);
19105
19106 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
19107 // memory. In fact, it was never used by the GPU.
19108 // Just be be sure, wait for idle.
19109 vkDestroyBuffer(m_device->device(), buffer, NULL);
19110 vkDeviceWaitIdle(m_device->device());
19111
Tobin Ehlis6a005702016-12-28 15:25:56 -070019112 // Use optimal as some platforms report linear support but then fail image creation
19113 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
19114 VkImageFormatProperties image_format_properties;
19115 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
19116 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
19117 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070019118 printf(" Image format not supported; skipped.\n");
Tobin Ehlis6a005702016-12-28 15:25:56 -070019119 vkFreeMemory(m_device->device(), mem, NULL);
19120 return;
19121 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019122 VkImageCreateInfo image_create_info = {};
19123 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19124 image_create_info.pNext = NULL;
19125 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19126 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
19127 image_create_info.extent.width = 64;
19128 image_create_info.extent.height = 64;
19129 image_create_info.extent.depth = 1;
19130 image_create_info.mipLevels = 1;
19131 image_create_info.arrayLayers = 1;
19132 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070019133 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019134 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
19135 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
19136 image_create_info.queueFamilyIndexCount = 0;
19137 image_create_info.pQueueFamilyIndices = NULL;
19138 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19139 image_create_info.flags = 0;
19140
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019141 /* Create a mappable image. It will be the texture if linear images are ok
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019142 * to be textures or it will be the staging image if they are not.
19143 */
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019144 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19145 ASSERT_VK_SUCCESS(err);
19146
19147 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
19148
Tobin Ehlis6a005702016-12-28 15:25:56 -070019149 VkMemoryAllocateInfo mem_alloc = {};
19150 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19151 mem_alloc.pNext = NULL;
19152 mem_alloc.allocationSize = 0;
19153 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019154 mem_alloc.allocationSize = mem_reqs.size;
19155
19156 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19157 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070019158 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019159 vkDestroyImage(m_device->device(), image, NULL);
19160 return;
19161 }
19162
19163 // VALIDATION FAILURE:
19164 err = vkBindImageMemory(m_device->device(), image, mem, 0);
19165 ASSERT_VK_SUCCESS(err);
19166
19167 m_errorMonitor->VerifyNotFound();
19168
19169 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019170 vkDestroyImage(m_device->device(), image, NULL);
19171}
19172
Tony Barbourab713912017-02-02 14:17:35 -070019173// This is a positive test. No failures are expected.
19174TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
19175 VkResult err;
19176
19177 TEST_DESCRIPTION(
19178 "Call all applicable destroy and free routines with NULL"
19179 "handles, expecting no validation errors");
19180
19181 m_errorMonitor->ExpectSuccess();
19182
Tony Barbour1fa09702017-03-16 12:09:08 -060019183 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourab713912017-02-02 14:17:35 -070019184 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19185 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
19186 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
19187 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
19188 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19189 vkDestroyDevice(VK_NULL_HANDLE, NULL);
19190 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
19191 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
19192 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19193 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
19194 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
19195 vkDestroyInstance(VK_NULL_HANDLE, NULL);
19196 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
19197 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
19198 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19199 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
19200 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
19201 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
19202 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
19203 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
19204
19205 VkCommandPool command_pool;
19206 VkCommandPoolCreateInfo pool_create_info{};
19207 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19208 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19209 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19210 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19211 VkCommandBuffer command_buffers[3] = {};
19212 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19213 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19214 command_buffer_allocate_info.commandPool = command_pool;
19215 command_buffer_allocate_info.commandBufferCount = 1;
19216 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19217 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
19218 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
19219 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19220
19221 VkDescriptorPoolSize ds_type_count = {};
19222 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19223 ds_type_count.descriptorCount = 1;
19224
19225 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19226 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19227 ds_pool_ci.pNext = NULL;
19228 ds_pool_ci.maxSets = 1;
19229 ds_pool_ci.poolSizeCount = 1;
19230 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
19231 ds_pool_ci.pPoolSizes = &ds_type_count;
19232
19233 VkDescriptorPool ds_pool;
19234 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19235 ASSERT_VK_SUCCESS(err);
19236
19237 VkDescriptorSetLayoutBinding dsl_binding = {};
19238 dsl_binding.binding = 2;
19239 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19240 dsl_binding.descriptorCount = 1;
19241 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19242 dsl_binding.pImmutableSamplers = NULL;
19243 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19244 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19245 ds_layout_ci.pNext = NULL;
19246 ds_layout_ci.bindingCount = 1;
19247 ds_layout_ci.pBindings = &dsl_binding;
19248 VkDescriptorSetLayout ds_layout;
19249 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19250 ASSERT_VK_SUCCESS(err);
19251
19252 VkDescriptorSet descriptor_sets[3] = {};
19253 VkDescriptorSetAllocateInfo alloc_info = {};
19254 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19255 alloc_info.descriptorSetCount = 1;
19256 alloc_info.descriptorPool = ds_pool;
19257 alloc_info.pSetLayouts = &ds_layout;
19258 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
19259 ASSERT_VK_SUCCESS(err);
19260 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
19261 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19262 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19263
19264 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
19265
19266 m_errorMonitor->VerifyNotFound();
19267}
19268
Tony Barbour626994c2017-02-08 15:29:37 -070019269TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070019270 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070019271
19272 m_errorMonitor->ExpectSuccess();
19273
Tony Barbour1fa09702017-03-16 12:09:08 -060019274 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070019275 VkCommandBuffer cmd_bufs[4];
19276 VkCommandBufferAllocateInfo alloc_info;
19277 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19278 alloc_info.pNext = NULL;
19279 alloc_info.commandBufferCount = 4;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019280 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070019281 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19282 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
19283 VkImageObj image(m_device);
Mike Weiblen62d08a32017-03-07 22:18:27 -070019284 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
19285 (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
19286 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour626994c2017-02-08 15:29:37 -070019287 ASSERT_TRUE(image.initialized());
19288 VkCommandBufferBeginInfo cb_binfo;
19289 cb_binfo.pNext = NULL;
19290 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19291 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
19292 cb_binfo.flags = 0;
19293 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
19294 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
19295 VkImageMemoryBarrier img_barrier = {};
19296 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19297 img_barrier.pNext = NULL;
19298 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19299 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19300 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19301 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
19302 img_barrier.image = image.handle();
19303 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19304 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19305 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19306 img_barrier.subresourceRange.baseArrayLayer = 0;
19307 img_barrier.subresourceRange.baseMipLevel = 0;
19308 img_barrier.subresourceRange.layerCount = 1;
19309 img_barrier.subresourceRange.levelCount = 1;
19310 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19311 &img_barrier);
19312 vkEndCommandBuffer(cmd_bufs[0]);
19313 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
19314 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
19315 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19316 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19317 &img_barrier);
19318 vkEndCommandBuffer(cmd_bufs[1]);
19319 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
19320 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19321 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19322 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19323 &img_barrier);
19324 vkEndCommandBuffer(cmd_bufs[2]);
19325 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
19326 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19327 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
19328 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19329 &img_barrier);
19330 vkEndCommandBuffer(cmd_bufs[3]);
19331
19332 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
19333 VkSemaphore semaphore1, semaphore2;
19334 VkSemaphoreCreateInfo semaphore_create_info{};
19335 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19336 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
19337 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
19338 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
19339 VkSubmitInfo submit_info[3];
19340 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19341 submit_info[0].pNext = nullptr;
19342 submit_info[0].commandBufferCount = 1;
19343 submit_info[0].pCommandBuffers = &cmd_bufs[0];
19344 submit_info[0].signalSemaphoreCount = 1;
19345 submit_info[0].pSignalSemaphores = &semaphore1;
19346 submit_info[0].waitSemaphoreCount = 0;
19347 submit_info[0].pWaitDstStageMask = nullptr;
19348 submit_info[0].pWaitDstStageMask = flags;
19349 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19350 submit_info[1].pNext = nullptr;
19351 submit_info[1].commandBufferCount = 1;
19352 submit_info[1].pCommandBuffers = &cmd_bufs[1];
19353 submit_info[1].waitSemaphoreCount = 1;
19354 submit_info[1].pWaitSemaphores = &semaphore1;
19355 submit_info[1].signalSemaphoreCount = 1;
19356 submit_info[1].pSignalSemaphores = &semaphore2;
19357 submit_info[1].pWaitDstStageMask = flags;
19358 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19359 submit_info[2].pNext = nullptr;
19360 submit_info[2].commandBufferCount = 2;
19361 submit_info[2].pCommandBuffers = &cmd_bufs[2];
19362 submit_info[2].waitSemaphoreCount = 1;
19363 submit_info[2].pWaitSemaphores = &semaphore2;
19364 submit_info[2].signalSemaphoreCount = 0;
19365 submit_info[2].pSignalSemaphores = nullptr;
19366 submit_info[2].pWaitDstStageMask = flags;
19367 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
19368 vkQueueWaitIdle(m_device->m_queue);
19369
19370 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
19371 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
19372 m_errorMonitor->VerifyNotFound();
19373}
19374
Tobin Ehlis953e8392016-11-17 10:54:13 -070019375TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
19376 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
19377 // We previously had a bug where dynamic offset of inactive bindings was still being used
19378 VkResult err;
19379 m_errorMonitor->ExpectSuccess();
19380
Tony Barbour1fa09702017-03-16 12:09:08 -060019381 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis953e8392016-11-17 10:54:13 -070019382 ASSERT_NO_FATAL_FAILURE(InitViewport());
19383 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19384
19385 VkDescriptorPoolSize ds_type_count = {};
19386 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19387 ds_type_count.descriptorCount = 3;
19388
19389 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19390 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19391 ds_pool_ci.pNext = NULL;
19392 ds_pool_ci.maxSets = 1;
19393 ds_pool_ci.poolSizeCount = 1;
19394 ds_pool_ci.pPoolSizes = &ds_type_count;
19395
19396 VkDescriptorPool ds_pool;
19397 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19398 ASSERT_VK_SUCCESS(err);
19399
19400 const uint32_t BINDING_COUNT = 3;
19401 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019402 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019403 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19404 dsl_binding[0].descriptorCount = 1;
19405 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19406 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019407 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019408 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19409 dsl_binding[1].descriptorCount = 1;
19410 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19411 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019412 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019413 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19414 dsl_binding[2].descriptorCount = 1;
19415 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19416 dsl_binding[2].pImmutableSamplers = NULL;
19417
19418 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19419 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19420 ds_layout_ci.pNext = NULL;
19421 ds_layout_ci.bindingCount = BINDING_COUNT;
19422 ds_layout_ci.pBindings = dsl_binding;
19423 VkDescriptorSetLayout ds_layout;
19424 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19425 ASSERT_VK_SUCCESS(err);
19426
19427 VkDescriptorSet descriptor_set;
19428 VkDescriptorSetAllocateInfo alloc_info = {};
19429 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19430 alloc_info.descriptorSetCount = 1;
19431 alloc_info.descriptorPool = ds_pool;
19432 alloc_info.pSetLayouts = &ds_layout;
19433 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19434 ASSERT_VK_SUCCESS(err);
19435
19436 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
19437 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
19438 pipeline_layout_ci.pNext = NULL;
19439 pipeline_layout_ci.setLayoutCount = 1;
19440 pipeline_layout_ci.pSetLayouts = &ds_layout;
19441
19442 VkPipelineLayout pipeline_layout;
19443 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
19444 ASSERT_VK_SUCCESS(err);
19445
19446 // Create two buffers to update the descriptors with
19447 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
19448 uint32_t qfi = 0;
19449 VkBufferCreateInfo buffCI = {};
19450 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19451 buffCI.size = 2048;
19452 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19453 buffCI.queueFamilyIndexCount = 1;
19454 buffCI.pQueueFamilyIndices = &qfi;
19455
19456 VkBuffer dyub1;
19457 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
19458 ASSERT_VK_SUCCESS(err);
19459 // buffer2
19460 buffCI.size = 1024;
19461 VkBuffer dyub2;
19462 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
19463 ASSERT_VK_SUCCESS(err);
19464 // Allocate memory and bind to buffers
19465 VkMemoryAllocateInfo mem_alloc[2] = {};
19466 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19467 mem_alloc[0].pNext = NULL;
19468 mem_alloc[0].memoryTypeIndex = 0;
19469 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19470 mem_alloc[1].pNext = NULL;
19471 mem_alloc[1].memoryTypeIndex = 0;
19472
19473 VkMemoryRequirements mem_reqs1;
19474 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
19475 VkMemoryRequirements mem_reqs2;
19476 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
19477 mem_alloc[0].allocationSize = mem_reqs1.size;
19478 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
19479 mem_alloc[1].allocationSize = mem_reqs2.size;
19480 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
19481 if (!pass) {
19482 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19483 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19484 return;
19485 }
19486
19487 VkDeviceMemory mem1;
19488 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
19489 ASSERT_VK_SUCCESS(err);
19490 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
19491 ASSERT_VK_SUCCESS(err);
19492 VkDeviceMemory mem2;
19493 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
19494 ASSERT_VK_SUCCESS(err);
19495 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
19496 ASSERT_VK_SUCCESS(err);
19497 // Update descriptors
19498 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
19499 buff_info[0].buffer = dyub1;
19500 buff_info[0].offset = 0;
19501 buff_info[0].range = 256;
19502 buff_info[1].buffer = dyub1;
19503 buff_info[1].offset = 256;
19504 buff_info[1].range = 512;
19505 buff_info[2].buffer = dyub2;
19506 buff_info[2].offset = 0;
19507 buff_info[2].range = 512;
19508
19509 VkWriteDescriptorSet descriptor_write;
19510 memset(&descriptor_write, 0, sizeof(descriptor_write));
19511 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19512 descriptor_write.dstSet = descriptor_set;
19513 descriptor_write.dstBinding = 0;
19514 descriptor_write.descriptorCount = BINDING_COUNT;
19515 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19516 descriptor_write.pBufferInfo = buff_info;
19517
19518 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19519
Tony Barbour552f6c02016-12-21 14:34:07 -070019520 m_commandBuffer->BeginCommandBuffer();
19521 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070019522
19523 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019524 char const *vsSource =
19525 "#version 450\n"
19526 "\n"
19527 "out gl_PerVertex { \n"
19528 " vec4 gl_Position;\n"
19529 "};\n"
19530 "void main(){\n"
19531 " gl_Position = vec4(1);\n"
19532 "}\n";
19533 char const *fsSource =
19534 "#version 450\n"
19535 "\n"
19536 "layout(location=0) out vec4 x;\n"
19537 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
19538 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
19539 "void main(){\n"
19540 " x = vec4(bar1.y) + vec4(bar2.y);\n"
19541 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070019542 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19543 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19544 VkPipelineObj pipe(m_device);
19545 pipe.SetViewport(m_viewports);
19546 pipe.SetScissor(m_scissors);
19547 pipe.AddShader(&vs);
19548 pipe.AddShader(&fs);
19549 pipe.AddColorAttachment();
19550 pipe.CreateVKPipeline(pipeline_layout, renderPass());
19551
19552 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
19553 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
19554 // we used to have a bug in this case.
19555 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
19556 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
19557 &descriptor_set, BINDING_COUNT, dyn_off);
19558 Draw(1, 0, 0, 0);
19559 m_errorMonitor->VerifyNotFound();
19560
19561 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19562 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19563 vkFreeMemory(m_device->device(), mem1, NULL);
19564 vkFreeMemory(m_device->device(), mem2, NULL);
19565
19566 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
19567 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19568 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19569}
19570
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019571TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019572 TEST_DESCRIPTION(
19573 "Ensure that validations handling of non-coherent memory "
19574 "mapping while using VK_WHOLE_SIZE does not cause access "
19575 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019576 VkResult err;
19577 uint8_t *pData;
Tony Barbour1fa09702017-03-16 12:09:08 -060019578 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019579
19580 VkDeviceMemory mem;
19581 VkMemoryRequirements mem_reqs;
19582 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019583 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019584 VkMemoryAllocateInfo alloc_info = {};
19585 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19586 alloc_info.pNext = NULL;
19587 alloc_info.memoryTypeIndex = 0;
19588
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019589 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019590 alloc_info.allocationSize = allocation_size;
19591
19592 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
19593 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 -070019594 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019595 if (!pass) {
19596 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019597 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
19598 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019599 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019600 pass = m_device->phy().set_memory_type(
19601 mem_reqs.memoryTypeBits, &alloc_info,
19602 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
19603 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019604 if (!pass) {
19605 return;
19606 }
19607 }
19608 }
19609
19610 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19611 ASSERT_VK_SUCCESS(err);
19612
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019613 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019614 m_errorMonitor->ExpectSuccess();
19615 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19616 ASSERT_VK_SUCCESS(err);
19617 VkMappedMemoryRange mmr = {};
19618 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19619 mmr.memory = mem;
19620 mmr.offset = 0;
19621 mmr.size = VK_WHOLE_SIZE;
19622 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19623 ASSERT_VK_SUCCESS(err);
19624 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19625 ASSERT_VK_SUCCESS(err);
19626 m_errorMonitor->VerifyNotFound();
19627 vkUnmapMemory(m_device->device(), mem);
19628
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019629 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019630 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019631 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019632 ASSERT_VK_SUCCESS(err);
19633 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19634 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019635 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019636 mmr.size = VK_WHOLE_SIZE;
19637 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19638 ASSERT_VK_SUCCESS(err);
19639 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19640 ASSERT_VK_SUCCESS(err);
19641 m_errorMonitor->VerifyNotFound();
19642 vkUnmapMemory(m_device->device(), mem);
19643
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019644 // Map with offset and size
19645 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019646 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019647 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019648 ASSERT_VK_SUCCESS(err);
19649 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19650 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019651 mmr.offset = 4 * atom_size;
19652 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019653 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19654 ASSERT_VK_SUCCESS(err);
19655 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19656 ASSERT_VK_SUCCESS(err);
19657 m_errorMonitor->VerifyNotFound();
19658 vkUnmapMemory(m_device->device(), mem);
19659
19660 // Map without offset and flush WHOLE_SIZE with two separate offsets
19661 m_errorMonitor->ExpectSuccess();
19662 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19663 ASSERT_VK_SUCCESS(err);
19664 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19665 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019666 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019667 mmr.size = VK_WHOLE_SIZE;
19668 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19669 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019670 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019671 mmr.size = VK_WHOLE_SIZE;
19672 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19673 ASSERT_VK_SUCCESS(err);
19674 m_errorMonitor->VerifyNotFound();
19675 vkUnmapMemory(m_device->device(), mem);
19676
19677 vkFreeMemory(m_device->device(), mem, NULL);
19678}
19679
19680// This is a positive test. We used to expect error in this case but spec now allows it
19681TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
19682 m_errorMonitor->ExpectSuccess();
19683 vk_testing::Fence testFence;
19684 VkFenceCreateInfo fenceInfo = {};
19685 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19686 fenceInfo.pNext = NULL;
19687
Tony Barbour1fa09702017-03-16 12:09:08 -060019688 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019689 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019690 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019691 VkResult result = vkResetFences(m_device->device(), 1, fences);
19692 ASSERT_VK_SUCCESS(result);
19693
19694 m_errorMonitor->VerifyNotFound();
19695}
19696
19697TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
19698 m_errorMonitor->ExpectSuccess();
19699
Tony Barbour1fa09702017-03-16 12:09:08 -060019700 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019701 VkResult err;
19702
19703 // Record (empty!) command buffer that can be submitted multiple times
19704 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019705 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
19706 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019707 m_commandBuffer->BeginCommandBuffer(&cbbi);
19708 m_commandBuffer->EndCommandBuffer();
19709
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019710 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019711 VkFence fence;
19712 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
19713 ASSERT_VK_SUCCESS(err);
19714
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019715 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019716 VkSemaphore s1, s2;
19717 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
19718 ASSERT_VK_SUCCESS(err);
19719 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
19720 ASSERT_VK_SUCCESS(err);
19721
19722 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019723 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019724 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
19725 ASSERT_VK_SUCCESS(err);
19726
19727 // Submit CB again, signaling s2.
19728 si.pSignalSemaphores = &s2;
19729 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
19730 ASSERT_VK_SUCCESS(err);
19731
19732 // Wait for fence.
19733 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19734 ASSERT_VK_SUCCESS(err);
19735
19736 // CB is still in flight from second submission, but semaphore s1 is no
19737 // longer in flight. delete it.
19738 vkDestroySemaphore(m_device->device(), s1, nullptr);
19739
19740 m_errorMonitor->VerifyNotFound();
19741
19742 // Force device idle and clean up remaining objects
19743 vkDeviceWaitIdle(m_device->device());
19744 vkDestroySemaphore(m_device->device(), s2, nullptr);
19745 vkDestroyFence(m_device->device(), fence, nullptr);
19746}
19747
19748TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
19749 m_errorMonitor->ExpectSuccess();
19750
Tony Barbour1fa09702017-03-16 12:09:08 -060019751 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019752 VkResult err;
19753
19754 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019755 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019756 VkFence f1;
19757 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
19758 ASSERT_VK_SUCCESS(err);
19759
19760 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019761 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019762 VkFence f2;
19763 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
19764 ASSERT_VK_SUCCESS(err);
19765
19766 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019767 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019768 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
19769
19770 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019771 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019772 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
19773
19774 // Should have both retired!
19775 vkDestroyFence(m_device->device(), f1, nullptr);
19776 vkDestroyFence(m_device->device(), f2, nullptr);
19777
19778 m_errorMonitor->VerifyNotFound();
19779}
19780
19781TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019782 TEST_DESCRIPTION(
19783 "Verify that creating an image view from an image with valid usage "
19784 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019785
Tony Barbour1fa09702017-03-16 12:09:08 -060019786 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019787
19788 m_errorMonitor->ExpectSuccess();
19789 // Verify that we can create a view with usage INPUT_ATTACHMENT
19790 VkImageObj image(m_device);
19791 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
19792 ASSERT_TRUE(image.initialized());
19793 VkImageView imageView;
19794 VkImageViewCreateInfo ivci = {};
19795 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
19796 ivci.image = image.handle();
19797 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
19798 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
19799 ivci.subresourceRange.layerCount = 1;
19800 ivci.subresourceRange.baseMipLevel = 0;
19801 ivci.subresourceRange.levelCount = 1;
19802 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19803
19804 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
19805 m_errorMonitor->VerifyNotFound();
19806 vkDestroyImageView(m_device->device(), imageView, NULL);
19807}
19808
19809// This is a positive test. No failures are expected.
19810TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019811 TEST_DESCRIPTION(
19812 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
19813 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019814
Tony Barbour1fa09702017-03-16 12:09:08 -060019815 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019816
19817 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019818 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Tony Barbour623721f2017-03-24 15:00:21 -060019819 if (!m_device->phy().features().sparseBinding) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019820
19821 m_errorMonitor->ExpectSuccess();
19822
19823 VkImage image;
19824 VkImageCreateInfo image_create_info = {};
19825 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19826 image_create_info.pNext = NULL;
19827 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19828 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
19829 image_create_info.extent.width = 64;
19830 image_create_info.extent.height = 64;
19831 image_create_info.extent.depth = 1;
19832 image_create_info.mipLevels = 1;
19833 image_create_info.arrayLayers = 1;
19834 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
19835 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
19836 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
19837 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
19838 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19839 ASSERT_VK_SUCCESS(err);
19840
19841 VkMemoryRequirements memory_reqs;
19842 VkDeviceMemory memory_one, memory_two;
19843 bool pass;
19844 VkMemoryAllocateInfo memory_info = {};
19845 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19846 memory_info.pNext = NULL;
19847 memory_info.allocationSize = 0;
19848 memory_info.memoryTypeIndex = 0;
19849 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19850 // Find an image big enough to allow sparse mapping of 2 memory regions
19851 // Increase the image size until it is at least twice the
19852 // size of the required alignment, to ensure we can bind both
19853 // allocated memory blocks to the image on aligned offsets.
19854 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
19855 vkDestroyImage(m_device->device(), image, nullptr);
19856 image_create_info.extent.width *= 2;
19857 image_create_info.extent.height *= 2;
19858 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
19859 ASSERT_VK_SUCCESS(err);
19860 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19861 }
19862 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
19863 // at the end of the first
19864 memory_info.allocationSize = memory_reqs.alignment;
19865 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19866 ASSERT_TRUE(pass);
19867 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
19868 ASSERT_VK_SUCCESS(err);
19869 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
19870 ASSERT_VK_SUCCESS(err);
19871 VkSparseMemoryBind binds[2];
19872 binds[0].flags = 0;
19873 binds[0].memory = memory_one;
19874 binds[0].memoryOffset = 0;
19875 binds[0].resourceOffset = 0;
19876 binds[0].size = memory_info.allocationSize;
19877 binds[1].flags = 0;
19878 binds[1].memory = memory_two;
19879 binds[1].memoryOffset = 0;
19880 binds[1].resourceOffset = memory_info.allocationSize;
19881 binds[1].size = memory_info.allocationSize;
19882
19883 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
19884 opaqueBindInfo.image = image;
19885 opaqueBindInfo.bindCount = 2;
19886 opaqueBindInfo.pBinds = binds;
19887
19888 VkFence fence = VK_NULL_HANDLE;
19889 VkBindSparseInfo bindSparseInfo = {};
19890 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
19891 bindSparseInfo.imageOpaqueBindCount = 1;
19892 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
19893
19894 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
19895 vkQueueWaitIdle(m_device->m_queue);
19896 vkDestroyImage(m_device->device(), image, NULL);
19897 vkFreeMemory(m_device->device(), memory_one, NULL);
19898 vkFreeMemory(m_device->device(), memory_two, NULL);
19899 m_errorMonitor->VerifyNotFound();
19900}
19901
19902TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019903 TEST_DESCRIPTION(
19904 "Ensure that CmdBeginRenderPass with an attachment's "
19905 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
19906 "the command buffer has prior knowledge of that "
19907 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019908
19909 m_errorMonitor->ExpectSuccess();
19910
Tony Barbour1fa09702017-03-16 12:09:08 -060019911 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019912
19913 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019914 VkAttachmentDescription attachment = {0,
19915 VK_FORMAT_R8G8B8A8_UNORM,
19916 VK_SAMPLE_COUNT_1_BIT,
19917 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19918 VK_ATTACHMENT_STORE_OP_STORE,
19919 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19920 VK_ATTACHMENT_STORE_OP_DONT_CARE,
19921 VK_IMAGE_LAYOUT_UNDEFINED,
19922 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019923
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019924 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019925
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019926 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019927
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019928 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019929
19930 VkRenderPass rp;
19931 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
19932 ASSERT_VK_SUCCESS(err);
19933
19934 // A compatible framebuffer.
19935 VkImageObj image(m_device);
19936 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
19937 ASSERT_TRUE(image.initialized());
19938
19939 VkImageViewCreateInfo ivci = {
19940 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
19941 nullptr,
19942 0,
19943 image.handle(),
19944 VK_IMAGE_VIEW_TYPE_2D,
19945 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019946 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
19947 VK_COMPONENT_SWIZZLE_IDENTITY},
19948 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019949 };
19950 VkImageView view;
19951 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
19952 ASSERT_VK_SUCCESS(err);
19953
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019954 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019955 VkFramebuffer fb;
19956 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
19957 ASSERT_VK_SUCCESS(err);
19958
19959 // Record a single command buffer which uses this renderpass twice. The
19960 // bug is triggered at the beginning of the second renderpass, when the
19961 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019962 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 -070019963 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019964 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
19965 vkCmdEndRenderPass(m_commandBuffer->handle());
19966 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
19967
19968 m_errorMonitor->VerifyNotFound();
19969
19970 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070019971 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019972
19973 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
19974 vkDestroyRenderPass(m_device->device(), rp, nullptr);
19975 vkDestroyImageView(m_device->device(), view, nullptr);
19976}
19977
19978TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019979 TEST_DESCRIPTION(
19980 "This test should pass. Create a Framebuffer and "
19981 "command buffer, bind them together, then destroy "
19982 "command pool and framebuffer and verify there are no "
19983 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019984
19985 m_errorMonitor->ExpectSuccess();
19986
Tony Barbour1fa09702017-03-16 12:09:08 -060019987 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019988
19989 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019990 VkAttachmentDescription attachment = {0,
19991 VK_FORMAT_R8G8B8A8_UNORM,
19992 VK_SAMPLE_COUNT_1_BIT,
19993 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19994 VK_ATTACHMENT_STORE_OP_STORE,
19995 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19996 VK_ATTACHMENT_STORE_OP_DONT_CARE,
19997 VK_IMAGE_LAYOUT_UNDEFINED,
19998 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019999
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020000 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020001
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020002 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020003
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020004 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020005
20006 VkRenderPass rp;
20007 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20008 ASSERT_VK_SUCCESS(err);
20009
20010 // A compatible framebuffer.
20011 VkImageObj image(m_device);
20012 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
20013 ASSERT_TRUE(image.initialized());
20014
20015 VkImageViewCreateInfo ivci = {
20016 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20017 nullptr,
20018 0,
20019 image.handle(),
20020 VK_IMAGE_VIEW_TYPE_2D,
20021 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020022 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20023 VK_COMPONENT_SWIZZLE_IDENTITY},
20024 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020025 };
20026 VkImageView view;
20027 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20028 ASSERT_VK_SUCCESS(err);
20029
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020030 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020031 VkFramebuffer fb;
20032 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20033 ASSERT_VK_SUCCESS(err);
20034
20035 // Explicitly create a command buffer to bind the FB to so that we can then
20036 // destroy the command pool in order to implicitly free command buffer
20037 VkCommandPool command_pool;
20038 VkCommandPoolCreateInfo pool_create_info{};
20039 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20040 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20041 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20042 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20043
20044 VkCommandBuffer command_buffer;
20045 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20046 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20047 command_buffer_allocate_info.commandPool = command_pool;
20048 command_buffer_allocate_info.commandBufferCount = 1;
20049 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20050 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20051
20052 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020053 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 -060020054 VkCommandBufferBeginInfo begin_info{};
20055 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20056 vkBeginCommandBuffer(command_buffer, &begin_info);
20057
20058 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20059 vkCmdEndRenderPass(command_buffer);
20060 vkEndCommandBuffer(command_buffer);
20061 vkDestroyImageView(m_device->device(), view, nullptr);
20062 // Destroy command pool to implicitly free command buffer
20063 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20064 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20065 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20066 m_errorMonitor->VerifyNotFound();
20067}
20068
20069TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020070 TEST_DESCRIPTION(
20071 "Ensure that CmdBeginRenderPass applies the layout "
20072 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020073
20074 m_errorMonitor->ExpectSuccess();
20075
Tony Barbour1fa09702017-03-16 12:09:08 -060020076 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020077
20078 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020079 VkAttachmentDescription attachment = {0,
20080 VK_FORMAT_R8G8B8A8_UNORM,
20081 VK_SAMPLE_COUNT_1_BIT,
20082 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20083 VK_ATTACHMENT_STORE_OP_STORE,
20084 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20085 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20086 VK_IMAGE_LAYOUT_UNDEFINED,
20087 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020088
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020089 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020090
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020091 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020092
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020093 VkSubpassDependency dep = {0,
20094 0,
20095 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20096 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20097 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20098 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20099 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020100
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020101 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020102
20103 VkResult err;
20104 VkRenderPass rp;
20105 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20106 ASSERT_VK_SUCCESS(err);
20107
20108 // A compatible framebuffer.
20109 VkImageObj image(m_device);
20110 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
20111 ASSERT_TRUE(image.initialized());
20112
20113 VkImageViewCreateInfo ivci = {
20114 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20115 nullptr,
20116 0,
20117 image.handle(),
20118 VK_IMAGE_VIEW_TYPE_2D,
20119 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020120 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20121 VK_COMPONENT_SWIZZLE_IDENTITY},
20122 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020123 };
20124 VkImageView view;
20125 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20126 ASSERT_VK_SUCCESS(err);
20127
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020128 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020129 VkFramebuffer fb;
20130 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20131 ASSERT_VK_SUCCESS(err);
20132
20133 // Record a single command buffer which issues a pipeline barrier w/
20134 // image memory barrier for the attachment. This detects the previously
20135 // missing tracking of the subpass layout by throwing a validation error
20136 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020137 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 -070020138 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020139 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20140
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020141 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
20142 nullptr,
20143 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20144 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20145 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20146 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20147 VK_QUEUE_FAMILY_IGNORED,
20148 VK_QUEUE_FAMILY_IGNORED,
20149 image.handle(),
20150 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020151 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020152 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20153 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020154
20155 vkCmdEndRenderPass(m_commandBuffer->handle());
20156 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020157 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020158
20159 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20160 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20161 vkDestroyImageView(m_device->device(), view, nullptr);
20162}
20163
20164TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020165 TEST_DESCRIPTION(
20166 "Validate that when an imageView of a depth/stencil image "
20167 "is used as a depth/stencil framebuffer attachment, the "
20168 "aspectMask is ignored and both depth and stencil image "
20169 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020170
Tony Barbour1fa09702017-03-16 12:09:08 -060020171 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020172 VkFormatProperties format_properties;
20173 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
20174 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
20175 return;
20176 }
20177
20178 m_errorMonitor->ExpectSuccess();
20179
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020180 VkAttachmentDescription attachment = {0,
20181 VK_FORMAT_D32_SFLOAT_S8_UINT,
20182 VK_SAMPLE_COUNT_1_BIT,
20183 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20184 VK_ATTACHMENT_STORE_OP_STORE,
20185 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20186 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20187 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
20188 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020189
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020190 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020191
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020192 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020193
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020194 VkSubpassDependency dep = {0,
20195 0,
20196 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20197 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20198 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20199 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20200 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020201
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020202 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020203
20204 VkResult err;
20205 VkRenderPass rp;
20206 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20207 ASSERT_VK_SUCCESS(err);
20208
20209 VkImageObj image(m_device);
20210 image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020211 0x26, // usage
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020212 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020213 ASSERT_TRUE(image.initialized());
20214 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
20215
20216 VkImageViewCreateInfo ivci = {
20217 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20218 nullptr,
20219 0,
20220 image.handle(),
20221 VK_IMAGE_VIEW_TYPE_2D,
20222 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020223 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
20224 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020225 };
20226 VkImageView view;
20227 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20228 ASSERT_VK_SUCCESS(err);
20229
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020230 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020231 VkFramebuffer fb;
20232 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20233 ASSERT_VK_SUCCESS(err);
20234
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020235 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 -070020236 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020237 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20238
20239 VkImageMemoryBarrier imb = {};
20240 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20241 imb.pNext = nullptr;
20242 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20243 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20244 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20245 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
20246 imb.srcQueueFamilyIndex = 0;
20247 imb.dstQueueFamilyIndex = 0;
20248 imb.image = image.handle();
20249 imb.subresourceRange.aspectMask = 0x6;
20250 imb.subresourceRange.baseMipLevel = 0;
20251 imb.subresourceRange.levelCount = 0x1;
20252 imb.subresourceRange.baseArrayLayer = 0;
20253 imb.subresourceRange.layerCount = 0x1;
20254
20255 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020256 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20257 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020258
20259 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020260 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020261 QueueCommandBuffer(false);
20262 m_errorMonitor->VerifyNotFound();
20263
20264 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20265 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20266 vkDestroyImageView(m_device->device(), view, nullptr);
20267}
20268
20269TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020270 TEST_DESCRIPTION(
20271 "Ensure that layout transitions work correctly without "
20272 "errors, when an attachment reference is "
20273 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020274
20275 m_errorMonitor->ExpectSuccess();
20276
Tony Barbour1fa09702017-03-16 12:09:08 -060020277 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020278
20279 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020280 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020281
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020282 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020283
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020284 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020285
20286 VkRenderPass rp;
20287 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20288 ASSERT_VK_SUCCESS(err);
20289
20290 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020291 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020292 VkFramebuffer fb;
20293 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20294 ASSERT_VK_SUCCESS(err);
20295
20296 // Record a command buffer which just begins and ends the renderpass. The
20297 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020298 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 -070020299 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020300 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20301 vkCmdEndRenderPass(m_commandBuffer->handle());
20302 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020303 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020304
20305 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20306 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20307}
20308
20309// This is a positive test. No errors are expected.
20310TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020311 TEST_DESCRIPTION(
20312 "Create a stencil-only attachment with a LOAD_OP set to "
20313 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020314 VkResult result = VK_SUCCESS;
Tony Barbour1fa09702017-03-16 12:09:08 -060020315 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070020316 auto depth_format = find_depth_stencil_format(m_device);
20317 if (!depth_format) {
20318 printf(" No Depth + Stencil format found. Skipped.\n");
20319 return;
20320 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020321 VkImageFormatProperties formatProps;
Tony Barbourf887b162017-03-09 10:06:46 -070020322 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020323 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
20324 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020325 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
20326 return;
20327 }
20328
Tony Barbourf887b162017-03-09 10:06:46 -070020329 VkFormat depth_stencil_fmt = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020330 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020331 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020332 VkAttachmentDescription att = {};
20333 VkAttachmentReference ref = {};
20334 att.format = depth_stencil_fmt;
20335 att.samples = VK_SAMPLE_COUNT_1_BIT;
20336 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
20337 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
20338 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
20339 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
20340 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20341 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20342
20343 VkClearValue clear;
20344 clear.depthStencil.depth = 1.0;
20345 clear.depthStencil.stencil = 0;
20346 ref.attachment = 0;
20347 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20348
20349 VkSubpassDescription subpass = {};
20350 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
20351 subpass.flags = 0;
20352 subpass.inputAttachmentCount = 0;
20353 subpass.pInputAttachments = NULL;
20354 subpass.colorAttachmentCount = 0;
20355 subpass.pColorAttachments = NULL;
20356 subpass.pResolveAttachments = NULL;
20357 subpass.pDepthStencilAttachment = &ref;
20358 subpass.preserveAttachmentCount = 0;
20359 subpass.pPreserveAttachments = NULL;
20360
20361 VkRenderPass rp;
20362 VkRenderPassCreateInfo rp_info = {};
20363 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
20364 rp_info.attachmentCount = 1;
20365 rp_info.pAttachments = &att;
20366 rp_info.subpassCount = 1;
20367 rp_info.pSubpasses = &subpass;
20368 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
20369 ASSERT_VK_SUCCESS(result);
20370
20371 VkImageView *depthView = m_depthStencil->BindInfo();
20372 VkFramebufferCreateInfo fb_info = {};
20373 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
20374 fb_info.pNext = NULL;
20375 fb_info.renderPass = rp;
20376 fb_info.attachmentCount = 1;
20377 fb_info.pAttachments = depthView;
20378 fb_info.width = 100;
20379 fb_info.height = 100;
20380 fb_info.layers = 1;
20381 VkFramebuffer fb;
20382 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
20383 ASSERT_VK_SUCCESS(result);
20384
20385 VkRenderPassBeginInfo rpbinfo = {};
20386 rpbinfo.clearValueCount = 1;
20387 rpbinfo.pClearValues = &clear;
20388 rpbinfo.pNext = NULL;
20389 rpbinfo.renderPass = rp;
20390 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
20391 rpbinfo.renderArea.extent.width = 100;
20392 rpbinfo.renderArea.extent.height = 100;
20393 rpbinfo.renderArea.offset.x = 0;
20394 rpbinfo.renderArea.offset.y = 0;
20395 rpbinfo.framebuffer = fb;
20396
20397 VkFence fence = {};
20398 VkFenceCreateInfo fence_ci = {};
20399 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20400 fence_ci.pNext = nullptr;
20401 fence_ci.flags = 0;
20402 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
20403 ASSERT_VK_SUCCESS(result);
20404
20405 m_commandBuffer->BeginCommandBuffer();
20406 m_commandBuffer->BeginRenderPass(rpbinfo);
20407 m_commandBuffer->EndRenderPass();
20408 m_commandBuffer->EndCommandBuffer();
20409 m_commandBuffer->QueueCommandBuffer(fence);
20410
20411 VkImageObj destImage(m_device);
20412 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 -070020413 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020414 VkImageMemoryBarrier barrier = {};
20415 VkImageSubresourceRange range;
20416 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20417 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20418 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
20419 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20420 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20421 barrier.image = m_depthStencil->handle();
20422 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20423 range.baseMipLevel = 0;
20424 range.levelCount = 1;
20425 range.baseArrayLayer = 0;
20426 range.layerCount = 1;
20427 barrier.subresourceRange = range;
20428 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20429 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
20430 cmdbuf.BeginCommandBuffer();
20431 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 -070020432 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020433 barrier.srcAccessMask = 0;
20434 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
20435 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
20436 barrier.image = destImage.handle();
20437 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20438 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 -070020439 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020440 VkImageCopy cregion;
20441 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20442 cregion.srcSubresource.mipLevel = 0;
20443 cregion.srcSubresource.baseArrayLayer = 0;
20444 cregion.srcSubresource.layerCount = 1;
20445 cregion.srcOffset.x = 0;
20446 cregion.srcOffset.y = 0;
20447 cregion.srcOffset.z = 0;
20448 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20449 cregion.dstSubresource.mipLevel = 0;
20450 cregion.dstSubresource.baseArrayLayer = 0;
20451 cregion.dstSubresource.layerCount = 1;
20452 cregion.dstOffset.x = 0;
20453 cregion.dstOffset.y = 0;
20454 cregion.dstOffset.z = 0;
20455 cregion.extent.width = 100;
20456 cregion.extent.height = 100;
20457 cregion.extent.depth = 1;
20458 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020459 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020460 cmdbuf.EndCommandBuffer();
20461
20462 VkSubmitInfo submit_info;
20463 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20464 submit_info.pNext = NULL;
20465 submit_info.waitSemaphoreCount = 0;
20466 submit_info.pWaitSemaphores = NULL;
20467 submit_info.pWaitDstStageMask = NULL;
20468 submit_info.commandBufferCount = 1;
20469 submit_info.pCommandBuffers = &cmdbuf.handle();
20470 submit_info.signalSemaphoreCount = 0;
20471 submit_info.pSignalSemaphores = NULL;
20472
20473 m_errorMonitor->ExpectSuccess();
20474 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20475 m_errorMonitor->VerifyNotFound();
20476
20477 vkQueueWaitIdle(m_device->m_queue);
20478 vkDestroyFence(m_device->device(), fence, nullptr);
20479 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20480 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20481}
20482
20483// This is a positive test. No errors should be generated.
Mike Weiblene4e225d2017-03-07 23:15:43 -070020484TEST_F(VkPositiveLayerTest, BarrierLayoutToImageUsage) {
20485 TEST_DESCRIPTION("Ensure barriers' new and old VkImageLayout are compatible with their images' VkImageUsageFlags");
20486
20487 m_errorMonitor->ExpectSuccess();
20488
Tony Barbour1fa09702017-03-16 12:09:08 -060020489 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour9357d542017-03-24 15:42:21 -060020490 auto depth_format = find_depth_stencil_format(m_device);
20491 if (!depth_format) {
20492 printf(" No Depth + Stencil format found. Skipped.\n");
20493 return;
20494 }
Mike Weiblene4e225d2017-03-07 23:15:43 -070020495 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20496
20497 VkImageMemoryBarrier img_barrier = {};
20498 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20499 img_barrier.pNext = NULL;
20500 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20501 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20502 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20503 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20504 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20505 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20506 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20507 img_barrier.subresourceRange.baseArrayLayer = 0;
20508 img_barrier.subresourceRange.baseMipLevel = 0;
20509 img_barrier.subresourceRange.layerCount = 1;
20510 img_barrier.subresourceRange.levelCount = 1;
20511
20512 {
20513 VkImageObj img_color(m_device);
20514 img_color.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
20515 ASSERT_TRUE(img_color.initialized());
20516
20517 VkImageObj img_ds1(m_device);
Tony Barbour9357d542017-03-24 15:42:21 -060020518 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 -070020519 ASSERT_TRUE(img_ds1.initialized());
20520
20521 VkImageObj img_ds2(m_device);
Tony Barbour9357d542017-03-24 15:42:21 -060020522 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 -070020523 ASSERT_TRUE(img_ds2.initialized());
20524
20525 VkImageObj img_xfer_src(m_device);
20526 img_xfer_src.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
20527 ASSERT_TRUE(img_xfer_src.initialized());
20528
20529 VkImageObj img_xfer_dst(m_device);
20530 img_xfer_dst.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
20531 ASSERT_TRUE(img_xfer_dst.initialized());
20532
20533 VkImageObj img_sampled(m_device);
20534 img_sampled.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL);
20535 ASSERT_TRUE(img_sampled.initialized());
20536
20537 VkImageObj img_input(m_device);
20538 img_input.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
20539 ASSERT_TRUE(img_input.initialized());
20540
20541 const struct {
20542 VkImageObj &image_obj;
20543 VkImageLayout old_layout;
20544 VkImageLayout new_layout;
20545 } buffer_layouts[] = {
20546 // clang-format off
20547 {img_color, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20548 {img_ds1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20549 {img_ds2, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20550 {img_sampled, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20551 {img_input, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20552 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20553 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20554 // clang-format on
20555 };
20556 const uint32_t layout_count = sizeof(buffer_layouts) / sizeof(buffer_layouts[0]);
20557
20558 m_commandBuffer->BeginCommandBuffer();
20559 for (uint32_t i = 0; i < layout_count; ++i) {
20560 img_barrier.image = buffer_layouts[i].image_obj.handle();
20561 const VkImageUsageFlags usage = buffer_layouts[i].image_obj.usage();
20562 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
20563 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
20564 : VK_IMAGE_ASPECT_COLOR_BIT;
20565
20566 img_barrier.oldLayout = buffer_layouts[i].old_layout;
20567 img_barrier.newLayout = buffer_layouts[i].new_layout;
20568 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20569 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20570
20571 img_barrier.oldLayout = buffer_layouts[i].new_layout;
20572 img_barrier.newLayout = buffer_layouts[i].old_layout;
20573 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20574 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20575 }
20576 m_commandBuffer->EndCommandBuffer();
20577
20578 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
20579 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
20580 }
20581 m_errorMonitor->VerifyNotFound();
20582}
20583
20584// This is a positive test. No errors should be generated.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020585TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
20586 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
20587
20588 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060020589 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020590
20591 VkEvent event;
20592 VkEventCreateInfo event_create_info{};
20593 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20594 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20595
20596 VkCommandPool command_pool;
20597 VkCommandPoolCreateInfo pool_create_info{};
20598 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20599 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20600 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20601 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20602
20603 VkCommandBuffer command_buffer;
20604 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20605 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20606 command_buffer_allocate_info.commandPool = command_pool;
20607 command_buffer_allocate_info.commandBufferCount = 1;
20608 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20609 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20610
20611 VkQueue queue = VK_NULL_HANDLE;
20612 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20613
20614 {
20615 VkCommandBufferBeginInfo begin_info{};
20616 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20617 vkBeginCommandBuffer(command_buffer, &begin_info);
20618
20619 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 -070020620 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020621 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
20622 vkEndCommandBuffer(command_buffer);
20623 }
20624 {
20625 VkSubmitInfo submit_info{};
20626 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20627 submit_info.commandBufferCount = 1;
20628 submit_info.pCommandBuffers = &command_buffer;
20629 submit_info.signalSemaphoreCount = 0;
20630 submit_info.pSignalSemaphores = nullptr;
20631 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20632 }
20633 { vkSetEvent(m_device->device(), event); }
20634
20635 vkQueueWaitIdle(queue);
20636
20637 vkDestroyEvent(m_device->device(), event, nullptr);
20638 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20639 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20640
20641 m_errorMonitor->VerifyNotFound();
20642}
20643// This is a positive test. No errors should be generated.
20644TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
20645 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
20646
Tony Barbour1fa09702017-03-16 12:09:08 -060020647 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020648 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020649
20650 m_errorMonitor->ExpectSuccess();
20651
20652 VkQueryPool query_pool;
20653 VkQueryPoolCreateInfo query_pool_create_info{};
20654 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20655 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20656 query_pool_create_info.queryCount = 1;
20657 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20658
20659 VkCommandPool command_pool;
20660 VkCommandPoolCreateInfo pool_create_info{};
20661 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20662 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20663 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20664 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20665
20666 VkCommandBuffer command_buffer;
20667 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20668 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20669 command_buffer_allocate_info.commandPool = command_pool;
20670 command_buffer_allocate_info.commandBufferCount = 1;
20671 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20672 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20673
20674 VkCommandBuffer secondary_command_buffer;
20675 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
20676 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
20677
20678 VkQueue queue = VK_NULL_HANDLE;
20679 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20680
20681 uint32_t qfi = 0;
20682 VkBufferCreateInfo buff_create_info = {};
20683 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20684 buff_create_info.size = 1024;
20685 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20686 buff_create_info.queueFamilyIndexCount = 1;
20687 buff_create_info.pQueueFamilyIndices = &qfi;
20688
20689 VkResult err;
20690 VkBuffer buffer;
20691 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20692 ASSERT_VK_SUCCESS(err);
20693 VkMemoryAllocateInfo mem_alloc = {};
20694 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20695 mem_alloc.pNext = NULL;
20696 mem_alloc.allocationSize = 1024;
20697 mem_alloc.memoryTypeIndex = 0;
20698
20699 VkMemoryRequirements memReqs;
20700 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20701 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20702 if (!pass) {
20703 vkDestroyBuffer(m_device->device(), buffer, NULL);
20704 return;
20705 }
20706
20707 VkDeviceMemory mem;
20708 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20709 ASSERT_VK_SUCCESS(err);
20710 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20711 ASSERT_VK_SUCCESS(err);
20712
20713 VkCommandBufferInheritanceInfo hinfo = {};
20714 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
20715 hinfo.renderPass = VK_NULL_HANDLE;
20716 hinfo.subpass = 0;
20717 hinfo.framebuffer = VK_NULL_HANDLE;
20718 hinfo.occlusionQueryEnable = VK_FALSE;
20719 hinfo.queryFlags = 0;
20720 hinfo.pipelineStatistics = 0;
20721
20722 {
20723 VkCommandBufferBeginInfo begin_info{};
20724 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20725 begin_info.pInheritanceInfo = &hinfo;
20726 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
20727
20728 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
20729 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20730
20731 vkEndCommandBuffer(secondary_command_buffer);
20732
20733 begin_info.pInheritanceInfo = nullptr;
20734 vkBeginCommandBuffer(command_buffer, &begin_info);
20735
20736 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
20737 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
20738
20739 vkEndCommandBuffer(command_buffer);
20740 }
20741 {
20742 VkSubmitInfo submit_info{};
20743 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20744 submit_info.commandBufferCount = 1;
20745 submit_info.pCommandBuffers = &command_buffer;
20746 submit_info.signalSemaphoreCount = 0;
20747 submit_info.pSignalSemaphores = nullptr;
20748 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20749 }
20750
20751 vkQueueWaitIdle(queue);
20752
20753 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
20754 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20755 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
20756 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20757 vkDestroyBuffer(m_device->device(), buffer, NULL);
20758 vkFreeMemory(m_device->device(), mem, NULL);
20759
20760 m_errorMonitor->VerifyNotFound();
20761}
20762
20763// This is a positive test. No errors should be generated.
20764TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
20765 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
20766
Tony Barbour1fa09702017-03-16 12:09:08 -060020767 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020768 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020769
20770 m_errorMonitor->ExpectSuccess();
20771
20772 VkQueryPool query_pool;
20773 VkQueryPoolCreateInfo query_pool_create_info{};
20774 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20775 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20776 query_pool_create_info.queryCount = 1;
20777 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20778
20779 VkCommandPool command_pool;
20780 VkCommandPoolCreateInfo pool_create_info{};
20781 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20782 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20783 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20784 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20785
20786 VkCommandBuffer command_buffer[2];
20787 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20788 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20789 command_buffer_allocate_info.commandPool = command_pool;
20790 command_buffer_allocate_info.commandBufferCount = 2;
20791 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20792 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20793
20794 VkQueue queue = VK_NULL_HANDLE;
20795 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20796
20797 uint32_t qfi = 0;
20798 VkBufferCreateInfo buff_create_info = {};
20799 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20800 buff_create_info.size = 1024;
20801 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20802 buff_create_info.queueFamilyIndexCount = 1;
20803 buff_create_info.pQueueFamilyIndices = &qfi;
20804
20805 VkResult err;
20806 VkBuffer buffer;
20807 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20808 ASSERT_VK_SUCCESS(err);
20809 VkMemoryAllocateInfo mem_alloc = {};
20810 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20811 mem_alloc.pNext = NULL;
20812 mem_alloc.allocationSize = 1024;
20813 mem_alloc.memoryTypeIndex = 0;
20814
20815 VkMemoryRequirements memReqs;
20816 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20817 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20818 if (!pass) {
20819 vkDestroyBuffer(m_device->device(), buffer, NULL);
20820 return;
20821 }
20822
20823 VkDeviceMemory mem;
20824 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20825 ASSERT_VK_SUCCESS(err);
20826 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20827 ASSERT_VK_SUCCESS(err);
20828
20829 {
20830 VkCommandBufferBeginInfo begin_info{};
20831 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20832 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20833
20834 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
20835 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20836
20837 vkEndCommandBuffer(command_buffer[0]);
20838
20839 vkBeginCommandBuffer(command_buffer[1], &begin_info);
20840
20841 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
20842
20843 vkEndCommandBuffer(command_buffer[1]);
20844 }
20845 {
20846 VkSubmitInfo submit_info{};
20847 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20848 submit_info.commandBufferCount = 2;
20849 submit_info.pCommandBuffers = command_buffer;
20850 submit_info.signalSemaphoreCount = 0;
20851 submit_info.pSignalSemaphores = nullptr;
20852 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20853 }
20854
20855 vkQueueWaitIdle(queue);
20856
20857 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
20858 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
20859 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20860 vkDestroyBuffer(m_device->device(), buffer, NULL);
20861 vkFreeMemory(m_device->device(), mem, NULL);
20862
20863 m_errorMonitor->VerifyNotFound();
20864}
20865
Tony Barbourc46924f2016-11-04 11:49:52 -060020866TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020867 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
20868
Tony Barbour1fa09702017-03-16 12:09:08 -060020869 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020870 VkEvent event;
20871 VkEventCreateInfo event_create_info{};
20872 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20873 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20874
20875 VkCommandPool command_pool;
20876 VkCommandPoolCreateInfo pool_create_info{};
20877 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20878 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20879 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20880 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20881
20882 VkCommandBuffer command_buffer;
20883 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20884 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20885 command_buffer_allocate_info.commandPool = command_pool;
20886 command_buffer_allocate_info.commandBufferCount = 1;
20887 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20888 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20889
20890 VkQueue queue = VK_NULL_HANDLE;
20891 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20892
20893 {
20894 VkCommandBufferBeginInfo begin_info{};
20895 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20896 vkBeginCommandBuffer(command_buffer, &begin_info);
20897
20898 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020899 vkEndCommandBuffer(command_buffer);
20900 }
20901 {
20902 VkSubmitInfo submit_info{};
20903 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20904 submit_info.commandBufferCount = 1;
20905 submit_info.pCommandBuffers = &command_buffer;
20906 submit_info.signalSemaphoreCount = 0;
20907 submit_info.pSignalSemaphores = nullptr;
20908 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20909 }
20910 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020911 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
20912 "that is already in use by a "
20913 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020914 vkSetEvent(m_device->device(), event);
20915 m_errorMonitor->VerifyFound();
20916 }
20917
20918 vkQueueWaitIdle(queue);
20919
20920 vkDestroyEvent(m_device->device(), event, nullptr);
20921 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20922 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20923}
20924
20925// This is a positive test. No errors should be generated.
20926TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020927 TEST_DESCRIPTION(
20928 "Two command buffers with two separate fences are each "
20929 "run through a Submit & WaitForFences cycle 3 times. This "
20930 "previously revealed a bug so running this positive test "
20931 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020932 m_errorMonitor->ExpectSuccess();
20933
Tony Barbour1fa09702017-03-16 12:09:08 -060020934 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020935 VkQueue queue = VK_NULL_HANDLE;
20936 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20937
20938 static const uint32_t NUM_OBJECTS = 2;
20939 static const uint32_t NUM_FRAMES = 3;
20940 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
20941 VkFence fences[NUM_OBJECTS] = {};
20942
20943 VkCommandPool cmd_pool;
20944 VkCommandPoolCreateInfo cmd_pool_ci = {};
20945 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20946 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
20947 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20948 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
20949 ASSERT_VK_SUCCESS(err);
20950
20951 VkCommandBufferAllocateInfo cmd_buf_info = {};
20952 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20953 cmd_buf_info.commandPool = cmd_pool;
20954 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20955 cmd_buf_info.commandBufferCount = 1;
20956
20957 VkFenceCreateInfo fence_ci = {};
20958 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20959 fence_ci.pNext = nullptr;
20960 fence_ci.flags = 0;
20961
20962 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
20963 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
20964 ASSERT_VK_SUCCESS(err);
20965 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
20966 ASSERT_VK_SUCCESS(err);
20967 }
20968
20969 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
20970 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
20971 // Create empty cmd buffer
20972 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
20973 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20974
20975 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
20976 ASSERT_VK_SUCCESS(err);
20977 err = vkEndCommandBuffer(cmd_buffers[obj]);
20978 ASSERT_VK_SUCCESS(err);
20979
20980 VkSubmitInfo submit_info = {};
20981 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20982 submit_info.commandBufferCount = 1;
20983 submit_info.pCommandBuffers = &cmd_buffers[obj];
20984 // Submit cmd buffer and wait for fence
20985 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
20986 ASSERT_VK_SUCCESS(err);
20987 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
20988 ASSERT_VK_SUCCESS(err);
20989 err = vkResetFences(m_device->device(), 1, &fences[obj]);
20990 ASSERT_VK_SUCCESS(err);
20991 }
20992 }
20993 m_errorMonitor->VerifyNotFound();
20994 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
20995 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
20996 vkDestroyFence(m_device->device(), fences[i], nullptr);
20997 }
20998}
20999// This is a positive test. No errors should be generated.
21000TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021001 TEST_DESCRIPTION(
21002 "Two command buffers, each in a separate QueueSubmit call "
21003 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021004
Tony Barbour1fa09702017-03-16 12:09:08 -060021005 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021006 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021007
21008 m_errorMonitor->ExpectSuccess();
21009
21010 VkSemaphore semaphore;
21011 VkSemaphoreCreateInfo semaphore_create_info{};
21012 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21013 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21014
21015 VkCommandPool command_pool;
21016 VkCommandPoolCreateInfo pool_create_info{};
21017 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21018 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21019 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21020 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21021
21022 VkCommandBuffer command_buffer[2];
21023 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21024 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21025 command_buffer_allocate_info.commandPool = command_pool;
21026 command_buffer_allocate_info.commandBufferCount = 2;
21027 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21028 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21029
21030 VkQueue queue = VK_NULL_HANDLE;
21031 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21032
21033 {
21034 VkCommandBufferBeginInfo begin_info{};
21035 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21036 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21037
21038 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 -070021039 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021040
21041 VkViewport viewport{};
21042 viewport.maxDepth = 1.0f;
21043 viewport.minDepth = 0.0f;
21044 viewport.width = 512;
21045 viewport.height = 512;
21046 viewport.x = 0;
21047 viewport.y = 0;
21048 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21049 vkEndCommandBuffer(command_buffer[0]);
21050 }
21051 {
21052 VkCommandBufferBeginInfo begin_info{};
21053 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21054 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21055
21056 VkViewport viewport{};
21057 viewport.maxDepth = 1.0f;
21058 viewport.minDepth = 0.0f;
21059 viewport.width = 512;
21060 viewport.height = 512;
21061 viewport.x = 0;
21062 viewport.y = 0;
21063 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21064 vkEndCommandBuffer(command_buffer[1]);
21065 }
21066 {
21067 VkSubmitInfo submit_info{};
21068 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21069 submit_info.commandBufferCount = 1;
21070 submit_info.pCommandBuffers = &command_buffer[0];
21071 submit_info.signalSemaphoreCount = 1;
21072 submit_info.pSignalSemaphores = &semaphore;
21073 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21074 }
21075 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021076 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021077 VkSubmitInfo submit_info{};
21078 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21079 submit_info.commandBufferCount = 1;
21080 submit_info.pCommandBuffers = &command_buffer[1];
21081 submit_info.waitSemaphoreCount = 1;
21082 submit_info.pWaitSemaphores = &semaphore;
21083 submit_info.pWaitDstStageMask = flags;
21084 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21085 }
21086
21087 vkQueueWaitIdle(m_device->m_queue);
21088
21089 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21090 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21091 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21092
21093 m_errorMonitor->VerifyNotFound();
21094}
21095
21096// This is a positive test. No errors should be generated.
21097TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021098 TEST_DESCRIPTION(
21099 "Two command buffers, each in a separate QueueSubmit call "
21100 "submitted on separate queues, the second having a fence"
21101 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021102
Tony Barbour1fa09702017-03-16 12:09:08 -060021103 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021104 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021105
21106 m_errorMonitor->ExpectSuccess();
21107
21108 VkFence fence;
21109 VkFenceCreateInfo fence_create_info{};
21110 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21111 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21112
21113 VkSemaphore semaphore;
21114 VkSemaphoreCreateInfo semaphore_create_info{};
21115 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21116 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21117
21118 VkCommandPool command_pool;
21119 VkCommandPoolCreateInfo pool_create_info{};
21120 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21121 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21122 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21123 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21124
21125 VkCommandBuffer command_buffer[2];
21126 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21127 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21128 command_buffer_allocate_info.commandPool = command_pool;
21129 command_buffer_allocate_info.commandBufferCount = 2;
21130 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21131 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21132
21133 VkQueue queue = VK_NULL_HANDLE;
21134 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21135
21136 {
21137 VkCommandBufferBeginInfo begin_info{};
21138 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21139 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21140
21141 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 -070021142 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021143
21144 VkViewport viewport{};
21145 viewport.maxDepth = 1.0f;
21146 viewport.minDepth = 0.0f;
21147 viewport.width = 512;
21148 viewport.height = 512;
21149 viewport.x = 0;
21150 viewport.y = 0;
21151 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21152 vkEndCommandBuffer(command_buffer[0]);
21153 }
21154 {
21155 VkCommandBufferBeginInfo begin_info{};
21156 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21157 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21158
21159 VkViewport viewport{};
21160 viewport.maxDepth = 1.0f;
21161 viewport.minDepth = 0.0f;
21162 viewport.width = 512;
21163 viewport.height = 512;
21164 viewport.x = 0;
21165 viewport.y = 0;
21166 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21167 vkEndCommandBuffer(command_buffer[1]);
21168 }
21169 {
21170 VkSubmitInfo submit_info{};
21171 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21172 submit_info.commandBufferCount = 1;
21173 submit_info.pCommandBuffers = &command_buffer[0];
21174 submit_info.signalSemaphoreCount = 1;
21175 submit_info.pSignalSemaphores = &semaphore;
21176 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21177 }
21178 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021179 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021180 VkSubmitInfo submit_info{};
21181 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21182 submit_info.commandBufferCount = 1;
21183 submit_info.pCommandBuffers = &command_buffer[1];
21184 submit_info.waitSemaphoreCount = 1;
21185 submit_info.pWaitSemaphores = &semaphore;
21186 submit_info.pWaitDstStageMask = flags;
21187 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21188 }
21189
21190 vkQueueWaitIdle(m_device->m_queue);
21191
21192 vkDestroyFence(m_device->device(), fence, nullptr);
21193 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21194 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21195 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21196
21197 m_errorMonitor->VerifyNotFound();
21198}
21199
21200// This is a positive test. No errors should be generated.
21201TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021202 TEST_DESCRIPTION(
21203 "Two command buffers, each in a separate QueueSubmit call "
21204 "submitted on separate queues, the second having a fence"
21205 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021206
Tony Barbour1fa09702017-03-16 12:09:08 -060021207 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021208 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021209
21210 m_errorMonitor->ExpectSuccess();
21211
21212 VkFence fence;
21213 VkFenceCreateInfo fence_create_info{};
21214 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21215 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21216
21217 VkSemaphore semaphore;
21218 VkSemaphoreCreateInfo semaphore_create_info{};
21219 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21220 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21221
21222 VkCommandPool command_pool;
21223 VkCommandPoolCreateInfo pool_create_info{};
21224 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21225 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21226 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21227 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21228
21229 VkCommandBuffer command_buffer[2];
21230 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21231 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21232 command_buffer_allocate_info.commandPool = command_pool;
21233 command_buffer_allocate_info.commandBufferCount = 2;
21234 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21235 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21236
21237 VkQueue queue = VK_NULL_HANDLE;
21238 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21239
21240 {
21241 VkCommandBufferBeginInfo begin_info{};
21242 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21243 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21244
21245 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 -070021246 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021247
21248 VkViewport viewport{};
21249 viewport.maxDepth = 1.0f;
21250 viewport.minDepth = 0.0f;
21251 viewport.width = 512;
21252 viewport.height = 512;
21253 viewport.x = 0;
21254 viewport.y = 0;
21255 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21256 vkEndCommandBuffer(command_buffer[0]);
21257 }
21258 {
21259 VkCommandBufferBeginInfo begin_info{};
21260 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21261 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21262
21263 VkViewport viewport{};
21264 viewport.maxDepth = 1.0f;
21265 viewport.minDepth = 0.0f;
21266 viewport.width = 512;
21267 viewport.height = 512;
21268 viewport.x = 0;
21269 viewport.y = 0;
21270 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21271 vkEndCommandBuffer(command_buffer[1]);
21272 }
21273 {
21274 VkSubmitInfo submit_info{};
21275 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21276 submit_info.commandBufferCount = 1;
21277 submit_info.pCommandBuffers = &command_buffer[0];
21278 submit_info.signalSemaphoreCount = 1;
21279 submit_info.pSignalSemaphores = &semaphore;
21280 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21281 }
21282 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021283 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021284 VkSubmitInfo submit_info{};
21285 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21286 submit_info.commandBufferCount = 1;
21287 submit_info.pCommandBuffers = &command_buffer[1];
21288 submit_info.waitSemaphoreCount = 1;
21289 submit_info.pWaitSemaphores = &semaphore;
21290 submit_info.pWaitDstStageMask = flags;
21291 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21292 }
21293
21294 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21295 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21296
21297 vkDestroyFence(m_device->device(), fence, nullptr);
21298 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21299 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21300 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21301
21302 m_errorMonitor->VerifyNotFound();
21303}
21304
21305TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Tony Barbour1fa09702017-03-16 12:09:08 -060021306 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021307 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070021308 printf(" Test requires two queues, skipping\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021309 return;
21310 }
21311
21312 VkResult err;
21313
21314 m_errorMonitor->ExpectSuccess();
21315
21316 VkQueue q0 = m_device->m_queue;
21317 VkQueue q1 = nullptr;
21318 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
21319 ASSERT_NE(q1, nullptr);
21320
21321 // An (empty) command buffer. We must have work in the first submission --
21322 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021323 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021324 VkCommandPool pool;
21325 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
21326 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021327 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
21328 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021329 VkCommandBuffer cb;
21330 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
21331 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021332 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021333 err = vkBeginCommandBuffer(cb, &cbbi);
21334 ASSERT_VK_SUCCESS(err);
21335 err = vkEndCommandBuffer(cb);
21336 ASSERT_VK_SUCCESS(err);
21337
21338 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021339 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021340 VkSemaphore s;
21341 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
21342 ASSERT_VK_SUCCESS(err);
21343
21344 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021345 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021346
21347 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
21348 ASSERT_VK_SUCCESS(err);
21349
21350 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021351 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021352 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021353
21354 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
21355 ASSERT_VK_SUCCESS(err);
21356
21357 // Wait for q0 idle
21358 err = vkQueueWaitIdle(q0);
21359 ASSERT_VK_SUCCESS(err);
21360
21361 // Command buffer should have been completed (it was on q0); reset the pool.
21362 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
21363
21364 m_errorMonitor->VerifyNotFound();
21365
21366 // Force device completely idle and clean up resources
21367 vkDeviceWaitIdle(m_device->device());
21368 vkDestroyCommandPool(m_device->device(), pool, nullptr);
21369 vkDestroySemaphore(m_device->device(), s, nullptr);
21370}
21371
21372// This is a positive test. No errors should be generated.
21373TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021374 TEST_DESCRIPTION(
21375 "Two command buffers, each in a separate QueueSubmit call "
21376 "submitted on separate queues, the second having a fence, "
21377 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021378
Tony Barbour1fa09702017-03-16 12:09:08 -060021379 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021380 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021381
21382 m_errorMonitor->ExpectSuccess();
21383
Tony Barbour1fa09702017-03-16 12:09:08 -060021384 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021385 VkFence fence;
21386 VkFenceCreateInfo fence_create_info{};
21387 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21388 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21389
21390 VkSemaphore semaphore;
21391 VkSemaphoreCreateInfo semaphore_create_info{};
21392 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21393 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21394
21395 VkCommandPool command_pool;
21396 VkCommandPoolCreateInfo pool_create_info{};
21397 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21398 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21399 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21400 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21401
21402 VkCommandBuffer command_buffer[2];
21403 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21404 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21405 command_buffer_allocate_info.commandPool = command_pool;
21406 command_buffer_allocate_info.commandBufferCount = 2;
21407 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21408 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21409
21410 VkQueue queue = VK_NULL_HANDLE;
21411 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21412
21413 {
21414 VkCommandBufferBeginInfo begin_info{};
21415 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21416 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21417
21418 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 -070021419 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021420
21421 VkViewport viewport{};
21422 viewport.maxDepth = 1.0f;
21423 viewport.minDepth = 0.0f;
21424 viewport.width = 512;
21425 viewport.height = 512;
21426 viewport.x = 0;
21427 viewport.y = 0;
21428 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21429 vkEndCommandBuffer(command_buffer[0]);
21430 }
21431 {
21432 VkCommandBufferBeginInfo begin_info{};
21433 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21434 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21435
21436 VkViewport viewport{};
21437 viewport.maxDepth = 1.0f;
21438 viewport.minDepth = 0.0f;
21439 viewport.width = 512;
21440 viewport.height = 512;
21441 viewport.x = 0;
21442 viewport.y = 0;
21443 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21444 vkEndCommandBuffer(command_buffer[1]);
21445 }
21446 {
21447 VkSubmitInfo submit_info{};
21448 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21449 submit_info.commandBufferCount = 1;
21450 submit_info.pCommandBuffers = &command_buffer[0];
21451 submit_info.signalSemaphoreCount = 1;
21452 submit_info.pSignalSemaphores = &semaphore;
21453 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21454 }
21455 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021456 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021457 VkSubmitInfo submit_info{};
21458 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21459 submit_info.commandBufferCount = 1;
21460 submit_info.pCommandBuffers = &command_buffer[1];
21461 submit_info.waitSemaphoreCount = 1;
21462 submit_info.pWaitSemaphores = &semaphore;
21463 submit_info.pWaitDstStageMask = flags;
21464 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21465 }
21466
21467 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21468
21469 vkDestroyFence(m_device->device(), fence, nullptr);
21470 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21471 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21472 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21473
21474 m_errorMonitor->VerifyNotFound();
21475}
21476
21477// This is a positive test. No errors should be generated.
21478TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021479 TEST_DESCRIPTION(
21480 "Two command buffers, each in a separate QueueSubmit call "
21481 "on the same queue, sharing a signal/wait semaphore, the "
21482 "second having a fence, "
21483 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021484
21485 m_errorMonitor->ExpectSuccess();
21486
Tony Barbour1fa09702017-03-16 12:09:08 -060021487 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021488 VkFence fence;
21489 VkFenceCreateInfo fence_create_info{};
21490 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21491 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21492
21493 VkSemaphore semaphore;
21494 VkSemaphoreCreateInfo semaphore_create_info{};
21495 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21496 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21497
21498 VkCommandPool command_pool;
21499 VkCommandPoolCreateInfo pool_create_info{};
21500 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21501 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21502 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21503 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21504
21505 VkCommandBuffer command_buffer[2];
21506 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21507 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21508 command_buffer_allocate_info.commandPool = command_pool;
21509 command_buffer_allocate_info.commandBufferCount = 2;
21510 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21511 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21512
21513 {
21514 VkCommandBufferBeginInfo begin_info{};
21515 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21516 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21517
21518 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 -070021519 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021520
21521 VkViewport viewport{};
21522 viewport.maxDepth = 1.0f;
21523 viewport.minDepth = 0.0f;
21524 viewport.width = 512;
21525 viewport.height = 512;
21526 viewport.x = 0;
21527 viewport.y = 0;
21528 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21529 vkEndCommandBuffer(command_buffer[0]);
21530 }
21531 {
21532 VkCommandBufferBeginInfo begin_info{};
21533 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21534 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21535
21536 VkViewport viewport{};
21537 viewport.maxDepth = 1.0f;
21538 viewport.minDepth = 0.0f;
21539 viewport.width = 512;
21540 viewport.height = 512;
21541 viewport.x = 0;
21542 viewport.y = 0;
21543 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21544 vkEndCommandBuffer(command_buffer[1]);
21545 }
21546 {
21547 VkSubmitInfo submit_info{};
21548 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21549 submit_info.commandBufferCount = 1;
21550 submit_info.pCommandBuffers = &command_buffer[0];
21551 submit_info.signalSemaphoreCount = 1;
21552 submit_info.pSignalSemaphores = &semaphore;
21553 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21554 }
21555 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021556 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021557 VkSubmitInfo submit_info{};
21558 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21559 submit_info.commandBufferCount = 1;
21560 submit_info.pCommandBuffers = &command_buffer[1];
21561 submit_info.waitSemaphoreCount = 1;
21562 submit_info.pWaitSemaphores = &semaphore;
21563 submit_info.pWaitDstStageMask = flags;
21564 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21565 }
21566
21567 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21568
21569 vkDestroyFence(m_device->device(), fence, nullptr);
21570 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21571 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21572 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21573
21574 m_errorMonitor->VerifyNotFound();
21575}
21576
21577// This is a positive test. No errors should be generated.
21578TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021579 TEST_DESCRIPTION(
21580 "Two command buffers, each in a separate QueueSubmit call "
21581 "on the same queue, no fences, followed by a third QueueSubmit with NO "
21582 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021583
21584 m_errorMonitor->ExpectSuccess();
21585
Tony Barbour1fa09702017-03-16 12:09:08 -060021586 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021587 VkFence fence;
21588 VkFenceCreateInfo fence_create_info{};
21589 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21590 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21591
21592 VkCommandPool command_pool;
21593 VkCommandPoolCreateInfo pool_create_info{};
21594 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21595 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21596 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21597 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21598
21599 VkCommandBuffer command_buffer[2];
21600 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21601 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21602 command_buffer_allocate_info.commandPool = command_pool;
21603 command_buffer_allocate_info.commandBufferCount = 2;
21604 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21605 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21606
21607 {
21608 VkCommandBufferBeginInfo begin_info{};
21609 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21610 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21611
21612 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 -070021613 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021614
21615 VkViewport viewport{};
21616 viewport.maxDepth = 1.0f;
21617 viewport.minDepth = 0.0f;
21618 viewport.width = 512;
21619 viewport.height = 512;
21620 viewport.x = 0;
21621 viewport.y = 0;
21622 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21623 vkEndCommandBuffer(command_buffer[0]);
21624 }
21625 {
21626 VkCommandBufferBeginInfo begin_info{};
21627 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21628 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21629
21630 VkViewport viewport{};
21631 viewport.maxDepth = 1.0f;
21632 viewport.minDepth = 0.0f;
21633 viewport.width = 512;
21634 viewport.height = 512;
21635 viewport.x = 0;
21636 viewport.y = 0;
21637 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21638 vkEndCommandBuffer(command_buffer[1]);
21639 }
21640 {
21641 VkSubmitInfo submit_info{};
21642 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21643 submit_info.commandBufferCount = 1;
21644 submit_info.pCommandBuffers = &command_buffer[0];
21645 submit_info.signalSemaphoreCount = 0;
21646 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21647 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21648 }
21649 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021650 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021651 VkSubmitInfo submit_info{};
21652 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21653 submit_info.commandBufferCount = 1;
21654 submit_info.pCommandBuffers = &command_buffer[1];
21655 submit_info.waitSemaphoreCount = 0;
21656 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21657 submit_info.pWaitDstStageMask = flags;
21658 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21659 }
21660
21661 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
21662
21663 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21664 ASSERT_VK_SUCCESS(err);
21665
21666 vkDestroyFence(m_device->device(), fence, nullptr);
21667 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21668 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21669
21670 m_errorMonitor->VerifyNotFound();
21671}
21672
21673// This is a positive test. No errors should be generated.
21674TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021675 TEST_DESCRIPTION(
21676 "Two command buffers, each in a separate QueueSubmit call "
21677 "on the same queue, the second having a fence, followed "
21678 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021679
21680 m_errorMonitor->ExpectSuccess();
21681
Tony Barbour1fa09702017-03-16 12:09:08 -060021682 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021683 VkFence fence;
21684 VkFenceCreateInfo fence_create_info{};
21685 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21686 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21687
21688 VkCommandPool command_pool;
21689 VkCommandPoolCreateInfo pool_create_info{};
21690 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21691 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21692 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21693 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21694
21695 VkCommandBuffer command_buffer[2];
21696 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21697 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21698 command_buffer_allocate_info.commandPool = command_pool;
21699 command_buffer_allocate_info.commandBufferCount = 2;
21700 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21701 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21702
21703 {
21704 VkCommandBufferBeginInfo begin_info{};
21705 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21706 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21707
21708 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 -070021709 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021710
21711 VkViewport viewport{};
21712 viewport.maxDepth = 1.0f;
21713 viewport.minDepth = 0.0f;
21714 viewport.width = 512;
21715 viewport.height = 512;
21716 viewport.x = 0;
21717 viewport.y = 0;
21718 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21719 vkEndCommandBuffer(command_buffer[0]);
21720 }
21721 {
21722 VkCommandBufferBeginInfo begin_info{};
21723 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21724 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21725
21726 VkViewport viewport{};
21727 viewport.maxDepth = 1.0f;
21728 viewport.minDepth = 0.0f;
21729 viewport.width = 512;
21730 viewport.height = 512;
21731 viewport.x = 0;
21732 viewport.y = 0;
21733 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21734 vkEndCommandBuffer(command_buffer[1]);
21735 }
21736 {
21737 VkSubmitInfo submit_info{};
21738 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21739 submit_info.commandBufferCount = 1;
21740 submit_info.pCommandBuffers = &command_buffer[0];
21741 submit_info.signalSemaphoreCount = 0;
21742 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21743 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21744 }
21745 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021746 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021747 VkSubmitInfo submit_info{};
21748 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21749 submit_info.commandBufferCount = 1;
21750 submit_info.pCommandBuffers = &command_buffer[1];
21751 submit_info.waitSemaphoreCount = 0;
21752 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21753 submit_info.pWaitDstStageMask = flags;
21754 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21755 }
21756
21757 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21758
21759 vkDestroyFence(m_device->device(), fence, nullptr);
21760 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21761 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21762
21763 m_errorMonitor->VerifyNotFound();
21764}
21765
21766// This is a positive test. No errors should be generated.
21767TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021768 TEST_DESCRIPTION(
21769 "Two command buffers each in a separate SubmitInfo sent in a single "
21770 "QueueSubmit call followed by a WaitForFences call.");
Tony Barbour1fa09702017-03-16 12:09:08 -060021771 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021772
21773 m_errorMonitor->ExpectSuccess();
21774
21775 VkFence fence;
21776 VkFenceCreateInfo fence_create_info{};
21777 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21778 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21779
21780 VkSemaphore semaphore;
21781 VkSemaphoreCreateInfo semaphore_create_info{};
21782 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21783 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21784
21785 VkCommandPool command_pool;
21786 VkCommandPoolCreateInfo pool_create_info{};
21787 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21788 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21789 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21790 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21791
21792 VkCommandBuffer command_buffer[2];
21793 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21794 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21795 command_buffer_allocate_info.commandPool = command_pool;
21796 command_buffer_allocate_info.commandBufferCount = 2;
21797 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21798 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21799
21800 {
21801 VkCommandBufferBeginInfo begin_info{};
21802 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21803 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21804
21805 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 -070021806 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021807
21808 VkViewport viewport{};
21809 viewport.maxDepth = 1.0f;
21810 viewport.minDepth = 0.0f;
21811 viewport.width = 512;
21812 viewport.height = 512;
21813 viewport.x = 0;
21814 viewport.y = 0;
21815 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21816 vkEndCommandBuffer(command_buffer[0]);
21817 }
21818 {
21819 VkCommandBufferBeginInfo begin_info{};
21820 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21821 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21822
21823 VkViewport viewport{};
21824 viewport.maxDepth = 1.0f;
21825 viewport.minDepth = 0.0f;
21826 viewport.width = 512;
21827 viewport.height = 512;
21828 viewport.x = 0;
21829 viewport.y = 0;
21830 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21831 vkEndCommandBuffer(command_buffer[1]);
21832 }
21833 {
21834 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021835 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021836
21837 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21838 submit_info[0].pNext = NULL;
21839 submit_info[0].commandBufferCount = 1;
21840 submit_info[0].pCommandBuffers = &command_buffer[0];
21841 submit_info[0].signalSemaphoreCount = 1;
21842 submit_info[0].pSignalSemaphores = &semaphore;
21843 submit_info[0].waitSemaphoreCount = 0;
21844 submit_info[0].pWaitSemaphores = NULL;
21845 submit_info[0].pWaitDstStageMask = 0;
21846
21847 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21848 submit_info[1].pNext = NULL;
21849 submit_info[1].commandBufferCount = 1;
21850 submit_info[1].pCommandBuffers = &command_buffer[1];
21851 submit_info[1].waitSemaphoreCount = 1;
21852 submit_info[1].pWaitSemaphores = &semaphore;
21853 submit_info[1].pWaitDstStageMask = flags;
21854 submit_info[1].signalSemaphoreCount = 0;
21855 submit_info[1].pSignalSemaphores = NULL;
21856 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
21857 }
21858
21859 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21860
21861 vkDestroyFence(m_device->device(), fence, nullptr);
21862 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21863 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21864 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21865
21866 m_errorMonitor->VerifyNotFound();
21867}
21868
21869TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
21870 m_errorMonitor->ExpectSuccess();
21871
Tony Barbour1fa09702017-03-16 12:09:08 -060021872 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021873 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21874
Tony Barbour552f6c02016-12-21 14:34:07 -070021875 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021876
21877 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
21878 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
21879 m_errorMonitor->VerifyNotFound();
21880 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
21881 m_errorMonitor->VerifyNotFound();
21882 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
21883 m_errorMonitor->VerifyNotFound();
21884
21885 m_commandBuffer->EndCommandBuffer();
21886 m_errorMonitor->VerifyNotFound();
21887}
21888
21889TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021890 TEST_DESCRIPTION(
21891 "Positive test where we create a renderpass with an "
21892 "attachment that uses LOAD_OP_CLEAR, the first subpass "
21893 "has a valid layout, and a second subpass then uses a "
21894 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021895 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060021896 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070021897 auto depth_format = find_depth_stencil_format(m_device);
21898 if (!depth_format) {
21899 printf(" No Depth + Stencil format found. Skipped.\n");
21900 return;
21901 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021902
21903 VkAttachmentReference attach[2] = {};
21904 attach[0].attachment = 0;
21905 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21906 attach[1].attachment = 0;
21907 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
21908 VkSubpassDescription subpasses[2] = {};
21909 // First subpass clears DS attach on load
21910 subpasses[0].pDepthStencilAttachment = &attach[0];
21911 // 2nd subpass reads in DS as input attachment
21912 subpasses[1].inputAttachmentCount = 1;
21913 subpasses[1].pInputAttachments = &attach[1];
21914 VkAttachmentDescription attach_desc = {};
Tony Barbourf887b162017-03-09 10:06:46 -070021915 attach_desc.format = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021916 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
21917 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
21918 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
21919 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21920 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21921 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21922 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
21923 VkRenderPassCreateInfo rpci = {};
21924 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
21925 rpci.attachmentCount = 1;
21926 rpci.pAttachments = &attach_desc;
21927 rpci.subpassCount = 2;
21928 rpci.pSubpasses = subpasses;
21929
21930 // Now create RenderPass and verify no errors
21931 VkRenderPass rp;
21932 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
21933 m_errorMonitor->VerifyNotFound();
21934
21935 vkDestroyRenderPass(m_device->device(), rp, NULL);
21936}
21937
Tobin Ehlis01103de2017-02-16 13:22:47 -070021938TEST_F(VkPositiveLayerTest, RenderPassDepthStencilLayoutTransition) {
21939 TEST_DESCRIPTION(
21940 "Create a render pass with depth-stencil attachment where layout transition "
21941 "from UNDEFINED TO DS_READ_ONLY_OPTIMAL is set by render pass and verify that "
21942 "transition has correctly occurred at queue submit time with no validation errors.");
21943
Tony Barbour1fa09702017-03-16 12:09:08 -060021944 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070021945 auto depth_format = find_depth_stencil_format(m_device);
21946 if (!depth_format) {
21947 printf(" No Depth + Stencil format found. Skipped.\n");
21948 return;
21949 }
Tobin Ehlis01103de2017-02-16 13:22:47 -070021950 VkImageFormatProperties format_props;
Tony Barbourf887b162017-03-09 10:06:46 -070021951 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021952 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &format_props);
21953 if (format_props.maxExtent.width < 32 || format_props.maxExtent.height < 32) {
Tony Barbourf887b162017-03-09 10:06:46 -070021954 printf("Depth extent too small, RenderPassDepthStencilLayoutTransition skipped.\n");
Tobin Ehlis01103de2017-02-16 13:22:47 -070021955 return;
21956 }
21957
21958 m_errorMonitor->ExpectSuccess();
Tobin Ehlis01103de2017-02-16 13:22:47 -070021959 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21960
21961 // A renderpass with one depth/stencil attachment.
21962 VkAttachmentDescription attachment = {0,
Tony Barbourf887b162017-03-09 10:06:46 -070021963 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021964 VK_SAMPLE_COUNT_1_BIT,
21965 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21966 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21967 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21968 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21969 VK_IMAGE_LAYOUT_UNDEFINED,
21970 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
21971
21972 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
21973
21974 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
21975
21976 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
21977
21978 VkRenderPass rp;
21979 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21980 ASSERT_VK_SUCCESS(err);
21981 // A compatible ds image.
21982 VkImageObj image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -070021983 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 -070021984 ASSERT_TRUE(image.initialized());
21985
21986 VkImageViewCreateInfo ivci = {
21987 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21988 nullptr,
21989 0,
21990 image.handle(),
21991 VK_IMAGE_VIEW_TYPE_2D,
Tony Barbourf887b162017-03-09 10:06:46 -070021992 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021993 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
21994 VK_COMPONENT_SWIZZLE_IDENTITY},
21995 {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1},
21996 };
21997 VkImageView view;
21998 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21999 ASSERT_VK_SUCCESS(err);
22000
22001 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
22002 VkFramebuffer fb;
22003 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
22004 ASSERT_VK_SUCCESS(err);
22005
22006 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
22007 m_commandBuffer->BeginCommandBuffer();
22008 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
22009 vkCmdEndRenderPass(m_commandBuffer->handle());
22010 m_commandBuffer->EndCommandBuffer();
22011 QueueCommandBuffer(false);
22012 m_errorMonitor->VerifyNotFound();
22013
22014 // Cleanup
22015 vkDestroyImageView(m_device->device(), view, NULL);
22016 vkDestroyRenderPass(m_device->device(), rp, NULL);
22017 vkDestroyFramebuffer(m_device->device(), fb, NULL);
22018}
22019
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022020TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022021 TEST_DESCRIPTION(
22022 "Test that pipeline validation accepts matrices passed "
22023 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022024 m_errorMonitor->ExpectSuccess();
22025
Tony Barbour1fa09702017-03-16 12:09:08 -060022026 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022027 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22028
22029 VkVertexInputBindingDescription input_binding;
22030 memset(&input_binding, 0, sizeof(input_binding));
22031
22032 VkVertexInputAttributeDescription input_attribs[2];
22033 memset(input_attribs, 0, sizeof(input_attribs));
22034
22035 for (int i = 0; i < 2; i++) {
22036 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22037 input_attribs[i].location = i;
22038 }
22039
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022040 char const *vsSource =
22041 "#version 450\n"
22042 "\n"
22043 "layout(location=0) in mat2x4 x;\n"
22044 "out gl_PerVertex {\n"
22045 " vec4 gl_Position;\n"
22046 "};\n"
22047 "void main(){\n"
22048 " gl_Position = x[0] + x[1];\n"
22049 "}\n";
22050 char const *fsSource =
22051 "#version 450\n"
22052 "\n"
22053 "layout(location=0) out vec4 color;\n"
22054 "void main(){\n"
22055 " color = vec4(1);\n"
22056 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022057
22058 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22059 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22060
22061 VkPipelineObj pipe(m_device);
22062 pipe.AddColorAttachment();
22063 pipe.AddShader(&vs);
22064 pipe.AddShader(&fs);
22065
22066 pipe.AddVertexInputBindings(&input_binding, 1);
22067 pipe.AddVertexInputAttribs(input_attribs, 2);
22068
22069 VkDescriptorSetObj descriptorSet(m_device);
22070 descriptorSet.AppendDummy();
22071 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22072
22073 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22074
22075 /* expect success */
22076 m_errorMonitor->VerifyNotFound();
22077}
22078
22079TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
22080 m_errorMonitor->ExpectSuccess();
22081
Tony Barbour1fa09702017-03-16 12:09:08 -060022082 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022083 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22084
22085 VkVertexInputBindingDescription input_binding;
22086 memset(&input_binding, 0, sizeof(input_binding));
22087
22088 VkVertexInputAttributeDescription input_attribs[2];
22089 memset(input_attribs, 0, sizeof(input_attribs));
22090
22091 for (int i = 0; i < 2; i++) {
22092 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22093 input_attribs[i].location = i;
22094 }
22095
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022096 char const *vsSource =
22097 "#version 450\n"
22098 "\n"
22099 "layout(location=0) in vec4 x[2];\n"
22100 "out gl_PerVertex {\n"
22101 " vec4 gl_Position;\n"
22102 "};\n"
22103 "void main(){\n"
22104 " gl_Position = x[0] + x[1];\n"
22105 "}\n";
22106 char const *fsSource =
22107 "#version 450\n"
22108 "\n"
22109 "layout(location=0) out vec4 color;\n"
22110 "void main(){\n"
22111 " color = vec4(1);\n"
22112 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022113
22114 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22115 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22116
22117 VkPipelineObj pipe(m_device);
22118 pipe.AddColorAttachment();
22119 pipe.AddShader(&vs);
22120 pipe.AddShader(&fs);
22121
22122 pipe.AddVertexInputBindings(&input_binding, 1);
22123 pipe.AddVertexInputAttribs(input_attribs, 2);
22124
22125 VkDescriptorSetObj descriptorSet(m_device);
22126 descriptorSet.AppendDummy();
22127 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22128
22129 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22130
22131 m_errorMonitor->VerifyNotFound();
22132}
22133
22134TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022135 TEST_DESCRIPTION(
22136 "Test that pipeline validation accepts consuming a vertex attribute "
22137 "through multiple vertex shader inputs, each consuming a different "
22138 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022139 m_errorMonitor->ExpectSuccess();
22140
Tony Barbour1fa09702017-03-16 12:09:08 -060022141 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022142 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22143
22144 VkVertexInputBindingDescription input_binding;
22145 memset(&input_binding, 0, sizeof(input_binding));
22146
22147 VkVertexInputAttributeDescription input_attribs[3];
22148 memset(input_attribs, 0, sizeof(input_attribs));
22149
22150 for (int i = 0; i < 3; i++) {
22151 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22152 input_attribs[i].location = i;
22153 }
22154
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022155 char const *vsSource =
22156 "#version 450\n"
22157 "\n"
22158 "layout(location=0) in vec4 x;\n"
22159 "layout(location=1) in vec3 y1;\n"
22160 "layout(location=1, component=3) in float y2;\n"
22161 "layout(location=2) in vec4 z;\n"
22162 "out gl_PerVertex {\n"
22163 " vec4 gl_Position;\n"
22164 "};\n"
22165 "void main(){\n"
22166 " gl_Position = x + vec4(y1, y2) + z;\n"
22167 "}\n";
22168 char const *fsSource =
22169 "#version 450\n"
22170 "\n"
22171 "layout(location=0) out vec4 color;\n"
22172 "void main(){\n"
22173 " color = vec4(1);\n"
22174 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022175
22176 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22177 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22178
22179 VkPipelineObj pipe(m_device);
22180 pipe.AddColorAttachment();
22181 pipe.AddShader(&vs);
22182 pipe.AddShader(&fs);
22183
22184 pipe.AddVertexInputBindings(&input_binding, 1);
22185 pipe.AddVertexInputAttribs(input_attribs, 3);
22186
22187 VkDescriptorSetObj descriptorSet(m_device);
22188 descriptorSet.AppendDummy();
22189 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22190
22191 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22192
22193 m_errorMonitor->VerifyNotFound();
22194}
22195
22196TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
22197 m_errorMonitor->ExpectSuccess();
22198
Tony Barbour1fa09702017-03-16 12:09:08 -060022199 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022200 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22201
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022202 char const *vsSource =
22203 "#version 450\n"
22204 "out gl_PerVertex {\n"
22205 " vec4 gl_Position;\n"
22206 "};\n"
22207 "void main(){\n"
22208 " gl_Position = vec4(0);\n"
22209 "}\n";
22210 char const *fsSource =
22211 "#version 450\n"
22212 "\n"
22213 "layout(location=0) out vec4 color;\n"
22214 "void main(){\n"
22215 " color = vec4(1);\n"
22216 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022217
22218 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22219 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22220
22221 VkPipelineObj pipe(m_device);
22222 pipe.AddColorAttachment();
22223 pipe.AddShader(&vs);
22224 pipe.AddShader(&fs);
22225
22226 VkDescriptorSetObj descriptorSet(m_device);
22227 descriptorSet.AppendDummy();
22228 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22229
22230 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22231
22232 m_errorMonitor->VerifyNotFound();
22233}
22234
22235TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022236 TEST_DESCRIPTION(
22237 "Test that pipeline validation accepts the relaxed type matching rules "
22238 "set out in 14.1.3: fundamental type must match, and producer side must "
22239 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022240 m_errorMonitor->ExpectSuccess();
22241
22242 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
22243
Tony Barbour1fa09702017-03-16 12:09:08 -060022244 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022245 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22246
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022247 char const *vsSource =
22248 "#version 450\n"
22249 "out gl_PerVertex {\n"
22250 " vec4 gl_Position;\n"
22251 "};\n"
22252 "layout(location=0) out vec3 x;\n"
22253 "layout(location=1) out ivec3 y;\n"
22254 "layout(location=2) out vec3 z;\n"
22255 "void main(){\n"
22256 " gl_Position = vec4(0);\n"
22257 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
22258 "}\n";
22259 char const *fsSource =
22260 "#version 450\n"
22261 "\n"
22262 "layout(location=0) out vec4 color;\n"
22263 "layout(location=0) in float x;\n"
22264 "layout(location=1) flat in int y;\n"
22265 "layout(location=2) in vec2 z;\n"
22266 "void main(){\n"
22267 " color = vec4(1 + x + y + z.x);\n"
22268 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022269
22270 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22271 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22272
22273 VkPipelineObj pipe(m_device);
22274 pipe.AddColorAttachment();
22275 pipe.AddShader(&vs);
22276 pipe.AddShader(&fs);
22277
22278 VkDescriptorSetObj descriptorSet(m_device);
22279 descriptorSet.AppendDummy();
22280 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22281
22282 VkResult err = VK_SUCCESS;
22283 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22284 ASSERT_VK_SUCCESS(err);
22285
22286 m_errorMonitor->VerifyNotFound();
22287}
22288
22289TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022290 TEST_DESCRIPTION(
22291 "Test that pipeline validation accepts per-vertex variables "
22292 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022293 m_errorMonitor->ExpectSuccess();
22294
Tony Barbour1fa09702017-03-16 12:09:08 -060022295 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022296 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22297
22298 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022299 printf(" Device does not support tessellation shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022300 return;
22301 }
22302
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022303 char const *vsSource =
22304 "#version 450\n"
22305 "void main(){}\n";
22306 char const *tcsSource =
22307 "#version 450\n"
22308 "layout(location=0) out int x[];\n"
22309 "layout(vertices=3) out;\n"
22310 "void main(){\n"
22311 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
22312 " gl_TessLevelInner[0] = 1;\n"
22313 " x[gl_InvocationID] = gl_InvocationID;\n"
22314 "}\n";
22315 char const *tesSource =
22316 "#version 450\n"
22317 "layout(triangles, equal_spacing, cw) in;\n"
22318 "layout(location=0) in int x[];\n"
22319 "out gl_PerVertex { vec4 gl_Position; };\n"
22320 "void main(){\n"
22321 " gl_Position.xyz = gl_TessCoord;\n"
22322 " gl_Position.w = x[0] + x[1] + x[2];\n"
22323 "}\n";
22324 char const *fsSource =
22325 "#version 450\n"
22326 "layout(location=0) out vec4 color;\n"
22327 "void main(){\n"
22328 " color = vec4(1);\n"
22329 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022330
22331 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22332 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
22333 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
22334 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22335
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022336 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
22337 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022338
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022339 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022340
22341 VkPipelineObj pipe(m_device);
22342 pipe.SetInputAssembly(&iasci);
22343 pipe.SetTessellation(&tsci);
22344 pipe.AddColorAttachment();
22345 pipe.AddShader(&vs);
22346 pipe.AddShader(&tcs);
22347 pipe.AddShader(&tes);
22348 pipe.AddShader(&fs);
22349
22350 VkDescriptorSetObj descriptorSet(m_device);
22351 descriptorSet.AppendDummy();
22352 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22353
22354 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22355
22356 m_errorMonitor->VerifyNotFound();
22357}
22358
22359TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022360 TEST_DESCRIPTION(
22361 "Test that pipeline validation accepts a user-defined "
22362 "interface block passed into the geometry shader. This "
22363 "is interesting because the 'extra' array level is not "
22364 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022365 m_errorMonitor->ExpectSuccess();
22366
Tony Barbour1fa09702017-03-16 12:09:08 -060022367 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022368 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22369
22370 if (!m_device->phy().features().geometryShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022371 printf(" Device does not support geometry shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022372 return;
22373 }
22374
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022375 char const *vsSource =
22376 "#version 450\n"
22377 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
22378 "void main(){\n"
22379 " vs_out.x = vec4(1);\n"
22380 "}\n";
22381 char const *gsSource =
22382 "#version 450\n"
22383 "layout(triangles) in;\n"
22384 "layout(triangle_strip, max_vertices=3) out;\n"
22385 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
22386 "out gl_PerVertex { vec4 gl_Position; };\n"
22387 "void main() {\n"
22388 " gl_Position = gs_in[0].x;\n"
22389 " EmitVertex();\n"
22390 "}\n";
22391 char const *fsSource =
22392 "#version 450\n"
22393 "layout(location=0) out vec4 color;\n"
22394 "void main(){\n"
22395 " color = vec4(1);\n"
22396 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022397
22398 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22399 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
22400 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22401
22402 VkPipelineObj pipe(m_device);
22403 pipe.AddColorAttachment();
22404 pipe.AddShader(&vs);
22405 pipe.AddShader(&gs);
22406 pipe.AddShader(&fs);
22407
22408 VkDescriptorSetObj descriptorSet(m_device);
22409 descriptorSet.AppendDummy();
22410 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22411
22412 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22413
22414 m_errorMonitor->VerifyNotFound();
22415}
22416
22417TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022418 TEST_DESCRIPTION(
22419 "Test that pipeline validation accepts basic use of 64bit vertex "
22420 "attributes. This is interesting because they consume multiple "
22421 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022422 m_errorMonitor->ExpectSuccess();
22423
Tony Barbour1fa09702017-03-16 12:09:08 -060022424 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022425 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22426
22427 if (!m_device->phy().features().shaderFloat64) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022428 printf(" Device does not support 64bit vertex attributes; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022429 return;
22430 }
22431
22432 VkVertexInputBindingDescription input_bindings[1];
22433 memset(input_bindings, 0, sizeof(input_bindings));
22434
22435 VkVertexInputAttributeDescription input_attribs[4];
22436 memset(input_attribs, 0, sizeof(input_attribs));
22437 input_attribs[0].location = 0;
22438 input_attribs[0].offset = 0;
22439 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22440 input_attribs[1].location = 2;
22441 input_attribs[1].offset = 32;
22442 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22443 input_attribs[2].location = 4;
22444 input_attribs[2].offset = 64;
22445 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22446 input_attribs[3].location = 6;
22447 input_attribs[3].offset = 96;
22448 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22449
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022450 char const *vsSource =
22451 "#version 450\n"
22452 "\n"
22453 "layout(location=0) in dmat4 x;\n"
22454 "out gl_PerVertex {\n"
22455 " vec4 gl_Position;\n"
22456 "};\n"
22457 "void main(){\n"
22458 " gl_Position = vec4(x[0][0]);\n"
22459 "}\n";
22460 char const *fsSource =
22461 "#version 450\n"
22462 "\n"
22463 "layout(location=0) out vec4 color;\n"
22464 "void main(){\n"
22465 " color = vec4(1);\n"
22466 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022467
22468 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22469 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22470
22471 VkPipelineObj pipe(m_device);
22472 pipe.AddColorAttachment();
22473 pipe.AddShader(&vs);
22474 pipe.AddShader(&fs);
22475
22476 pipe.AddVertexInputBindings(input_bindings, 1);
22477 pipe.AddVertexInputAttribs(input_attribs, 4);
22478
22479 VkDescriptorSetObj descriptorSet(m_device);
22480 descriptorSet.AppendDummy();
22481 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22482
22483 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22484
22485 m_errorMonitor->VerifyNotFound();
22486}
22487
22488TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
22489 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
22490 m_errorMonitor->ExpectSuccess();
22491
Tony Barbour1fa09702017-03-16 12:09:08 -060022492 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022493
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022494 char const *vsSource =
22495 "#version 450\n"
22496 "\n"
22497 "out gl_PerVertex {\n"
22498 " vec4 gl_Position;\n"
22499 "};\n"
22500 "void main(){\n"
22501 " gl_Position = vec4(1);\n"
22502 "}\n";
22503 char const *fsSource =
22504 "#version 450\n"
22505 "\n"
22506 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
22507 "layout(location=0) out vec4 color;\n"
22508 "void main() {\n"
22509 " color = subpassLoad(x);\n"
22510 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022511
22512 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22513 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22514
22515 VkPipelineObj pipe(m_device);
22516 pipe.AddShader(&vs);
22517 pipe.AddShader(&fs);
22518 pipe.AddColorAttachment();
22519 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22520
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022521 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
22522 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022523 VkDescriptorSetLayout dsl;
22524 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22525 ASSERT_VK_SUCCESS(err);
22526
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022527 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022528 VkPipelineLayout pl;
22529 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22530 ASSERT_VK_SUCCESS(err);
22531
22532 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022533 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22534 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22535 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
22536 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22537 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_GENERAL, VK_IMAGE_LAYOUT_GENERAL},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022538 };
22539 VkAttachmentReference color = {
22540 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22541 };
22542 VkAttachmentReference input = {
22543 1, VK_IMAGE_LAYOUT_GENERAL,
22544 };
22545
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022546 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022547
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022548 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022549 VkRenderPass rp;
22550 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22551 ASSERT_VK_SUCCESS(err);
22552
22553 // should be OK. would go wrong here if it's going to...
22554 pipe.CreateVKPipeline(pl, rp);
22555
22556 m_errorMonitor->VerifyNotFound();
22557
22558 vkDestroyRenderPass(m_device->device(), rp, nullptr);
22559 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22560 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22561}
22562
22563TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022564 TEST_DESCRIPTION(
22565 "Test that pipeline validation accepts a compute pipeline which declares a "
22566 "descriptor-backed resource which is not provided, but the shader does not "
22567 "statically use it. This is interesting because it requires compute pipelines "
22568 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022569 m_errorMonitor->ExpectSuccess();
22570
Tony Barbour1fa09702017-03-16 12:09:08 -060022571 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022572
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022573 char const *csSource =
22574 "#version 450\n"
22575 "\n"
22576 "layout(local_size_x=1) in;\n"
22577 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
22578 "void main(){\n"
22579 " // x is not used.\n"
22580 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022581
22582 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22583
22584 VkDescriptorSetObj descriptorSet(m_device);
22585 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22586
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022587 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22588 nullptr,
22589 0,
22590 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22591 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22592 descriptorSet.GetPipelineLayout(),
22593 VK_NULL_HANDLE,
22594 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022595
22596 VkPipeline pipe;
22597 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22598
22599 m_errorMonitor->VerifyNotFound();
22600
22601 if (err == VK_SUCCESS) {
22602 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22603 }
22604}
22605
22606TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022607 TEST_DESCRIPTION(
22608 "Test that pipeline validation accepts a shader consuming only the "
22609 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022610 m_errorMonitor->ExpectSuccess();
22611
Tony Barbour1fa09702017-03-16 12:09:08 -060022612 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022613
22614 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022615 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22616 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22617 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022618 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022619 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022620 VkDescriptorSetLayout dsl;
22621 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22622 ASSERT_VK_SUCCESS(err);
22623
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022624 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022625 VkPipelineLayout pl;
22626 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22627 ASSERT_VK_SUCCESS(err);
22628
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022629 char const *csSource =
22630 "#version 450\n"
22631 "\n"
22632 "layout(local_size_x=1) in;\n"
22633 "layout(set=0, binding=0) uniform sampler s;\n"
22634 "layout(set=0, binding=1) uniform texture2D t;\n"
22635 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22636 "void main() {\n"
22637 " x = texture(sampler2D(t, s), vec2(0));\n"
22638 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022639 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22640
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022641 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22642 nullptr,
22643 0,
22644 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22645 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22646 pl,
22647 VK_NULL_HANDLE,
22648 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022649
22650 VkPipeline pipe;
22651 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22652
22653 m_errorMonitor->VerifyNotFound();
22654
22655 if (err == VK_SUCCESS) {
22656 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22657 }
22658
22659 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22660 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22661}
22662
22663TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022664 TEST_DESCRIPTION(
22665 "Test that pipeline validation accepts a shader consuming only the "
22666 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022667 m_errorMonitor->ExpectSuccess();
22668
Tony Barbour1fa09702017-03-16 12:09:08 -060022669 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022670
22671 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022672 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22673 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22674 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022675 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022676 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022677 VkDescriptorSetLayout dsl;
22678 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22679 ASSERT_VK_SUCCESS(err);
22680
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022681 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022682 VkPipelineLayout pl;
22683 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22684 ASSERT_VK_SUCCESS(err);
22685
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022686 char const *csSource =
22687 "#version 450\n"
22688 "\n"
22689 "layout(local_size_x=1) in;\n"
22690 "layout(set=0, binding=0) uniform texture2D t;\n"
22691 "layout(set=0, binding=1) uniform sampler s;\n"
22692 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22693 "void main() {\n"
22694 " x = texture(sampler2D(t, s), vec2(0));\n"
22695 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022696 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22697
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022698 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22699 nullptr,
22700 0,
22701 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22702 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22703 pl,
22704 VK_NULL_HANDLE,
22705 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022706
22707 VkPipeline pipe;
22708 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22709
22710 m_errorMonitor->VerifyNotFound();
22711
22712 if (err == VK_SUCCESS) {
22713 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22714 }
22715
22716 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22717 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22718}
22719
22720TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022721 TEST_DESCRIPTION(
22722 "Test that pipeline validation accepts a shader consuming "
22723 "both the sampler and the image of a combined image+sampler "
22724 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022725 m_errorMonitor->ExpectSuccess();
22726
Tony Barbour1fa09702017-03-16 12:09:08 -060022727 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022728
22729 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022730 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22731 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022732 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022733 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022734 VkDescriptorSetLayout dsl;
22735 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22736 ASSERT_VK_SUCCESS(err);
22737
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022738 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022739 VkPipelineLayout pl;
22740 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22741 ASSERT_VK_SUCCESS(err);
22742
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022743 char const *csSource =
22744 "#version 450\n"
22745 "\n"
22746 "layout(local_size_x=1) in;\n"
22747 "layout(set=0, binding=0) uniform texture2D t;\n"
22748 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
22749 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
22750 "void main() {\n"
22751 " x = texture(sampler2D(t, s), vec2(0));\n"
22752 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022753 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22754
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022755 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22756 nullptr,
22757 0,
22758 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22759 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22760 pl,
22761 VK_NULL_HANDLE,
22762 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022763
22764 VkPipeline pipe;
22765 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22766
22767 m_errorMonitor->VerifyNotFound();
22768
22769 if (err == VK_SUCCESS) {
22770 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22771 }
22772
22773 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22774 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22775}
22776
Tony Barbour3ed87a02017-03-15 16:19:02 -060022777TEST_F(VkPositiveLayerTest, Maintenance1Tests) {
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022778 TEST_DESCRIPTION("Validate various special cases for the Maintenance1_KHR extension");
22779
Tony Barbour3ed87a02017-03-15 16:19:02 -060022780 device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
Tony Barbour73c0f352017-03-16 15:55:38 -060022781 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour3ed87a02017-03-15 16:19:02 -060022782
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022783 // Ensure that extension is available and enabled.
22784 uint32_t extension_count = 0;
22785 bool supports_maintenance1_extension = false;
22786 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22787 ASSERT_VK_SUCCESS(err);
22788 if (extension_count > 0) {
22789 std::vector<VkExtensionProperties> available_extensions(extension_count);
22790
22791 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22792 ASSERT_VK_SUCCESS(err);
22793 for (const auto &extension_props : available_extensions) {
22794 if (strcmp(extension_props.extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME) == 0) {
22795 supports_maintenance1_extension = true;
22796 }
22797 }
22798 }
22799
22800 // Proceed if extension is supported by hardware
22801 if (!supports_maintenance1_extension) {
22802 printf(" Maintenance1 Extension not supported, skipping tests\n");
22803 return;
22804 }
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022805
22806 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060022807 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022808 VkCommandBuffer cmd_buf;
22809 VkCommandBufferAllocateInfo alloc_info;
22810 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22811 alloc_info.pNext = NULL;
22812 alloc_info.commandBufferCount = 1;
Mike Schuchardt06304c22017-03-01 17:09:09 -070022813 alloc_info.commandPool = m_commandPool->handle();
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022814 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22815 vkAllocateCommandBuffers(m_device->device(), &alloc_info, &cmd_buf);
22816
22817 VkCommandBufferBeginInfo cb_binfo;
22818 cb_binfo.pNext = NULL;
22819 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22820 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
22821 cb_binfo.flags = 0;
22822 vkBeginCommandBuffer(cmd_buf, &cb_binfo);
22823 // Set Negative height, should give error if Maintenance 1 is not enabled
22824 VkViewport viewport = {0, 0, 16, -16, 0, 1};
22825 vkCmdSetViewport(cmd_buf, 0, 1, &viewport);
22826 vkEndCommandBuffer(cmd_buf);
22827
22828 m_errorMonitor->VerifyNotFound();
22829}
22830
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022831TEST_F(VkPositiveLayerTest, ValidStructPNext) {
22832 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
22833
Tony Barbour1fa09702017-03-16 12:09:08 -060022834 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022835
22836 // Positive test to check parameter_validation and unique_objects support
22837 // for NV_dedicated_allocation
22838 uint32_t extension_count = 0;
22839 bool supports_nv_dedicated_allocation = false;
22840 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22841 ASSERT_VK_SUCCESS(err);
22842
22843 if (extension_count > 0) {
22844 std::vector<VkExtensionProperties> available_extensions(extension_count);
22845
22846 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22847 ASSERT_VK_SUCCESS(err);
22848
22849 for (const auto &extension_props : available_extensions) {
22850 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
22851 supports_nv_dedicated_allocation = true;
22852 }
22853 }
22854 }
22855
22856 if (supports_nv_dedicated_allocation) {
22857 m_errorMonitor->ExpectSuccess();
22858
22859 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
22860 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
22861 dedicated_buffer_create_info.pNext = nullptr;
22862 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
22863
22864 uint32_t queue_family_index = 0;
22865 VkBufferCreateInfo buffer_create_info = {};
22866 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
22867 buffer_create_info.pNext = &dedicated_buffer_create_info;
22868 buffer_create_info.size = 1024;
22869 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
22870 buffer_create_info.queueFamilyIndexCount = 1;
22871 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
22872
22873 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070022874 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022875 ASSERT_VK_SUCCESS(err);
22876
22877 VkMemoryRequirements memory_reqs;
22878 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
22879
22880 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
22881 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
22882 dedicated_memory_info.pNext = nullptr;
22883 dedicated_memory_info.buffer = buffer;
22884 dedicated_memory_info.image = VK_NULL_HANDLE;
22885
22886 VkMemoryAllocateInfo memory_info = {};
22887 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
22888 memory_info.pNext = &dedicated_memory_info;
22889 memory_info.allocationSize = memory_reqs.size;
22890
22891 bool pass;
22892 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
22893 ASSERT_TRUE(pass);
22894
22895 VkDeviceMemory buffer_memory;
22896 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
22897 ASSERT_VK_SUCCESS(err);
22898
22899 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
22900 ASSERT_VK_SUCCESS(err);
22901
22902 vkDestroyBuffer(m_device->device(), buffer, NULL);
22903 vkFreeMemory(m_device->device(), buffer_memory, NULL);
22904
22905 m_errorMonitor->VerifyNotFound();
22906 }
22907}
22908
22909TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
22910 VkResult err;
22911
22912 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
22913
Tony Barbour1fa09702017-03-16 12:09:08 -060022914 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022915 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22916
22917 std::vector<const char *> device_extension_names;
22918 auto features = m_device->phy().features();
22919 // Artificially disable support for non-solid fill modes
22920 features.fillModeNonSolid = false;
22921 // The sacrificial device object
22922 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
22923
22924 VkRenderpassObj render_pass(&test_device);
22925
22926 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
22927 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
22928 pipeline_layout_ci.setLayoutCount = 0;
22929 pipeline_layout_ci.pSetLayouts = NULL;
22930
22931 VkPipelineLayout pipeline_layout;
22932 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
22933 ASSERT_VK_SUCCESS(err);
22934
22935 VkPipelineRasterizationStateCreateInfo rs_ci = {};
22936 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
22937 rs_ci.pNext = nullptr;
22938 rs_ci.lineWidth = 1.0f;
22939 rs_ci.rasterizerDiscardEnable = true;
22940
22941 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
22942 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22943
22944 // Set polygonMode=FILL. No error is expected
22945 m_errorMonitor->ExpectSuccess();
22946 {
22947 VkPipelineObj pipe(&test_device);
22948 pipe.AddShader(&vs);
22949 pipe.AddShader(&fs);
22950 pipe.AddColorAttachment();
22951 // Set polygonMode to a good value
22952 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
22953 pipe.SetRasterization(&rs_ci);
22954 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
22955 }
22956 m_errorMonitor->VerifyNotFound();
22957
22958 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
22959}
22960
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022961#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022962TEST_F(VkPositiveLayerTest, LongFenceChain)
22963{
22964 m_errorMonitor->ExpectSuccess();
22965
Tony Barbour1fa09702017-03-16 12:09:08 -060022966 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022967 VkResult err;
22968
22969 std::vector<VkFence> fences;
22970
22971 const int chainLength = 32768;
22972
22973 for (int i = 0; i < chainLength; i++) {
22974 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
22975 VkFence fence;
22976 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
22977 ASSERT_VK_SUCCESS(err);
22978
22979 fences.push_back(fence);
22980
22981 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
22982 0, nullptr, 0, nullptr };
22983 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
22984 ASSERT_VK_SUCCESS(err);
22985
22986 }
22987
22988 // BOOM, stack overflow.
22989 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
22990
22991 for (auto fence : fences)
22992 vkDestroyFence(m_device->device(), fence, nullptr);
22993
22994 m_errorMonitor->VerifyNotFound();
22995}
22996#endif
22997
Cody Northrop1242dfd2016-07-13 17:24:59 -060022998#if defined(ANDROID) && defined(VALIDATION_APK)
22999static bool initialized = false;
23000static bool active = false;
23001
23002// Convert Intents to argv
23003// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023004std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023005 std::vector<std::string> args;
23006 JavaVM &vm = *app.activity->vm;
23007 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023008 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023009
23010 JNIEnv &env = *p_env;
23011 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023012 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023013 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023014 jmethodID get_string_extra_method =
23015 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060023016 jvalue get_string_extra_args;
23017 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023018 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060023019
23020 std::string args_str;
23021 if (extra_str) {
23022 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
23023 args_str = extra_utf;
23024 env.ReleaseStringUTFChars(extra_str, extra_utf);
23025 env.DeleteLocalRef(extra_str);
23026 }
23027
23028 env.DeleteLocalRef(get_string_extra_args.l);
23029 env.DeleteLocalRef(intent);
23030 vm.DetachCurrentThread();
23031
23032 // split args_str
23033 std::stringstream ss(args_str);
23034 std::string arg;
23035 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023036 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023037 }
23038
23039 return args;
23040}
23041
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023042static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023043
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023044static void processCommand(struct android_app *app, int32_t cmd) {
23045 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023046 case APP_CMD_INIT_WINDOW: {
23047 if (app->window) {
23048 initialized = true;
23049 }
23050 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023051 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023052 case APP_CMD_GAINED_FOCUS: {
23053 active = true;
23054 break;
23055 }
23056 case APP_CMD_LOST_FOCUS: {
23057 active = false;
23058 break;
23059 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023060 }
23061}
23062
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023063void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023064 app_dummy();
23065
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023066 const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060023067
23068 int vulkanSupport = InitVulkan();
23069 if (vulkanSupport == 0) {
23070 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
23071 return;
23072 }
23073
23074 app->onAppCmd = processCommand;
23075 app->onInputEvent = processInput;
23076
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023077 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023078 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023079 struct android_poll_source *source;
23080 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023081 if (source) {
23082 source->process(app, source);
23083 }
23084
23085 if (app->destroyRequested != 0) {
23086 VkTestFramework::Finish();
23087 return;
23088 }
23089 }
23090
23091 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023092 // Use the following key to send arguments to gtest, i.e.
23093 // --es args "--gtest_filter=-VkLayerTest.foo"
23094 const char key[] = "args";
23095 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023096
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023097 std::string filter = "";
23098 if (args.size() > 0) {
23099 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
23100 filter += args[0];
23101 } else {
23102 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
23103 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023104
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023105 int argc = 2;
23106 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
23107 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023108
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023109 // Route output to files until we can override the gtest output
23110 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
23111 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023112
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023113 ::testing::InitGoogleTest(&argc, argv);
23114 VkTestFramework::InitArgs(&argc, argv);
23115 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023116
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023117 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023118
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023119 if (result != 0) {
23120 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
23121 } else {
23122 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
23123 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023124
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023125 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023126
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023127 fclose(stdout);
23128 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023129
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023130 ANativeActivity_finish(app->activity);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023131 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023132 }
23133 }
23134}
23135#endif
23136
Tony Barbour300a6082015-04-07 13:44:53 -060023137int main(int argc, char **argv) {
23138 int result;
23139
Cody Northrop8e54a402016-03-08 22:25:52 -070023140#ifdef ANDROID
23141 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023142 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070023143#endif
23144
Tony Barbour300a6082015-04-07 13:44:53 -060023145 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060023146 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060023147
23148 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
23149
23150 result = RUN_ALL_TESTS();
23151
Tony Barbour6918cd52015-04-09 12:58:51 -060023152 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060023153 return result;
23154}