blob: db824ddd498d52beaeba6f3763717f3241ffa22d [file] [log] [blame]
Karl Schultz6addd812016-02-02 17:17:23 -07001/*
Mike Weiblen40b160e2017-02-06 19:21:52 -07002 * Copyright (c) 2015-2017 The Khronos Group Inc.
3 * Copyright (c) 2015-2017 Valve Corporation
4 * Copyright (c) 2015-2017 LunarG, Inc.
5 * Copyright (c) 2015-2017 Google, Inc.
Karl Schultz6addd812016-02-02 17:17:23 -07006 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -06007 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
Karl Schultz6addd812016-02-02 17:17:23 -070010 *
Jon Ashburn3ebf1252016-04-19 11:30:31 -060011 * http://www.apache.org/licenses/LICENSE-2.0
Karl Schultz6addd812016-02-02 17:17:23 -070012 *
13 * Author: Chia-I Wu <olvaffe@gmail.com>
14 * Author: Chris Forbes <chrisf@ijw.co.nz>
15 * Author: Courtney Goeltzenleuchter <courtney@LunarG.com>
16 * Author: Mark Lobodzinski <mark@lunarg.com>
17 * Author: Mike Stroyan <mike@LunarG.com>
18 * Author: Tobin Ehlis <tobine@google.com>
19 * Author: Tony Barbour <tony@LunarG.com>
Cody Northrop1242dfd2016-07-13 17:24:59 -060020 * Author: Cody Northrop <cnorthrop@google.com>
Dave Houlton59a20702017-02-02 17:26:23 -070021 * Author: Dave Houlton <daveh@lunarg.com>
Karl Schultz6addd812016-02-02 17:17:23 -070022 */
Tony Barbour65c48b32015-11-17 10:02:56 -070023
Cody Northrop8e54a402016-03-08 22:25:52 -070024#ifdef ANDROID
25#include "vulkan_wrapper.h"
26#else
David Pinedo9316d3b2015-11-06 12:54:48 -070027#include <vulkan/vulkan.h>
Cody Northrop8e54a402016-03-08 22:25:52 -070028#endif
Cody Northrop1242dfd2016-07-13 17:24:59 -060029
30#if defined(ANDROID) && defined(VALIDATION_APK)
31#include <android/log.h>
32#include <android_native_app_glue.h>
33#endif
34
Jon Ashburn7fa7e222016-02-02 12:08:10 -070035#include "icd-spv.h"
Mark Lobodzinskice751c62016-09-08 10:45:35 -060036#include "test_common.h"
37#include "vk_layer_config.h"
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060038#include "vk_validation_error_messages.h"
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060039#include "vkrenderframework.h"
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070040
41#include <algorithm>
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060042#include <limits.h>
43#include <unordered_set>
Tony Barbour300a6082015-04-07 13:44:53 -060044
Mark Lobodzinski3780e142015-05-14 15:08:13 -050045#define GLM_FORCE_RADIANS
46#include "glm/glm.hpp"
47#include <glm/gtc/matrix_transform.hpp>
48
49//--------------------------------------------------------------------------------------
50// Mesh and VertexFormat Data
51//--------------------------------------------------------------------------------------
Karl Schultz6addd812016-02-02 17:17:23 -070052struct Vertex {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070053 float posX, posY, posZ, posW; // Position data
54 float r, g, b, a; // Color
Mark Lobodzinski3780e142015-05-14 15:08:13 -050055};
56
Karl Schultz6addd812016-02-02 17:17:23 -070057#define XYZ1(_x_, _y_, _z_) (_x_), (_y_), (_z_), 1.f
Mark Lobodzinski3780e142015-05-14 15:08:13 -050058
59typedef enum _BsoFailSelect {
Karl Schultz6addd812016-02-02 17:17:23 -070060 BsoFailNone = 0x00000000,
61 BsoFailLineWidth = 0x00000001,
62 BsoFailDepthBias = 0x00000002,
63 BsoFailViewport = 0x00000004,
64 BsoFailScissor = 0x00000008,
65 BsoFailBlend = 0x00000010,
66 BsoFailDepthBounds = 0x00000020,
67 BsoFailStencilReadMask = 0x00000040,
68 BsoFailStencilWriteMask = 0x00000080,
69 BsoFailStencilReference = 0x00000100,
Mark Muellerd4914412016-06-13 17:52:06 -060070 BsoFailCmdClearAttachments = 0x00000200,
Tobin Ehlis379ba3b2016-07-19 11:22:29 -060071 BsoFailIndexBuffer = 0x00000400,
Mark Lobodzinski3780e142015-05-14 15:08:13 -050072} BsoFailSelect;
73
74struct vktriangle_vs_uniform {
75 // Must start with MVP
Karl Schultz6addd812016-02-02 17:17:23 -070076 float mvp[4][4];
77 float position[3][4];
78 float color[3][4];
Mark Lobodzinski3780e142015-05-14 15:08:13 -050079};
80
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070081static const char bindStateVertShaderText[] =
82 "#version 450\n"
83 "vec2 vertices[3];\n"
84 "out gl_PerVertex {\n"
85 " vec4 gl_Position;\n"
86 "};\n"
87 "void main() {\n"
88 " vertices[0] = vec2(-1.0, -1.0);\n"
89 " vertices[1] = vec2( 1.0, -1.0);\n"
90 " vertices[2] = vec2( 0.0, 1.0);\n"
91 " gl_Position = vec4(vertices[gl_VertexIndex % 3], 0.0, 1.0);\n"
92 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -050093
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070094static const char bindStateFragShaderText[] =
95 "#version 450\n"
96 "\n"
97 "layout(location = 0) out vec4 uFragColor;\n"
98 "void main(){\n"
99 " uFragColor = vec4(0,1,0,1);\n"
100 "}\n";
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500101
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600102static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
103 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
104 void *pUserData);
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600105
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600106// ErrorMonitor Usage:
107//
Dave Houltonfbf52152017-01-06 12:55:29 -0700108// Call SetDesiredFailureMsg with a string to be compared against all
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600109// encountered log messages, or a validation error enum identifying
110// desired error message. Passing NULL or VALIDATION_ERROR_MAX_ENUM
111// will match all log messages. logMsg will return true for skipCall
112// only if msg is matched or NULL.
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600113//
Dave Houltonfbf52152017-01-06 12:55:29 -0700114// Call VerifyFound to determine if all desired failure messages
115// were encountered. Call VerifyNotFound to determine if any unexpected
116// failure was encountered.
Tony Barbour300a6082015-04-07 13:44:53 -0600117class ErrorMonitor {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700118 public:
Karl Schultz6addd812016-02-02 17:17:23 -0700119 ErrorMonitor() {
Dave Houltonfbf52152017-01-06 12:55:29 -0700120 test_platform_thread_create_mutex(&mutex_);
121 test_platform_thread_lock_mutex(&mutex_);
122 Reset();
123 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600124 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600125
Dave Houltonfbf52152017-01-06 12:55:29 -0700126 ~ErrorMonitor() { test_platform_thread_delete_mutex(&mutex_); }
Dustin Graves48458142016-04-29 16:11:55 -0600127
Dave Houltonfbf52152017-01-06 12:55:29 -0700128 // Set monitor to pristine state
129 void Reset() {
130 message_flags_ = VK_DEBUG_REPORT_ERROR_BIT_EXT;
131 bailout_ = NULL;
132 message_found_ = VK_FALSE;
133 failure_message_strings_.clear();
134 desired_message_strings_.clear();
135 desired_message_ids_.clear();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700136 ignore_message_strings_.clear();
Dave Houltonfbf52152017-01-06 12:55:29 -0700137 other_messages_.clear();
138 message_outstanding_count_ = 0;
139 }
140
141 // ErrorMonitor will look for an error message containing the specified string(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700142 void SetDesiredFailureMsg(const VkFlags msgFlags, const char *const msgString) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700143 test_platform_thread_lock_mutex(&mutex_);
144 desired_message_strings_.insert(msgString);
145 message_flags_ |= msgFlags;
146 message_outstanding_count_++;
147 test_platform_thread_unlock_mutex(&mutex_);
Tony Barbour300a6082015-04-07 13:44:53 -0600148 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600149
Jeremy Hayesde6d96c2017-02-01 15:22:32 -0700150 // ErrorMonitor will look for an error message containing the specified string(s)
151 template <typename Iter>
152 void SetDesiredFailureMsg(const VkFlags msgFlags, Iter iter, const Iter end) {
153 for (; iter != end; ++iter) {
154 SetDesiredFailureMsg(msgFlags, *iter);
155 }
156 }
157
Dave Houltonfbf52152017-01-06 12:55:29 -0700158 // ErrorMonitor will look for a message ID matching the specified one(s)
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700159 void SetDesiredFailureMsg(const VkFlags msgFlags, const UNIQUE_VALIDATION_ERROR_CODE msg_id) {
Dave Houltonfbf52152017-01-06 12:55:29 -0700160 test_platform_thread_lock_mutex(&mutex_);
161 desired_message_ids_.insert(msg_id);
162 message_flags_ |= msgFlags;
163 message_outstanding_count_++;
164 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600165 }
166
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700167 // Set an error that the error monitor will ignore. Do not use this function if you are creating a new test.
168 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
169 // function and its definition.
170 void SetUnexpectedError(const char *const msg) {
171 test_platform_thread_lock_mutex(&mutex_);
172
173 ignore_message_strings_.emplace_back(msg);
174
175 test_platform_thread_unlock_mutex(&mutex_);
176 }
177
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700178 VkBool32 CheckForDesiredMsg(const uint32_t message_code, const char *const msgString) {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600179 VkBool32 result = VK_FALSE;
Dave Houltonfbf52152017-01-06 12:55:29 -0700180 test_platform_thread_lock_mutex(&mutex_);
181 if (bailout_ != NULL) {
182 *bailout_ = true;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600183 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600184 string errorString(msgString);
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600185 bool found_expected = false;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600186
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700187 if (!IgnoreMessage(errorString)) {
188 for (auto desired_msg : desired_message_strings_) {
189 if (desired_msg.length() == 0) {
190 // An empty desired_msg string "" indicates a positive test - not expecting an error.
191 // Return true to avoid calling layers/driver with this error.
192 // And don't erase the "" string, so it remains if another error is found.
193 result = VK_TRUE;
194 found_expected = true;
195 message_found_ = VK_TRUE;
196 failure_message_strings_.insert(errorString);
197 } else if (errorString.find(desired_msg) != string::npos) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600198 found_expected = true;
Dave Houltonfbf52152017-01-06 12:55:29 -0700199 message_outstanding_count_--;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700200 failure_message_strings_.insert(errorString);
Dave Houltonfbf52152017-01-06 12:55:29 -0700201 message_found_ = VK_TRUE;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700202 result = VK_TRUE;
203 // We only want one match for each expected error so remove from set here
204 // Since we're about the break the loop it's ok to remove from set we're iterating over
205 desired_message_strings_.erase(desired_msg);
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600206 break;
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600207 }
208 }
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700209 for (auto desired_id : desired_message_ids_) {
210 if (desired_id == VALIDATION_ERROR_MAX_ENUM) {
211 // A message ID set to MAX_ENUM indicates a positive test - not expecting an error.
212 // Return true to avoid calling layers/driver with this error.
213 result = VK_TRUE;
214 } else if (desired_id == message_code) {
215 // Double-check that the string matches the error enum
216 if (errorString.find(validation_error_map[desired_id]) != string::npos) {
217 found_expected = true;
218 message_outstanding_count_--;
219 result = VK_TRUE;
220 message_found_ = VK_TRUE;
221 desired_message_ids_.erase(desired_id);
222 break;
223 } else {
224 // Treat this message as a regular unexpected error, but print a warning jic
225 printf("Message (%s) from MessageID %d does not correspond to expected message from error Database (%s)\n",
226 errorString.c_str(), desired_id, validation_error_map[desired_id]);
227 }
228 }
229 }
230
231 if (!found_expected) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600232 printf("Unexpected: %s\n", msgString);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700233 other_messages_.push_back(errorString);
234 }
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600235 }
236
Dave Houltonfbf52152017-01-06 12:55:29 -0700237 test_platform_thread_unlock_mutex(&mutex_);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600238 return result;
Mike Stroyanaccf7692015-05-12 16:00:45 -0600239 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600240
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600241 vector<string> GetOtherFailureMsgs(void) const { return other_messages_; }
242
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700243 VkDebugReportFlagsEXT GetMessageFlags(void) const { return message_flags_; }
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600244
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700245 VkBool32 AnyDesiredMsgFound(void) const { return message_found_; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600246
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700247 VkBool32 AllDesiredMsgsFound(void) const { return (0 == message_outstanding_count_); }
Dave Houltonfbf52152017-01-06 12:55:29 -0700248
249 void SetBailout(bool *bailout) { bailout_ = bailout; }
Tony Barbour300a6082015-04-07 13:44:53 -0600250
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600251 void DumpFailureMsgs(void) const {
252 vector<string> otherMsgs = GetOtherFailureMsgs();
253 if (otherMsgs.size()) {
254 cout << "Other error messages logged for this test were:" << endl;
255 for (auto iter = otherMsgs.begin(); iter != otherMsgs.end(); iter++) {
256 cout << " " << *iter << endl;
Tony Barbour59b42282016-11-03 13:31:28 -0600257 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600258 }
259 }
260
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600261 // Helpers
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200262
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600263 // ExpectSuccess now takes an optional argument allowing a custom combination of debug flags
Jeremy Hayesf967b0e2017-01-27 11:59:02 -0700264 void ExpectSuccess(VkDebugReportFlagsEXT const message_flag_mask = VK_DEBUG_REPORT_ERROR_BIT_EXT) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600265 // Match ANY message matching specified type
266 SetDesiredFailureMsg(message_flag_mask, "");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700267 message_flags_ = message_flag_mask; // override mask handling in SetDesired...
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200268 }
269
270 void VerifyFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600271 // Not seeing the desired message is a failure. /Before/ throwing, dump any other messages.
Dave Houltonfbf52152017-01-06 12:55:29 -0700272 if (!AllDesiredMsgsFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600273 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700274 for (auto desired_msg : desired_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700275 ADD_FAILURE() << "Did not receive expected error '" << desired_msg << "'";
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600276 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700277 for (auto desired_id : desired_message_ids_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700278 ADD_FAILURE() << "Did not receive expected error ENUM '" << desired_id << "'";
Tony Barbour59b42282016-11-03 13:31:28 -0600279 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200280 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700281 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200282 }
283
284 void VerifyNotFound() {
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600285 // ExpectSuccess() configured us to match anything. Any error is a failure.
Dave Houltonfbf52152017-01-06 12:55:29 -0700286 if (AnyDesiredMsgFound()) {
Jeremy Hayes2a54c012017-03-16 13:32:05 -0600287 DumpFailureMsgs();
Dave Houltonfbf52152017-01-06 12:55:29 -0700288 for (auto msg : failure_message_strings_) {
Dave Houltond5507dd2017-01-24 15:29:02 -0700289 ADD_FAILURE() << "Expected to succeed but got error: " << msg;
Tobin Ehlise2eeffa2016-09-21 17:32:26 -0600290 }
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200291 }
Dave Houltonfbf52152017-01-06 12:55:29 -0700292 Reset();
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200293 }
294
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700295 private:
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700296 // TODO: This is stopgap to block new unexpected errors from being introduced. The long-term goal is to remove the use of this
297 // function and its definition.
298 bool IgnoreMessage(std::string const &msg) const {
299 if (ignore_message_strings_.empty()) {
300 return false;
301 }
302
303 return std::find_if(ignore_message_strings_.begin(), ignore_message_strings_.end(), [&msg](std::string const &str) {
304 return msg.find(str) != std::string::npos;
305 }) != ignore_message_strings_.end();
306 }
307
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700308 VkFlags message_flags_;
309 std::unordered_set<uint32_t> desired_message_ids_;
310 std::unordered_set<string> desired_message_strings_;
311 std::unordered_set<string> failure_message_strings_;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -0700312 std::vector<std::string> ignore_message_strings_;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -0700313 vector<string> other_messages_;
314 test_platform_thread_mutex mutex_;
315 bool *bailout_;
316 VkBool32 message_found_;
317 int message_outstanding_count_;
Tony Barbour300a6082015-04-07 13:44:53 -0600318};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500319
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600320static VKAPI_ATTR VkBool32 VKAPI_CALL myDbgFunc(VkFlags msgFlags, VkDebugReportObjectTypeEXT objType, uint64_t srcObject,
321 size_t location, int32_t msgCode, const char *pLayerPrefix, const char *pMsg,
322 void *pUserData) {
Mark Lobodzinski7a588452016-08-03 14:04:26 -0600323 ErrorMonitor *errMonitor = (ErrorMonitor *)pUserData;
324 if (msgFlags & errMonitor->GetMessageFlags()) {
Mark Lobodzinski629d47b2016-10-18 13:34:58 -0600325 return errMonitor->CheckForDesiredMsg(msgCode, pMsg);
Tony Barbour0b4d9562015-04-09 10:48:04 -0600326 }
Courtney Goeltzenleuchter06640832015-09-04 13:52:24 -0600327 return false;
Tony Barbour300a6082015-04-07 13:44:53 -0600328}
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500329
Karl Schultz6addd812016-02-02 17:17:23 -0700330class VkLayerTest : public VkRenderFramework {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700331 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600332 void VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask);
333 void GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet,
Karl Schultz6addd812016-02-02 17:17:23 -0700334 BsoFailSelect failMask);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600335 void GenericDrawPreparation(VkPipelineObj &pipelineobj, VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
336 GenericDrawPreparation(m_commandBuffer, pipelineobj, descriptorSet, failMask);
Karl Schultz6addd812016-02-02 17:17:23 -0700337 }
Tony Barbour300a6082015-04-07 13:44:53 -0600338
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600339 void Draw(uint32_t vertexCount, uint32_t instanceCount, uint32_t firstVertex, uint32_t firstInstance) {
340 m_commandBuffer->Draw(vertexCount, instanceCount, firstVertex, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700341 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600342 void DrawIndexed(uint32_t indexCount, uint32_t instanceCount, uint32_t firstIndex, int32_t vertexOffset,
Karl Schultz6addd812016-02-02 17:17:23 -0700343 uint32_t firstInstance) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600344 m_commandBuffer->DrawIndexed(indexCount, instanceCount, firstIndex, vertexOffset, firstInstance);
Karl Schultz6addd812016-02-02 17:17:23 -0700345 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600346 void QueueCommandBuffer(bool checkSuccess = true) { m_commandBuffer->QueueCommandBuffer(checkSuccess); }
347 void QueueCommandBuffer(const VkFence &fence) { m_commandBuffer->QueueCommandBuffer(fence); }
348 void BindVertexBuffer(VkConstantBufferObj *vertexBuffer, VkDeviceSize offset, uint32_t binding) {
Karl Schultz6addd812016-02-02 17:17:23 -0700349 m_commandBuffer->BindVertexBuffer(vertexBuffer, offset, binding);
350 }
351 void BindIndexBuffer(VkIndexBufferObj *indexBuffer, VkDeviceSize offset) {
352 m_commandBuffer->BindIndexBuffer(indexBuffer, offset);
353 }
Tony Barbour1fa09702017-03-16 12:09:08 -0600354 void Init(VkPhysicalDeviceFeatures *features = nullptr, const VkCommandPoolCreateFlags flags = 0) {
355 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
356 InitState(features, flags);
357 }
358
Karl Schultz6addd812016-02-02 17:17:23 -0700359
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700360 protected:
Karl Schultz6addd812016-02-02 17:17:23 -0700361 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600362 bool m_enableWSI;
Tony Barbour1fa09702017-03-16 12:09:08 -0600363 std::vector<const char *> instance_layer_names;
364 std::vector<const char *> instance_extension_names;
365 std::vector<const char *> device_extension_names;
Tony Barbour300a6082015-04-07 13:44:53 -0600366
367 virtual void SetUp() {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700368 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600369 /*
370 * Since CreateDbgMsgCallback is an instance level extension call
371 * any extension / layer that utilizes that feature also needs
372 * to be enabled at create instance time.
373 */
Karl Schultz6addd812016-02-02 17:17:23 -0700374 // Use Threading layer first to protect others from
375 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700376 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600377 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800378 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700379 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Ian Elliotte48a1382016-04-28 14:22:58 -0600380 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700381 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600382
Ian Elliott2c1daf52016-05-12 09:41:46 -0600383 if (m_enableWSI) {
384 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
385 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
386#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
387#if defined(VK_USE_PLATFORM_ANDROID_KHR)
388 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700389#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600390#if defined(VK_USE_PLATFORM_MIR_KHR)
391 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700392#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600393#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
394 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700395#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600396#if defined(VK_USE_PLATFORM_WIN32_KHR)
397 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700398#endif // VK_USE_PLATFORM_WIN32_KHR
399#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott2c1daf52016-05-12 09:41:46 -0600400#if defined(VK_USE_PLATFORM_XCB_KHR)
401 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
402#elif defined(VK_USE_PLATFORM_XLIB_KHR)
403 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700404#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600405 }
406
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600407 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600408 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800409 this->app_info.pApplicationName = "layer_tests";
410 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600411 this->app_info.pEngineName = "unittest";
412 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600413 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600414
Tony Barbour15524c32015-04-29 17:34:29 -0600415 m_errorMonitor = new ErrorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600416 }
417
418 virtual void TearDown() {
419 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600420 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600421 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600422 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600423
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600424 VkLayerTest() { m_enableWSI = false; }
Tony Barbour300a6082015-04-07 13:44:53 -0600425};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500426
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600427void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500428 // Create identity matrix
429 int i;
430 struct vktriangle_vs_uniform data;
431
432 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700433 glm::mat4 View = glm::mat4(1.0f);
434 glm::mat4 Model = glm::mat4(1.0f);
435 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500436 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700437 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500438
439 memcpy(&data.mvp, &MVP[0][0], matrixSize);
440
Karl Schultz6addd812016-02-02 17:17:23 -0700441 static const Vertex tri_data[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600442 {XYZ1(-1, -1, 0), XYZ1(1.f, 0.f, 0.f)}, {XYZ1(1, -1, 0), XYZ1(0.f, 1.f, 0.f)}, {XYZ1(0, 1, 0), XYZ1(0.f, 0.f, 1.f)},
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500443 };
444
Karl Schultz6addd812016-02-02 17:17:23 -0700445 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500446 data.position[i][0] = tri_data[i].posX;
447 data.position[i][1] = tri_data[i].posY;
448 data.position[i][2] = tri_data[i].posZ;
449 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700450 data.color[i][0] = tri_data[i].r;
451 data.color[i][1] = tri_data[i].g;
452 data.color[i][2] = tri_data[i].b;
453 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500454 }
455
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500456 ASSERT_NO_FATAL_FAILURE(InitViewport());
457
Chris Forbesbcfaadd2016-09-16 14:13:53 +1200458 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float), (const void *)&data,
459 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500460
Karl Schultz6addd812016-02-02 17:17:23 -0700461 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600462 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500463
464 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800465 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500466 pipelineobj.AddShader(&vs);
467 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600468 if (failMask & BsoFailLineWidth) {
469 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600470 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600471 ia_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600472 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
473 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600474 }
475 if (failMask & BsoFailDepthBias) {
476 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600477 VkPipelineRasterizationStateCreateInfo rs_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600478 rs_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600479 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600480 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600481 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600482 }
Rene Lindsayacbf5e62016-12-15 18:47:11 -0700483 // Viewport and scissors must stay in sync or other errors will occur than
Karl Schultz6addd812016-02-02 17:17:23 -0700484 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600485 if (failMask & BsoFailViewport) {
486 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
487 }
488 if (failMask & BsoFailScissor) {
489 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
490 }
491 if (failMask & BsoFailBlend) {
492 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600493 VkPipelineColorBlendAttachmentState att_state = {};
494 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
495 att_state.blendEnable = VK_TRUE;
496 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600497 }
498 if (failMask & BsoFailDepthBounds) {
499 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
500 }
501 if (failMask & BsoFailStencilReadMask) {
502 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
503 }
504 if (failMask & BsoFailStencilWriteMask) {
505 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
506 }
507 if (failMask & BsoFailStencilReference) {
508 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
509 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500510
511 VkDescriptorSetObj descriptorSet(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600512 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500513
514 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbour552f6c02016-12-21 14:34:07 -0700515 m_commandBuffer->BeginCommandBuffer();
516 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500517
Tony Barbourfe3351b2015-07-28 10:17:20 -0600518 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500519
520 // render triangle
Tobin Ehlis379ba3b2016-07-19 11:22:29 -0600521 if (failMask & BsoFailIndexBuffer) {
522 // Use DrawIndexed w/o an index buffer bound
523 DrawIndexed(3, 1, 0, 0, 0);
524 } else {
525 Draw(3, 1, 0, 0);
526 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500527
Mark Muellerd4914412016-06-13 17:52:06 -0600528 if (failMask & BsoFailCmdClearAttachments) {
529 VkClearAttachment color_attachment = {};
530 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700531 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
Mark Muellerd4914412016-06-13 17:52:06 -0600532 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
533
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600534 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Muellerd4914412016-06-13 17:52:06 -0600535 }
536
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500537 // finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -0700538 m_commandBuffer->EndRenderPass();
539 m_commandBuffer->EndCommandBuffer();
Tony Barbourfe3351b2015-07-28 10:17:20 -0600540 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500541}
542
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600543void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj,
544 VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500545 if (m_depthStencil->Initialized()) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600546 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500547 } else {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600548 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500549 }
550
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800551 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700552 // Make sure depthWriteEnable is set so that Depth fail test will work
553 // correctly
554 // Make sure stencilTestEnable is set so that Stencil fail test will work
555 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600556 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800557 stencil.failOp = VK_STENCIL_OP_KEEP;
558 stencil.passOp = VK_STENCIL_OP_KEEP;
559 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
560 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600561
562 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
563 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600564 ds_ci.pNext = NULL;
565 ds_ci.depthTestEnable = VK_FALSE;
566 ds_ci.depthWriteEnable = VK_TRUE;
567 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
568 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600569 if (failMask & BsoFailDepthBounds) {
570 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600571 ds_ci.maxDepthBounds = 0.0f;
572 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600573 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600574 ds_ci.stencilTestEnable = VK_TRUE;
575 ds_ci.front = stencil;
576 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600577
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600578 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600579 pipelineobj.SetViewport(m_viewports);
580 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800581 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600582 VkResult err = pipelineobj.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600583 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800584 commandBuffer->BindPipeline(pipelineobj);
585 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500586}
587
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600588class VkPositiveLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700589 public:
590 protected:
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600591};
592
Ian Elliott2c1daf52016-05-12 09:41:46 -0600593class VkWsiEnabledLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700594 public:
595 protected:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600596 VkWsiEnabledLayerTest() { m_enableWSI = true; }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600597};
598
Mark Muellerdfe37552016-07-07 14:47:42 -0600599class VkBufferTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700600 public:
Mark Muellerdfe37552016-07-07 14:47:42 -0600601 enum eTestEnFlags {
602 eDoubleDelete,
603 eInvalidDeviceOffset,
604 eInvalidMemoryOffset,
605 eBindNullBuffer,
606 eFreeInvalidHandle,
Mark Mueller4042b652016-09-05 22:52:21 -0600607 eNone,
Mark Muellerdfe37552016-07-07 14:47:42 -0600608 };
609
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600610 enum eTestConditions { eOffsetAlignment = 1 };
Mark Muellerdfe37552016-07-07 14:47:42 -0600611
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600612 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice, eTestEnFlags aTestFlag, VkBufferUsageFlags aBufferUsage = 0) {
613 if (eInvalidDeviceOffset != aTestFlag && eInvalidMemoryOffset != aTestFlag) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600614 return true;
615 }
616 VkDeviceSize offset_limit = 0;
617 if (eInvalidMemoryOffset == aTestFlag) {
618 VkBuffer vulkanBuffer;
619 VkBufferCreateInfo buffer_create_info = {};
620 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
621 buffer_create_info.size = 32;
622 buffer_create_info.usage = aBufferUsage;
623
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600624 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr, &vulkanBuffer);
Mark Mueller4042b652016-09-05 22:52:21 -0600625 VkMemoryRequirements memory_reqs = {};
Mark Muellerdfe37552016-07-07 14:47:42 -0600626
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600627 vkGetBufferMemoryRequirements(aVulkanDevice->device(), vulkanBuffer, &memory_reqs);
Mark Muellerdfe37552016-07-07 14:47:42 -0600628 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
629 offset_limit = memory_reqs.alignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600630 } else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
631 offset_limit = aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600632 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600633 offset_limit = aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600634 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600635 offset_limit = aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600636 }
637 if (eOffsetAlignment < offset_limit) {
638 return true;
639 }
640 return false;
641 }
642
643 // A constructor which performs validation tests within construction.
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600644 VkBufferTest(VkDeviceObj *aVulkanDevice, VkBufferUsageFlags aBufferUsage, eTestEnFlags aTestFlag = eNone)
645 : AllocateCurrent(false), BoundCurrent(false), CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600646 if (eBindNullBuffer == aTestFlag) {
647 VulkanMemory = 0;
648 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
649 } else {
650 VkBufferCreateInfo buffer_create_info = {};
651 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
652 buffer_create_info.size = 32;
653 buffer_create_info.usage = aBufferUsage;
654
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600655 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr, &VulkanBuffer);
Mark Muellerdfe37552016-07-07 14:47:42 -0600656
657 CreateCurrent = true;
658
659 VkMemoryRequirements memory_requirements;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600660 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer, &memory_requirements);
Mark Muellerdfe37552016-07-07 14:47:42 -0600661
662 VkMemoryAllocateInfo memory_allocate_info = {};
663 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Stratton77a0d592017-02-17 13:14:13 -0800664 memory_allocate_info.allocationSize = memory_requirements.size + eOffsetAlignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600665 bool pass = aVulkanDevice->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info,
666 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Muellerdfe37552016-07-07 14:47:42 -0600667 if (!pass) {
668 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
669 return;
670 }
671
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600672 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL, &VulkanMemory);
Mark Muellerdfe37552016-07-07 14:47:42 -0600673 AllocateCurrent = true;
674 // NB: 1 is intentionally an invalid offset value
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600675 const bool offset_en = eInvalidDeviceOffset == aTestFlag || eInvalidMemoryOffset == aTestFlag;
676 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, offset_en ? eOffsetAlignment : 0);
Mark Muellerdfe37552016-07-07 14:47:42 -0600677 BoundCurrent = true;
678
679 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
680 }
681 }
682
683 ~VkBufferTest() {
684 if (CreateCurrent) {
685 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
686 }
687 if (AllocateCurrent) {
688 if (InvalidDeleteEn) {
689 union {
690 VkDeviceMemory device_memory;
691 unsigned long long index_access;
692 } bad_index;
693
694 bad_index.device_memory = VulkanMemory;
695 bad_index.index_access++;
696
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600697 vkFreeMemory(VulkanDevice, bad_index.device_memory, nullptr);
Mark Muellerdfe37552016-07-07 14:47:42 -0600698 }
699 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
700 }
701 }
702
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600703 bool GetBufferCurrent() { return AllocateCurrent && BoundCurrent && CreateCurrent; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600704
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600705 const VkBuffer &GetBuffer() { return VulkanBuffer; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600706
707 void TestDoubleDestroy() {
708 // Destroy the buffer but leave the flag set, which will cause
709 // the buffer to be destroyed again in the destructor.
710 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
711 }
712
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700713 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600714 bool AllocateCurrent;
715 bool BoundCurrent;
716 bool CreateCurrent;
717 bool InvalidDeleteEn;
718
719 VkBuffer VulkanBuffer;
720 VkDevice VulkanDevice;
721 VkDeviceMemory VulkanMemory;
Mark Muellerdfe37552016-07-07 14:47:42 -0600722};
723
724class VkVerticesObj {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700725 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600726 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount, unsigned aBindingCount, unsigned aByteStride,
Mark Muellerdfe37552016-07-07 14:47:42 -0600727 VkDeviceSize aVertexCount, const float *aVerticies)
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700728 : BoundCurrent(false),
729 AttributeCount(aAttributeCount),
730 BindingCount(aBindingCount),
731 BindId(BindIdGenerator),
Mark Muellerdfe37552016-07-07 14:47:42 -0600732 PipelineVertexInputStateCreateInfo(),
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600733 VulkanMemoryBuffer(aVulkanDevice, 1, static_cast<int>(aByteStride * aVertexCount),
734 reinterpret_cast<const void *>(aVerticies), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700735 BindIdGenerator++; // NB: This can wrap w/misuse
Mark Muellerdfe37552016-07-07 14:47:42 -0600736
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600737 VertexInputAttributeDescription = new VkVertexInputAttributeDescription[AttributeCount];
738 VertexInputBindingDescription = new VkVertexInputBindingDescription[BindingCount];
Mark Muellerdfe37552016-07-07 14:47:42 -0600739
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600740 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = VertexInputAttributeDescription;
741 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = AttributeCount;
742 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = VertexInputBindingDescription;
743 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = BindingCount;
744 PipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -0600745
746 unsigned i = 0;
747 do {
748 VertexInputAttributeDescription[i].binding = BindId;
749 VertexInputAttributeDescription[i].location = i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600750 VertexInputAttributeDescription[i].format = VK_FORMAT_R32G32B32_SFLOAT;
751 VertexInputAttributeDescription[i].offset = sizeof(float) * aByteStride;
Mark Muellerdfe37552016-07-07 14:47:42 -0600752 i++;
753 } while (AttributeCount < i);
754
755 i = 0;
756 do {
757 VertexInputBindingDescription[i].binding = BindId;
758 VertexInputBindingDescription[i].stride = aByteStride;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600759 VertexInputBindingDescription[i].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
Mark Muellerdfe37552016-07-07 14:47:42 -0600760 i++;
761 } while (BindingCount < i);
762 }
763
764 ~VkVerticesObj() {
765 if (VertexInputAttributeDescription) {
766 delete[] VertexInputAttributeDescription;
767 }
768 if (VertexInputBindingDescription) {
769 delete[] VertexInputBindingDescription;
770 }
771 }
772
773 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600774 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription, AttributeCount);
775 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription, BindingCount);
Mark Muellerdfe37552016-07-07 14:47:42 -0600776 return true;
777 }
778
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600779 void BindVertexBuffers(VkCommandBuffer aCommandBuffer, unsigned aOffsetCount = 0, VkDeviceSize *aOffsetList = nullptr) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600780 VkDeviceSize *offsetList;
781 unsigned offsetCount;
782
783 if (aOffsetCount) {
784 offsetList = aOffsetList;
785 offsetCount = aOffsetCount;
786 } else {
787 offsetList = new VkDeviceSize[1]();
788 offsetCount = 1;
789 }
790
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600791 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount, &VulkanMemoryBuffer.handle(), offsetList);
Mark Muellerdfe37552016-07-07 14:47:42 -0600792 BoundCurrent = true;
793
794 if (!aOffsetCount) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600795 delete[] offsetList;
Mark Muellerdfe37552016-07-07 14:47:42 -0600796 }
797 }
798
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700799 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600800 static uint32_t BindIdGenerator;
801
802 bool BoundCurrent;
803 unsigned AttributeCount;
804 unsigned BindingCount;
805 uint32_t BindId;
806
807 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
808 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
809 VkVertexInputBindingDescription *VertexInputBindingDescription;
810 VkConstantBufferObj VulkanMemoryBuffer;
811};
812
813uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500814// ********************************************************************************************************************
815// ********************************************************************************************************************
816// ********************************************************************************************************************
817// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600818TEST_F(VkLayerTest, RequiredParameter) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700819 TEST_DESCRIPTION(
820 "Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
821 "pointer, array, and array count parameters");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600822
Tony Barbour1fa09702017-03-16 12:09:08 -0600823 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600824
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600825 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pFeatures specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600826 // Specify NULL for a pointer to a handle
827 // Expected to trigger an error with
828 // parameter_validation::validate_required_pointer
829 vkGetPhysicalDeviceFeatures(gpu(), NULL);
830 m_errorMonitor->VerifyFound();
831
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600832 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
833 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600834 // Specify NULL for pointer to array count
835 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600836 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600837 m_errorMonitor->VerifyFound();
838
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600839 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter viewportCount must be greater than 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600840 // Specify 0 for a required array count
841 // Expected to trigger an error with parameter_validation::validate_array
842 VkViewport view_port = {};
843 m_commandBuffer->SetViewport(0, 0, &view_port);
844 m_errorMonitor->VerifyFound();
845
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pViewports specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600847 // Specify NULL for a required array
848 // Expected to trigger an error with parameter_validation::validate_array
849 m_commandBuffer->SetViewport(0, 1, NULL);
850 m_errorMonitor->VerifyFound();
851
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter memory specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600853 // Specify VK_NULL_HANDLE for a required handle
854 // Expected to trigger an error with
855 // parameter_validation::validate_required_handle
856 vkUnmapMemory(device(), VK_NULL_HANDLE);
857 m_errorMonitor->VerifyFound();
858
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600859 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
860 "required parameter pFences[0] specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600861 // Specify VK_NULL_HANDLE for a required handle array entry
862 // Expected to trigger an error with
863 // parameter_validation::validate_required_handle_array
864 VkFence fence = VK_NULL_HANDLE;
865 vkResetFences(device(), 1, &fence);
866 m_errorMonitor->VerifyFound();
867
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600868 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pAllocateInfo specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600869 // Specify NULL for a required struct pointer
870 // Expected to trigger an error with
871 // parameter_validation::validate_struct_type
872 VkDeviceMemory memory = VK_NULL_HANDLE;
873 vkAllocateMemory(device(), NULL, NULL, &memory);
874 m_errorMonitor->VerifyFound();
875
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600876 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of faceMask must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600877 // Specify 0 for a required VkFlags parameter
878 // Expected to trigger an error with parameter_validation::validate_flags
879 m_commandBuffer->SetStencilReference(0, 0);
880 m_errorMonitor->VerifyFound();
881
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600882 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of pSubmits[0].pWaitDstStageMask[0] must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600883 // Specify 0 for a required VkFlags array entry
884 // Expected to trigger an error with
885 // parameter_validation::validate_flags_array
886 VkSemaphore semaphore = VK_NULL_HANDLE;
887 VkPipelineStageFlags stageFlags = 0;
888 VkSubmitInfo submitInfo = {};
889 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
890 submitInfo.waitSemaphoreCount = 1;
891 submitInfo.pWaitSemaphores = &semaphore;
892 submitInfo.pWaitDstStageMask = &stageFlags;
893 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
894 m_errorMonitor->VerifyFound();
895}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600896
Dustin Gravesfce74c02016-05-10 11:42:58 -0600897TEST_F(VkLayerTest, ReservedParameter) {
898 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
899
Tony Barbour1fa09702017-03-16 12:09:08 -0600900 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -0600901
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600902 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must be 0");
Dustin Gravesfce74c02016-05-10 11:42:58 -0600903 // Specify 0 for a reserved VkFlags parameter
904 // Expected to trigger an error with
905 // parameter_validation::validate_reserved_flags
906 VkEvent event_handle = VK_NULL_HANDLE;
907 VkEventCreateInfo event_info = {};
908 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
909 event_info.flags = 1;
910 vkCreateEvent(device(), &event_info, NULL, &event_handle);
911 m_errorMonitor->VerifyFound();
912}
913
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600914TEST_F(VkLayerTest, InvalidStructSType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700915 TEST_DESCRIPTION(
916 "Specify an invalid VkStructureType for a Vulkan "
917 "structure's sType field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600918
Tony Barbour1fa09702017-03-16 12:09:08 -0600919 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600920
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600921 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pAllocateInfo->sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600922 // Zero struct memory, effectively setting sType to
923 // VK_STRUCTURE_TYPE_APPLICATION_INFO
924 // Expected to trigger an error with
925 // parameter_validation::validate_struct_type
926 VkMemoryAllocateInfo alloc_info = {};
927 VkDeviceMemory memory = VK_NULL_HANDLE;
928 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
929 m_errorMonitor->VerifyFound();
930
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600931 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pSubmits[0].sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600932 // Zero struct memory, effectively setting sType to
933 // VK_STRUCTURE_TYPE_APPLICATION_INFO
934 // Expected to trigger an error with
935 // parameter_validation::validate_struct_type_array
936 VkSubmitInfo submit_info = {};
937 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
938 m_errorMonitor->VerifyFound();
939}
940
941TEST_F(VkLayerTest, InvalidStructPNext) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600942 TEST_DESCRIPTION("Specify an invalid value for a Vulkan structure's pNext field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600943
Tony Barbour1fa09702017-03-16 12:09:08 -0600944 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600945
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600946 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "value of pCreateInfo->pNext must be NULL");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600947 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be NULL.
Karl Schultz38b50992016-07-11 16:09:09 -0600948 // Need to pick a function that has no allowed pNext structure types.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600949 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Karl Schultz38b50992016-07-11 16:09:09 -0600950 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600951 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600952 // Zero-initialization will provide the correct sType
953 VkApplicationInfo app_info = {};
954 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
955 event_alloc_info.pNext = &app_info;
956 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
957 m_errorMonitor->VerifyFound();
958
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600959 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
960 " chain includes a structure with unexpected VkStructureType ");
Karl Schultz38b50992016-07-11 16:09:09 -0600961 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
962 // a function that has allowed pNext structure types and specify
963 // a structure type that is not allowed.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600964 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600965 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -0600966 VkMemoryAllocateInfo memory_alloc_info = {};
967 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
968 memory_alloc_info.pNext = &app_info;
969 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600970 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600971}
Dustin Graves5d33d532016-05-09 16:21:12 -0600972
973TEST_F(VkLayerTest, UnrecognizedValue) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600974 TEST_DESCRIPTION("Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
Dustin Graves5d33d532016-05-09 16:21:12 -0600975
Tony Barbour1fa09702017-03-16 12:09:08 -0600976 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Graves5d33d532016-05-09 16:21:12 -0600977
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700978 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
979 "does not fall within the begin..end "
980 "range of the core VkFormat "
981 "enumeration tokens");
Dustin Graves5d33d532016-05-09 16:21:12 -0600982 // Specify an invalid VkFormat value
983 // Expected to trigger an error with
984 // parameter_validation::validate_ranged_enum
985 VkFormatProperties format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600986 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000), &format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -0600987 m_errorMonitor->VerifyFound();
988
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -0600990 // Specify an invalid VkFlags bitmask value
991 // Expected to trigger an error with parameter_validation::validate_flags
992 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600993 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
994 static_cast<VkImageUsageFlags>(1 << 25), 0, &image_format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -0600995 m_errorMonitor->VerifyFound();
996
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600997 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "contains flag bits that are not recognized members of");
Dustin Graves5d33d532016-05-09 16:21:12 -0600998 // Specify an invalid VkFlags array entry
999 // Expected to trigger an error with
1000 // parameter_validation::validate_flags_array
1001 VkSemaphore semaphore = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001002 VkPipelineStageFlags stage_flags = static_cast<VkPipelineStageFlags>(1 << 25);
Dustin Graves5d33d532016-05-09 16:21:12 -06001003 VkSubmitInfo submit_info = {};
1004 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1005 submit_info.waitSemaphoreCount = 1;
1006 submit_info.pWaitSemaphores = &semaphore;
1007 submit_info.pWaitDstStageMask = &stage_flags;
1008 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1009 m_errorMonitor->VerifyFound();
1010
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001011 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is neither VK_TRUE nor VK_FALSE");
Dustin Graves5d33d532016-05-09 16:21:12 -06001012 // Specify an invalid VkBool32 value
1013 // Expected to trigger a warning with
1014 // parameter_validation::validate_bool32
1015 VkSampler sampler = VK_NULL_HANDLE;
1016 VkSamplerCreateInfo sampler_info = {};
1017 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1018 sampler_info.pNext = NULL;
1019 sampler_info.magFilter = VK_FILTER_NEAREST;
1020 sampler_info.minFilter = VK_FILTER_NEAREST;
1021 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1022 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1023 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1024 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1025 sampler_info.mipLodBias = 1.0;
1026 sampler_info.maxAnisotropy = 1;
1027 sampler_info.compareEnable = VK_FALSE;
1028 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1029 sampler_info.minLod = 1.0;
1030 sampler_info.maxLod = 1.0;
1031 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1032 sampler_info.unnormalizedCoordinates = VK_FALSE;
1033 // Not VK_TRUE or VK_FALSE
1034 sampler_info.anisotropyEnable = 3;
1035 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1036 m_errorMonitor->VerifyFound();
1037}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001038
1039TEST_F(VkLayerTest, FailedReturnValue) {
1040 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1041
Tony Barbour1fa09702017-03-16 12:09:08 -06001042 ASSERT_NO_FATAL_FAILURE(Init());
Dustin Gravesfce74c02016-05-10 11:42:58 -06001043
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001044 // Find an unsupported image format
1045 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1046 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1047 VkFormat format = static_cast<VkFormat>(f);
1048 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001049 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001050 unsupported = format;
1051 break;
1052 }
1053 }
1054
1055 if (unsupported != VK_FORMAT_UNDEFINED) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001056 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1057 "the requested format is not supported on this device");
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001058 // Specify an unsupported VkFormat value to generate a
1059 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1060 // Expected to trigger a warning from
1061 // parameter_validation::validate_result
1062 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001063 VkResult err = vkGetPhysicalDeviceImageFormatProperties(gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1064 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001065 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1066 m_errorMonitor->VerifyFound();
1067 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001068}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001069
1070TEST_F(VkLayerTest, UpdateBufferAlignment) {
1071 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001072 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001073
Tony Barbour1fa09702017-03-16 12:09:08 -06001074 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001075
1076 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1077 vk_testing::Buffer buffer;
1078 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1079
Tony Barbour552f6c02016-12-21 14:34:07 -07001080 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001081 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001082 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001083 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1084 m_errorMonitor->VerifyFound();
1085
1086 // Introduce failure by using dataSize that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001087 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001088 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1089 m_errorMonitor->VerifyFound();
1090
1091 // Introduce failure by using dataSize that is < 0
1092 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001093 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001094 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1095 m_errorMonitor->VerifyFound();
1096
1097 // Introduce failure by using dataSize that is > 65536
1098 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001099 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001100 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1101 m_errorMonitor->VerifyFound();
1102
Tony Barbour552f6c02016-12-21 14:34:07 -07001103 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001104}
1105
1106TEST_F(VkLayerTest, FillBufferAlignment) {
1107 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1108
Tony Barbour1fa09702017-03-16 12:09:08 -06001109 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001110
1111 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1112 vk_testing::Buffer buffer;
1113 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1114
Tony Barbour552f6c02016-12-21 14:34:07 -07001115 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001116
1117 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001119 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1120 m_errorMonitor->VerifyFound();
1121
1122 // Introduce failure by using size that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001123 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001124 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1125 m_errorMonitor->VerifyFound();
1126
1127 // Introduce failure by using size that is zero
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001128 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be greater than zero");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001129 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1130 m_errorMonitor->VerifyFound();
1131
Tony Barbour552f6c02016-12-21 14:34:07 -07001132 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001133}
Dustin Graves40f35822016-06-23 11:12:53 -06001134
Cortd889ff92016-07-27 09:51:27 -07001135TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1136 VkResult err;
1137
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001138 TEST_DESCRIPTION(
1139 "Attempt to use a non-solid polygon fill mode in a "
1140 "pipeline when this feature is not enabled.");
Cortd889ff92016-07-27 09:51:27 -07001141
Tony Barbour1fa09702017-03-16 12:09:08 -06001142 ASSERT_NO_FATAL_FAILURE(Init());
Cortd889ff92016-07-27 09:51:27 -07001143 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1144
1145 std::vector<const char *> device_extension_names;
1146 auto features = m_device->phy().features();
1147 // Artificially disable support for non-solid fill modes
1148 features.fillModeNonSolid = false;
1149 // The sacrificial device object
1150 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1151
1152 VkRenderpassObj render_pass(&test_device);
1153
1154 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1155 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1156 pipeline_layout_ci.setLayoutCount = 0;
1157 pipeline_layout_ci.pSetLayouts = NULL;
1158
1159 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001160 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Cortd889ff92016-07-27 09:51:27 -07001161 ASSERT_VK_SUCCESS(err);
1162
1163 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1164 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1165 rs_ci.pNext = nullptr;
1166 rs_ci.lineWidth = 1.0f;
1167 rs_ci.rasterizerDiscardEnable = true;
1168
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001169 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1170 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Cortd889ff92016-07-27 09:51:27 -07001171
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001172 // Set polygonMode to unsupported value POINT, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001173 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1174 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001175 {
1176 VkPipelineObj pipe(&test_device);
1177 pipe.AddShader(&vs);
1178 pipe.AddShader(&fs);
1179 pipe.AddColorAttachment();
1180 // Introduce failure by setting unsupported polygon mode
1181 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1182 pipe.SetRasterization(&rs_ci);
1183 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1184 }
1185 m_errorMonitor->VerifyFound();
1186
1187 // Try again with polygonMode=LINE, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1189 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001190 {
1191 VkPipelineObj pipe(&test_device);
1192 pipe.AddShader(&vs);
1193 pipe.AddShader(&fs);
1194 pipe.AddColorAttachment();
1195 // Introduce failure by setting unsupported polygon mode
1196 rs_ci.polygonMode = VK_POLYGON_MODE_LINE;
1197 pipe.SetRasterization(&rs_ci);
1198 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1199 }
1200 m_errorMonitor->VerifyFound();
1201
Cortd889ff92016-07-27 09:51:27 -07001202 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1203}
1204
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001205#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001206TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001207{
1208 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001209 VkFenceCreateInfo fenceInfo = {};
1210 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1211 fenceInfo.pNext = NULL;
1212 fenceInfo.flags = 0;
1213
Mike Weiblencce7ec72016-10-17 19:33:05 -06001214 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001215
Tony Barbour1fa09702017-03-16 12:09:08 -06001216 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001217
1218 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1219 vk_testing::Buffer buffer;
1220 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001221
Tony Barbourfe3351b2015-07-28 10:17:20 -06001222 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001223 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001224 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001225
1226 testFence.init(*m_device, fenceInfo);
1227
1228 // Bypass framework since it does the waits automatically
1229 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001230 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001231 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1232 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001233 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001234 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001235 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001236 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001237 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001238 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001239 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001240
1241 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001242 ASSERT_VK_SUCCESS( err );
1243
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001244 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001245 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001246
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001247 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001248}
1249
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001250TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001251{
1252 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001253 VkFenceCreateInfo fenceInfo = {};
1254 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1255 fenceInfo.pNext = NULL;
1256 fenceInfo.flags = 0;
1257
Mike Weiblencce7ec72016-10-17 19:33:05 -06001258 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001259
Tony Barbour1fa09702017-03-16 12:09:08 -06001260 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001261 ASSERT_NO_FATAL_FAILURE(InitViewport());
1262 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1263
Tony Barbourfe3351b2015-07-28 10:17:20 -06001264 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001265 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001266 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001267
1268 testFence.init(*m_device, fenceInfo);
1269
1270 // Bypass framework since it does the waits automatically
1271 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001272 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001273 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1274 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001275 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001276 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001277 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001278 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001279 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001280 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001281 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001282
1283 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001284 ASSERT_VK_SUCCESS( err );
1285
Jon Ashburnf19916e2016-01-11 13:12:43 -07001286 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001287 VkCommandBufferBeginInfo info = {};
1288 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1289 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001290 info.renderPass = VK_NULL_HANDLE;
1291 info.subpass = 0;
1292 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001293 info.occlusionQueryEnable = VK_FALSE;
1294 info.queryFlags = 0;
1295 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001296
1297 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001298 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001299
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001300 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001301}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001302#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001303
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001304TEST_F(VkLayerTest, SparseBindingImageBufferCreate) {
1305 TEST_DESCRIPTION("Create buffer/image with sparse attributes but without the sparse_binding bit set");
1306
Tony Barbour1fa09702017-03-16 12:09:08 -06001307 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001308
1309 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00669);
1310 VkBuffer buffer;
1311 VkBufferCreateInfo buf_info = {};
1312 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1313 buf_info.pNext = NULL;
1314 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
1315 buf_info.size = 2048;
1316 buf_info.queueFamilyIndexCount = 0;
1317 buf_info.pQueueFamilyIndices = NULL;
1318 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1319 buf_info.flags = VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
1320 vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1321 m_errorMonitor->VerifyFound();
1322
1323 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02160);
1324 VkImage image;
1325 VkImageCreateInfo image_create_info = {};
1326 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1327 image_create_info.pNext = NULL;
1328 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1329 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1330 image_create_info.extent.width = 512;
1331 image_create_info.extent.height = 64;
1332 image_create_info.extent.depth = 1;
1333 image_create_info.mipLevels = 1;
1334 image_create_info.arrayLayers = 1;
1335 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1336 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1337 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1338 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1339 image_create_info.queueFamilyIndexCount = 0;
1340 image_create_info.pQueueFamilyIndices = NULL;
1341 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1342 image_create_info.flags = VK_BUFFER_CREATE_SPARSE_ALIASED_BIT;
1343 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1344 m_errorMonitor->VerifyFound();
1345}
1346
Dave Houlton829c0d82017-01-24 15:09:17 -07001347TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedTypes) {
1348 TEST_DESCRIPTION("Create images with sparse residency with unsupported types");
Tony Barbour1fa09702017-03-16 12:09:08 -06001349 ASSERT_NO_FATAL_FAILURE(InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton829c0d82017-01-24 15:09:17 -07001350
1351 // Determine which device feature are available
Jamie Madill35127872017-03-15 16:17:46 -04001352 VkPhysicalDeviceFeatures available_features = {};
Dave Houlton829c0d82017-01-24 15:09:17 -07001353 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&available_features));
1354
1355 // Mask out device features we don't want
1356 VkPhysicalDeviceFeatures desired_features = available_features;
1357 desired_features.sparseResidencyImage2D = VK_FALSE;
1358 desired_features.sparseResidencyImage3D = VK_FALSE;
Mark Lobodzinski77e590c2017-03-17 12:05:16 -06001359 ASSERT_NO_FATAL_FAILURE(Init(&desired_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001360
1361 VkImage image = VK_NULL_HANDLE;
1362 VkResult result = VK_RESULT_MAX_ENUM;
1363 VkImageCreateInfo image_create_info = {};
1364 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1365 image_create_info.pNext = NULL;
1366 image_create_info.imageType = VK_IMAGE_TYPE_1D;
1367 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1368 image_create_info.extent.width = 512;
1369 image_create_info.extent.height = 1;
1370 image_create_info.extent.depth = 1;
1371 image_create_info.mipLevels = 1;
1372 image_create_info.arrayLayers = 1;
1373 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1374 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1375 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1376 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1377 image_create_info.queueFamilyIndexCount = 0;
1378 image_create_info.pQueueFamilyIndices = NULL;
1379 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1380 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1381
1382 // 1D image w/ sparse residency is an error
1383 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02352);
1384 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1385 m_errorMonitor->VerifyFound();
1386 if (VK_SUCCESS == result) {
1387 vkDestroyImage(m_device->device(), image, NULL);
1388 image = VK_NULL_HANDLE;
1389 }
1390
1391 // 2D image w/ sparse residency when feature isn't available
1392 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1393 image_create_info.extent.height = 64;
1394 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02144);
1395 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1396 m_errorMonitor->VerifyFound();
1397 if (VK_SUCCESS == result) {
1398 vkDestroyImage(m_device->device(), image, NULL);
1399 image = VK_NULL_HANDLE;
1400 }
1401
1402 // 3D image w/ sparse residency when feature isn't available
1403 image_create_info.imageType = VK_IMAGE_TYPE_3D;
1404 image_create_info.extent.depth = 8;
1405 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02145);
1406 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1407 m_errorMonitor->VerifyFound();
1408 if (VK_SUCCESS == result) {
1409 vkDestroyImage(m_device->device(), image, NULL);
1410 image = VK_NULL_HANDLE;
1411 }
1412}
1413
1414TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedSamples) {
1415 TEST_DESCRIPTION("Create images with sparse residency with unsupported tiling or sample counts");
Tony Barbour1fa09702017-03-16 12:09:08 -06001416 ASSERT_NO_FATAL_FAILURE(InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor));
Dave Houlton829c0d82017-01-24 15:09:17 -07001417
1418 // Determine which device feature are available
Jamie Madill35127872017-03-15 16:17:46 -04001419 VkPhysicalDeviceFeatures available_features = {};
Dave Houlton829c0d82017-01-24 15:09:17 -07001420 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&available_features));
1421
1422 // These tests all require that the device support sparse residency for 2D images
1423 if (VK_TRUE != available_features.sparseResidencyImage2D) {
1424 return;
1425 }
1426
1427 // Mask out device features we don't want
1428 VkPhysicalDeviceFeatures desired_features = available_features;
1429 desired_features.sparseResidency2Samples = VK_FALSE;
1430 desired_features.sparseResidency4Samples = VK_FALSE;
1431 desired_features.sparseResidency8Samples = VK_FALSE;
1432 desired_features.sparseResidency16Samples = VK_FALSE;
Mark Lobodzinski77e590c2017-03-17 12:05:16 -06001433 ASSERT_NO_FATAL_FAILURE(Init(&desired_features));
Dave Houlton829c0d82017-01-24 15:09:17 -07001434
1435 VkImage image = VK_NULL_HANDLE;
1436 VkResult result = VK_RESULT_MAX_ENUM;
1437 VkImageCreateInfo image_create_info = {};
1438 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1439 image_create_info.pNext = NULL;
1440 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1441 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1442 image_create_info.extent.width = 64;
1443 image_create_info.extent.height = 64;
1444 image_create_info.extent.depth = 1;
1445 image_create_info.mipLevels = 1;
1446 image_create_info.arrayLayers = 1;
1447 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1448 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1449 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1450 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1451 image_create_info.queueFamilyIndexCount = 0;
1452 image_create_info.pQueueFamilyIndices = NULL;
1453 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1454 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1455
1456 // 2D image w/ sparse residency and linear tiling is an error
1457 m_errorMonitor->SetDesiredFailureMsg(
1458 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1459 "VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT then image tiling of VK_IMAGE_TILING_LINEAR is not supported");
1460 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1461 m_errorMonitor->VerifyFound();
1462 if (VK_SUCCESS == result) {
1463 vkDestroyImage(m_device->device(), image, NULL);
1464 image = VK_NULL_HANDLE;
1465 }
1466 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1467
1468 // Multi-sample image w/ sparse residency when feature isn't available (4 flavors)
1469 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
1470 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02146);
1471 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1472 m_errorMonitor->VerifyFound();
1473 if (VK_SUCCESS == result) {
1474 vkDestroyImage(m_device->device(), image, NULL);
1475 image = VK_NULL_HANDLE;
1476 }
1477
1478 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
1479 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02147);
1480 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1481 m_errorMonitor->VerifyFound();
1482 if (VK_SUCCESS == result) {
1483 vkDestroyImage(m_device->device(), image, NULL);
1484 image = VK_NULL_HANDLE;
1485 }
1486
1487 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
1488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02148);
1489 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1490 m_errorMonitor->VerifyFound();
1491 if (VK_SUCCESS == result) {
1492 vkDestroyImage(m_device->device(), image, NULL);
1493 image = VK_NULL_HANDLE;
1494 }
1495
1496 image_create_info.samples = VK_SAMPLE_COUNT_16_BIT;
1497 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02149);
1498 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1499 m_errorMonitor->VerifyFound();
1500 if (VK_SUCCESS == result) {
1501 vkDestroyImage(m_device->device(), image, NULL);
1502 image = VK_NULL_HANDLE;
1503 }
1504}
1505
Tobin Ehlisf11be982016-05-11 13:52:53 -06001506TEST_F(VkLayerTest, InvalidMemoryAliasing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001507 TEST_DESCRIPTION(
1508 "Create a buffer and image, allocate memory, and bind the "
1509 "buffer and image to memory such that they will alias.");
Tobin Ehlisf11be982016-05-11 13:52:53 -06001510 VkResult err;
1511 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001512 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf11be982016-05-11 13:52:53 -06001513
Tobin Ehlis077ded32016-05-12 17:39:13 -06001514 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001515 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001516 VkImage image2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001517 VkDeviceMemory mem; // buffer will be bound first
1518 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001519 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Rene Lindsayd14f5572016-12-16 14:57:18 -07001520 VkMemoryRequirements buff_mem_reqs2, img_mem_reqs2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001521
1522 VkBufferCreateInfo buf_info = {};
1523 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1524 buf_info.pNext = NULL;
1525 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1526 buf_info.size = 256;
1527 buf_info.queueFamilyIndexCount = 0;
1528 buf_info.pQueueFamilyIndices = NULL;
1529 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1530 buf_info.flags = 0;
1531 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1532 ASSERT_VK_SUCCESS(err);
1533
Tobin Ehlis077ded32016-05-12 17:39:13 -06001534 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001535
1536 VkImageCreateInfo image_create_info = {};
1537 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1538 image_create_info.pNext = NULL;
1539 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1540 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1541 image_create_info.extent.width = 64;
1542 image_create_info.extent.height = 64;
1543 image_create_info.extent.depth = 1;
1544 image_create_info.mipLevels = 1;
1545 image_create_info.arrayLayers = 1;
1546 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001547 // Image tiling must be optimal to trigger error when aliasing linear buffer
1548 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001549 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1550 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1551 image_create_info.queueFamilyIndexCount = 0;
1552 image_create_info.pQueueFamilyIndices = NULL;
1553 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1554 image_create_info.flags = 0;
1555
Tobin Ehlisf11be982016-05-11 13:52:53 -06001556 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1557 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001558 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
1559 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001560
Tobin Ehlis077ded32016-05-12 17:39:13 -06001561 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1562
1563 VkMemoryAllocateInfo alloc_info = {};
1564 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1565 alloc_info.pNext = NULL;
1566 alloc_info.memoryTypeIndex = 0;
1567 // Ensure memory is big enough for both bindings
1568 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001569 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1570 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001571 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001572 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001573 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinskid2d2d4c2017-02-16 11:51:58 -07001574 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001575 return;
1576 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001577 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1578 ASSERT_VK_SUCCESS(err);
1579 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1580 ASSERT_VK_SUCCESS(err);
1581
Rene Lindsayd14f5572016-12-16 14:57:18 -07001582 vkGetImageMemoryRequirements(m_device->device(), image2, &img_mem_reqs2);
1583
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001584 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001585 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001586 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1587 m_errorMonitor->VerifyFound();
1588
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001589 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001590 // aliasing buffer2
1591 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1592 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001593 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1594 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001595 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001596 ASSERT_VK_SUCCESS(err);
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001597 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is aliased with non-linear image 0x");
Rene Lindsayd14f5572016-12-16 14:57:18 -07001598 vkGetBufferMemoryRequirements(m_device->device(), buffer2, &buff_mem_reqs2);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001599 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001600 m_errorMonitor->VerifyFound();
1601
1602 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001603 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001604 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001605 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001606 vkFreeMemory(m_device->device(), mem, NULL);
1607 vkFreeMemory(m_device->device(), mem_img, NULL);
1608}
1609
Tobin Ehlis35372522016-05-12 08:32:31 -06001610TEST_F(VkLayerTest, InvalidMemoryMapping) {
1611 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1612 VkResult err;
1613 bool pass;
Tony Barbour1fa09702017-03-16 12:09:08 -06001614 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis35372522016-05-12 08:32:31 -06001615
1616 VkBuffer buffer;
1617 VkDeviceMemory mem;
1618 VkMemoryRequirements mem_reqs;
1619
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001620 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
1621
Tobin Ehlis35372522016-05-12 08:32:31 -06001622 VkBufferCreateInfo buf_info = {};
1623 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1624 buf_info.pNext = NULL;
1625 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1626 buf_info.size = 256;
1627 buf_info.queueFamilyIndexCount = 0;
1628 buf_info.pQueueFamilyIndices = NULL;
1629 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1630 buf_info.flags = 0;
1631 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1632 ASSERT_VK_SUCCESS(err);
1633
1634 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1635 VkMemoryAllocateInfo alloc_info = {};
1636 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1637 alloc_info.pNext = NULL;
1638 alloc_info.memoryTypeIndex = 0;
1639
1640 // Ensure memory is big enough for both bindings
1641 static const VkDeviceSize allocation_size = 0x10000;
1642 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001643 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001644 if (!pass) {
1645 vkDestroyBuffer(m_device->device(), buffer, NULL);
1646 return;
1647 }
1648 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1649 ASSERT_VK_SUCCESS(err);
1650
1651 uint8_t *pData;
1652 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "VkMapMemory: Attempting to map memory range of size zero");
Tobin Ehlis35372522016-05-12 08:32:31 -06001654 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1655 m_errorMonitor->VerifyFound();
1656 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001657 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001658 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001659 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1660 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1661 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001662 m_errorMonitor->VerifyFound();
1663
1664 // Unmap the memory to avoid re-map error
1665 vkUnmapMemory(m_device->device(), mem);
1666 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001667 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1668 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1669 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001670 m_errorMonitor->VerifyFound();
1671 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001672 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
1673 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001674 m_errorMonitor->VerifyFound();
1675 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001676 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06001677 vkUnmapMemory(m_device->device(), mem);
1678 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001679
Tobin Ehlis35372522016-05-12 08:32:31 -06001680 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001681 err = vkMapMemory(m_device->device(), mem, 4 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001682 ASSERT_VK_SUCCESS(err);
1683 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001684 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001685 mmr.memory = mem;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001686 mmr.offset = atom_size; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001687 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
Tobin Ehlis35372522016-05-12 08:32:31 -06001688 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1689 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001690
Tobin Ehlis35372522016-05-12 08:32:31 -06001691 // Now flush range that oversteps mapped range
1692 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001693 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001694 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001695 mmr.offset = atom_size;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001696 mmr.size = 4 * atom_size; // Flushing bounds exceed mapped bounds
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001697 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
1698 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1699 m_errorMonitor->VerifyFound();
1700
1701 // Now flush range with VK_WHOLE_SIZE that oversteps offset
1702 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001703 err = vkMapMemory(m_device->device(), mem, 2 * atom_size, 4 * atom_size, 0, (void **)&pData);
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001704 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001705 mmr.offset = atom_size;
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001706 mmr.size = VK_WHOLE_SIZE;
1707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00643);
Tobin Ehlis35372522016-05-12 08:32:31 -06001708 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1709 m_errorMonitor->VerifyFound();
1710
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001711#if 0 // Planning discussion with working group on this validation check.
Mark Lobodzinski3826a4f2016-11-15 09:38:51 -07001712 // Some platforms have an atomsize of 1 which makes the test meaningless
1713 if (atom_size > 3) {
1714 // Now with an offset NOT a multiple of the device limit
1715 vkUnmapMemory(m_device->device(), mem);
1716 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1717 ASSERT_VK_SUCCESS(err);
1718 mmr.offset = 3; // Not a multiple of atom_size
1719 mmr.size = VK_WHOLE_SIZE;
1720 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00644);
1721 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1722 m_errorMonitor->VerifyFound();
1723
1724 // Now with a size NOT a multiple of the device limit
1725 vkUnmapMemory(m_device->device(), mem);
1726 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1727 ASSERT_VK_SUCCESS(err);
1728 mmr.offset = atom_size;
1729 mmr.size = 2 * atom_size + 1; // Not a multiple of atom_size
1730 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00645);
1731 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1732 m_errorMonitor->VerifyFound();
1733 }
Tony Barboure3975eb2016-12-15 14:52:44 -07001734#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001735 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1736 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001737 if (!pass) {
1738 vkFreeMemory(m_device->device(), mem, NULL);
1739 vkDestroyBuffer(m_device->device(), buffer, NULL);
1740 return;
1741 }
1742 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1743 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1744
1745 vkDestroyBuffer(m_device->device(), buffer, NULL);
1746 vkFreeMemory(m_device->device(), mem, NULL);
1747}
1748
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001749#if 0 // disabled until PV gets real extension enable checks
Ian Elliott1c32c772016-04-28 14:47:13 -06001750TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1751 VkResult err;
1752 bool pass;
1753
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001754 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
1755 // following declaration (which is temporarily being moved below):
1756 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001757 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001758 VkSwapchainCreateInfoKHR swapchain_create_info = {VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR};
Ian Elliott1c32c772016-04-28 14:47:13 -06001759 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001760 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06001761 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001762 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001763
Tony Barbour1fa09702017-03-16 12:09:08 -06001764 ASSERT_NO_FATAL_FAILURE(Init());
Ian Elliott1c32c772016-04-28 14:47:13 -06001765
Ian Elliott3f06ce52016-04-29 14:46:21 -06001766#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1767#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1768 // Use the functions from the VK_KHR_android_surface extension without
1769 // enabling that extension:
1770
1771 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001772 VkAndroidSurfaceCreateInfoKHR android_create_info = {VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001773 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1774 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001775 pass = (err != VK_SUCCESS);
1776 ASSERT_TRUE(pass);
1777 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001778#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001779
Ian Elliott3f06ce52016-04-29 14:46:21 -06001780#if defined(VK_USE_PLATFORM_MIR_KHR)
1781 // Use the functions from the VK_KHR_mir_surface extension without enabling
1782 // that extension:
1783
1784 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001785 VkMirSurfaceCreateInfoKHR mir_create_info = {VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001786 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001787 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1788 pass = (err != VK_SUCCESS);
1789 ASSERT_TRUE(pass);
1790 m_errorMonitor->VerifyFound();
1791
1792 // Tell whether an mir_connection supports presentation:
1793 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001794 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1795 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001796 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001797#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001798
Ian Elliott3f06ce52016-04-29 14:46:21 -06001799#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1800 // Use the functions from the VK_KHR_wayland_surface extension without
1801 // enabling that extension:
1802
1803 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001804 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1806 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001807 pass = (err != VK_SUCCESS);
1808 ASSERT_TRUE(pass);
1809 m_errorMonitor->VerifyFound();
1810
1811 // Tell whether an wayland_display supports presentation:
1812 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001813 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1814 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001815 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001816#endif // VK_USE_PLATFORM_WAYLAND_KHR
1817#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001818
Ian Elliott3f06ce52016-04-29 14:46:21 -06001819#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001820 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1821 // TO NON-LINUX PLATFORMS:
1822 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001823 // Use the functions from the VK_KHR_win32_surface extension without
1824 // enabling that extension:
1825
1826 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001827 VkWin32SurfaceCreateInfoKHR win32_create_info = {VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001828 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1829 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001830 pass = (err != VK_SUCCESS);
1831 ASSERT_TRUE(pass);
1832 m_errorMonitor->VerifyFound();
1833
1834 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001835 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001836 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001837 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001838// Set this (for now, until all platforms are supported and tested):
1839#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001840#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001841#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001842 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1843 // TO NON-LINUX PLATFORMS:
1844 VkSurfaceKHR surface = VK_NULL_HANDLE;
Tony Barbour2e7bd402016-11-14 14:46:33 -07001845#endif
1846#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott1c32c772016-04-28 14:47:13 -06001847 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1848 // that extension:
1849
1850 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001851 VkXcbSurfaceCreateInfoKHR xcb_create_info = {VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001852 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001853 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1854 pass = (err != VK_SUCCESS);
1855 ASSERT_TRUE(pass);
1856 m_errorMonitor->VerifyFound();
1857
1858 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001859 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001860 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001861 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1862 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06001863 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001864// Set this (for now, until all platforms are supported and tested):
1865#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001866#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott1c32c772016-04-28 14:47:13 -06001867
Ian Elliott12630812016-04-29 14:35:43 -06001868#if defined(VK_USE_PLATFORM_XLIB_KHR)
1869 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1870 // that extension:
1871
1872 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001873 VkXlibSurfaceCreateInfoKHR xlib_create_info = {VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001875 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1876 pass = (err != VK_SUCCESS);
1877 ASSERT_TRUE(pass);
1878 m_errorMonitor->VerifyFound();
1879
1880 // Tell whether an Xlib VisualID supports presentation:
1881 Display *dpy = NULL;
1882 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001884 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1885 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001886// Set this (for now, until all platforms are supported and tested):
1887#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001888#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott12630812016-04-29 14:35:43 -06001889
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001890// Use the functions from the VK_KHR_surface extension without enabling
1891// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001892
Ian Elliott489eec02016-05-05 14:12:44 -06001893#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001894 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001895 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001896 vkDestroySurfaceKHR(instance(), surface, NULL);
1897 m_errorMonitor->VerifyFound();
1898
1899 // Check if surface supports presentation:
1900 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001901 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001902 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1903 pass = (err != VK_SUCCESS);
1904 ASSERT_TRUE(pass);
1905 m_errorMonitor->VerifyFound();
1906
1907 // Check surface capabilities:
1908 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1910 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06001911 pass = (err != VK_SUCCESS);
1912 ASSERT_TRUE(pass);
1913 m_errorMonitor->VerifyFound();
1914
1915 // Check surface formats:
1916 uint32_t format_count = 0;
1917 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001918 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1919 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06001920 pass = (err != VK_SUCCESS);
1921 ASSERT_TRUE(pass);
1922 m_errorMonitor->VerifyFound();
1923
1924 // Check surface present modes:
1925 uint32_t present_mode_count = 0;
1926 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001927 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1928 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06001929 pass = (err != VK_SUCCESS);
1930 ASSERT_TRUE(pass);
1931 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001932#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001933
Ian Elliott1c32c772016-04-28 14:47:13 -06001934 // Use the functions from the VK_KHR_swapchain extension without enabling
1935 // that extension:
1936
1937 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001939 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1940 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001941 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06001942 pass = (err != VK_SUCCESS);
1943 ASSERT_TRUE(pass);
1944 m_errorMonitor->VerifyFound();
1945
1946 // Get the images from the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1948 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06001949 pass = (err != VK_SUCCESS);
1950 ASSERT_TRUE(pass);
1951 m_errorMonitor->VerifyFound();
1952
Chris Forbeseb7d5502016-09-13 18:19:21 +12001953 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
1954 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
1955 VkFence fence;
1956 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
1957
Ian Elliott1c32c772016-04-28 14:47:13 -06001958 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001959 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12001960 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06001961 pass = (err != VK_SUCCESS);
1962 ASSERT_TRUE(pass);
1963 m_errorMonitor->VerifyFound();
1964
Chris Forbeseb7d5502016-09-13 18:19:21 +12001965 vkDestroyFence(m_device->device(), fence, nullptr);
1966
Ian Elliott1c32c772016-04-28 14:47:13 -06001967 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001968 //
1969 // NOTE: Currently can't test this because a real swapchain is needed (as
1970 // opposed to the fake one we created) in order for the layer to lookup the
1971 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001972
1973 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001975 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1976 m_errorMonitor->VerifyFound();
1977}
Chris Forbes09368e42016-10-13 11:59:22 +13001978#endif
Ian Elliott1c32c772016-04-28 14:47:13 -06001979
Karl Schultz6addd812016-02-02 17:17:23 -07001980TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1981 VkResult err;
1982 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001983
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001984 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1985 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001986
Tony Barbour1fa09702017-03-16 12:09:08 -06001987 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001988
1989 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001990 VkImage image;
1991 VkDeviceMemory mem;
1992 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001993
Karl Schultz6addd812016-02-02 17:17:23 -07001994 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1995 const int32_t tex_width = 32;
1996 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001997
Tony Barboureb254902015-07-15 12:50:33 -06001998 VkImageCreateInfo image_create_info = {};
1999 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002000 image_create_info.pNext = NULL;
2001 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2002 image_create_info.format = tex_format;
2003 image_create_info.extent.width = tex_width;
2004 image_create_info.extent.height = tex_height;
2005 image_create_info.extent.depth = 1;
2006 image_create_info.mipLevels = 1;
2007 image_create_info.arrayLayers = 1;
2008 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2009 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2010 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2011 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12002012 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002013
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002014 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002015 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002016 mem_alloc.pNext = NULL;
2017 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002018
Chia-I Wuf7458c52015-10-26 21:10:41 +08002019 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002020 ASSERT_VK_SUCCESS(err);
2021
Karl Schultz6addd812016-02-02 17:17:23 -07002022 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002023
Mark Lobodzinski23065352015-05-29 09:32:35 -05002024 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002025
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002026 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002027 if (!pass) { // If we can't find any unmappable memory this test doesn't
2028 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002029 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002030 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002031 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002032
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002033 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002034 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002035 ASSERT_VK_SUCCESS(err);
2036
2037 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002038 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002039 ASSERT_VK_SUCCESS(err);
2040
2041 // Map memory as if to initialize the image
2042 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002043 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002044
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002045 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002046
Chia-I Wuf7458c52015-10-26 21:10:41 +08002047 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002048 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002049}
2050
Karl Schultz6addd812016-02-02 17:17:23 -07002051TEST_F(VkLayerTest, RebindMemory) {
2052 VkResult err;
2053 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002054
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002055 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002056
Tony Barbour1fa09702017-03-16 12:09:08 -06002057 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002058
2059 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002060 VkImage image;
2061 VkDeviceMemory mem1;
2062 VkDeviceMemory mem2;
2063 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002064
Karl Schultz6addd812016-02-02 17:17:23 -07002065 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2066 const int32_t tex_width = 32;
2067 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002068
Tony Barboureb254902015-07-15 12:50:33 -06002069 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002070 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2071 image_create_info.pNext = NULL;
2072 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2073 image_create_info.format = tex_format;
2074 image_create_info.extent.width = tex_width;
2075 image_create_info.extent.height = tex_height;
2076 image_create_info.extent.depth = 1;
2077 image_create_info.mipLevels = 1;
2078 image_create_info.arrayLayers = 1;
2079 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2080 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2081 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2082 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002083
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002084 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002085 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2086 mem_alloc.pNext = NULL;
2087 mem_alloc.allocationSize = 0;
2088 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002089
Karl Schultz6addd812016-02-02 17:17:23 -07002090 // Introduce failure, do NOT set memProps to
2091 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002092 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002093 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002094 ASSERT_VK_SUCCESS(err);
2095
Karl Schultz6addd812016-02-02 17:17:23 -07002096 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002097
2098 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002099 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002100 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002101
2102 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002103 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002104 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002105 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002106 ASSERT_VK_SUCCESS(err);
2107
2108 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002109 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002110 ASSERT_VK_SUCCESS(err);
2111
Karl Schultz6addd812016-02-02 17:17:23 -07002112 // Introduce validation failure, try to bind a different memory object to
2113 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002114 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002115
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002116 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002117
Chia-I Wuf7458c52015-10-26 21:10:41 +08002118 vkDestroyImage(m_device->device(), image, NULL);
2119 vkFreeMemory(m_device->device(), mem1, NULL);
2120 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002121}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002122
Karl Schultz6addd812016-02-02 17:17:23 -07002123TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002124 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002125
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002126 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2127 "submitted in SIGNALED state. Fences "
2128 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002129
2130 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002131 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2132 fenceInfo.pNext = NULL;
2133 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002134
Tony Barbour1fa09702017-03-16 12:09:08 -06002135 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour300a6082015-04-07 13:44:53 -06002136 ASSERT_NO_FATAL_FAILURE(InitViewport());
2137 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2138
Tony Barbour552f6c02016-12-21 14:34:07 -07002139 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002140 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07002141 m_commandBuffer->EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002142
2143 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002144
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002145 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002146 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2147 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002148 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002149 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002150 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002151 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002152 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002153 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002154 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002155
2156 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002157 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002158
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002159 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002160}
Chris Forbes4e44c912016-06-16 10:20:00 +12002161
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002162TEST_F(VkLayerTest, InvalidUsageBits) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002163 TEST_DESCRIPTION(
2164 "Specify wrong usage for image then create conflicting view of image "
2165 "Initialize buffer with wrong usage then perform copy expecting errors "
2166 "from both the image and the buffer (2 calls)");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002167 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002168
Tony Barbour1fa09702017-03-16 12:09:08 -06002169 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002170
Tony Barbourf887b162017-03-09 10:06:46 -07002171 auto format = find_depth_stencil_format(m_device);
2172 if (!format) {
2173 printf(" No Depth + Stencil format found. Skipped.\n");
2174 return;
2175 }
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002176
Tony Barbourf92621a2016-05-02 14:28:12 -06002177 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06002178 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002179 image.init(128, 128, format, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002180 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06002181
Tony Barbourf92621a2016-05-02 14:28:12 -06002182 VkImageView dsv;
2183 VkImageViewCreateInfo dsvci = {};
2184 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2185 dsvci.image = image.handle();
2186 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002187 dsvci.format = format;
Tony Barbourf92621a2016-05-02 14:28:12 -06002188 dsvci.subresourceRange.layerCount = 1;
2189 dsvci.subresourceRange.baseMipLevel = 0;
2190 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002191 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002192
Tony Barbourf92621a2016-05-02 14:28:12 -06002193 // Create a view with depth / stencil aspect for image with different usage
2194 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002195
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002196 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002197
2198 // Initialize buffer with TRANSFER_DST usage
2199 vk_testing::Buffer buffer;
2200 VkMemoryPropertyFlags reqs = 0;
2201 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2202 VkBufferImageCopy region = {};
2203 region.bufferRowLength = 128;
2204 region.bufferImageHeight = 128;
Mark Lobodzinski80871462017-02-16 10:37:27 -07002205 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Tony Barbourf92621a2016-05-02 14:28:12 -06002206 region.imageSubresource.layerCount = 1;
2207 region.imageExtent.height = 16;
2208 region.imageExtent.width = 16;
2209 region.imageExtent.depth = 1;
2210
Mark Lobodzinski80871462017-02-16 10:37:27 -07002211 // Buffer usage not set to TRANSFER_SRC and image usage not set to TRANSFER_DST
Tony Barbour552f6c02016-12-21 14:34:07 -07002212 m_commandBuffer->BeginCommandBuffer();
Tony Barbourf92621a2016-05-02 14:28:12 -06002213
Chris Forbesda581202016-10-06 18:25:26 +13002214 // two separate errors from this call:
2215 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "image should have VK_IMAGE_USAGE_TRANSFER_DST_BIT");
2216 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "buffer should have VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
2217
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002218 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
2219 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06002220 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002221}
Tony Barbour75d79f02016-08-30 09:39:07 -06002222
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002223TEST_F(VkLayerTest, LeakAnObject) {
2224 VkResult err;
2225
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002226 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002227
2228 // Note that we have to create a new device since destroying the
2229 // framework's device causes Teardown() to fail and just calling Teardown
2230 // will destroy the errorMonitor.
2231
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002232 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002233
Tony Barbour1fa09702017-03-16 12:09:08 -06002234 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002235
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002236 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002237 std::vector<VkDeviceQueueCreateInfo> queue_info;
2238 queue_info.reserve(queue_props.size());
2239 std::vector<std::vector<float>> queue_priorities;
2240 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2241 VkDeviceQueueCreateInfo qi = {};
2242 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2243 qi.pNext = NULL;
2244 qi.queueFamilyIndex = i;
2245 qi.queueCount = queue_props[i].queueCount;
2246 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2247 qi.pQueuePriorities = queue_priorities[i].data();
2248 queue_info.push_back(qi);
2249 }
2250
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002251 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002252
2253 // The sacrificial device object
2254 VkDevice testDevice;
2255 VkDeviceCreateInfo device_create_info = {};
2256 auto features = m_device->phy().features();
2257 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2258 device_create_info.pNext = NULL;
2259 device_create_info.queueCreateInfoCount = queue_info.size();
2260 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06002261 device_create_info.enabledLayerCount = 0;
2262 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002263 device_create_info.pEnabledFeatures = &features;
2264 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2265 ASSERT_VK_SUCCESS(err);
2266
2267 VkFence fence;
2268 VkFenceCreateInfo fence_create_info = {};
2269 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2270 fence_create_info.pNext = NULL;
2271 fence_create_info.flags = 0;
2272 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2273 ASSERT_VK_SUCCESS(err);
2274
2275 // Induce failure by not calling vkDestroyFence
2276 vkDestroyDevice(testDevice, NULL);
2277 m_errorMonitor->VerifyFound();
2278}
2279
2280TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002281 TEST_DESCRIPTION(
2282 "Allocate command buffers from one command pool and "
2283 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002284
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002285 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002286
Tony Barbour1fa09702017-03-16 12:09:08 -06002287 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002288 VkCommandPool command_pool_one;
2289 VkCommandPool command_pool_two;
2290
2291 VkCommandPoolCreateInfo pool_create_info{};
2292 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2293 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2294 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2295
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002296 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002297
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002298 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002299
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002300 VkCommandBuffer cb;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002301 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002302 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002303 command_buffer_allocate_info.commandPool = command_pool_one;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002304 command_buffer_allocate_info.commandBufferCount = 1;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002305 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002306 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002307
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002308 vkFreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002309
2310 m_errorMonitor->VerifyFound();
2311
2312 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2313 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2314}
2315
2316TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2317 VkResult err;
2318
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002319 TEST_DESCRIPTION(
2320 "Allocate descriptor sets from one DS pool and "
2321 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002322
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002323 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002324
Tony Barbour1fa09702017-03-16 12:09:08 -06002325 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002326 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2327
2328 VkDescriptorPoolSize ds_type_count = {};
2329 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2330 ds_type_count.descriptorCount = 1;
2331
2332 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2333 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2334 ds_pool_ci.pNext = NULL;
2335 ds_pool_ci.flags = 0;
2336 ds_pool_ci.maxSets = 1;
2337 ds_pool_ci.poolSizeCount = 1;
2338 ds_pool_ci.pPoolSizes = &ds_type_count;
2339
2340 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002341 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002342 ASSERT_VK_SUCCESS(err);
2343
2344 // Create a second descriptor pool
2345 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002346 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002347 ASSERT_VK_SUCCESS(err);
2348
2349 VkDescriptorSetLayoutBinding dsl_binding = {};
2350 dsl_binding.binding = 0;
2351 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2352 dsl_binding.descriptorCount = 1;
2353 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2354 dsl_binding.pImmutableSamplers = NULL;
2355
2356 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2357 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2358 ds_layout_ci.pNext = NULL;
2359 ds_layout_ci.bindingCount = 1;
2360 ds_layout_ci.pBindings = &dsl_binding;
2361
2362 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002363 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002364 ASSERT_VK_SUCCESS(err);
2365
2366 VkDescriptorSet descriptorSet;
2367 VkDescriptorSetAllocateInfo alloc_info = {};
2368 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2369 alloc_info.descriptorSetCount = 1;
2370 alloc_info.descriptorPool = ds_pool_one;
2371 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002372 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002373 ASSERT_VK_SUCCESS(err);
2374
2375 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2376
2377 m_errorMonitor->VerifyFound();
2378
2379 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2380 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2381 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2382}
2383
2384TEST_F(VkLayerTest, CreateUnknownObject) {
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002385 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00788);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002386
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002387 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002388
Tony Barbour1fa09702017-03-16 12:09:08 -06002389 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002390
2391 // Pass bogus handle into GetImageMemoryRequirements
2392 VkMemoryRequirements mem_reqs;
2393 uint64_t fakeImageHandle = 0xCADECADE;
2394 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2395
2396 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2397
2398 m_errorMonitor->VerifyFound();
2399}
2400
Mike Schuchardt17838902017-02-21 09:48:06 -07002401TEST_F(VkLayerTest, UseObjectWithWrongDevice) {
2402 TEST_DESCRIPTION(
2403 "Try to destroy a render pass object using a device other than the one it was created on. "
2404 "This should generate a distinct error from the invalid handle error.");
2405 // Create first device and renderpass
Tony Barbour1fa09702017-03-16 12:09:08 -06002406 ASSERT_NO_FATAL_FAILURE(Init());
Mike Schuchardt17838902017-02-21 09:48:06 -07002407 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2408
2409 // Create second device
2410 float priorities[] = {1.0f};
2411 VkDeviceQueueCreateInfo queue_info{};
2412 queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2413 queue_info.pNext = NULL;
2414 queue_info.flags = 0;
2415 queue_info.queueFamilyIndex = 0;
2416 queue_info.queueCount = 1;
2417 queue_info.pQueuePriorities = &priorities[0];
2418
2419 VkDeviceCreateInfo device_create_info = {};
2420 auto features = m_device->phy().features();
2421 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2422 device_create_info.pNext = NULL;
2423 device_create_info.queueCreateInfoCount = 1;
2424 device_create_info.pQueueCreateInfos = &queue_info;
2425 device_create_info.enabledLayerCount = 0;
2426 device_create_info.ppEnabledLayerNames = NULL;
2427 device_create_info.pEnabledFeatures = &features;
2428
2429 VkDevice second_device;
2430 ASSERT_VK_SUCCESS(vkCreateDevice(gpu(), &device_create_info, NULL, &second_device));
2431
2432 // Try to destroy the renderpass from the first device using the second device
2433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00399);
2434 vkDestroyRenderPass(second_device, m_renderPass, NULL);
2435 m_errorMonitor->VerifyFound();
2436
2437 vkDestroyDevice(second_device, NULL);
2438}
2439
Karl Schultz6addd812016-02-02 17:17:23 -07002440TEST_F(VkLayerTest, PipelineNotBound) {
2441 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002442
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002443 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002444
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002445 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002446
Tony Barbour1fa09702017-03-16 12:09:08 -06002447 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002448 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002449
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002450 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002451 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2452 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002453
2454 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002455 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2456 ds_pool_ci.pNext = NULL;
2457 ds_pool_ci.maxSets = 1;
2458 ds_pool_ci.poolSizeCount = 1;
2459 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002460
2461 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002462 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002463 ASSERT_VK_SUCCESS(err);
2464
2465 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002466 dsl_binding.binding = 0;
2467 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2468 dsl_binding.descriptorCount = 1;
2469 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2470 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002471
2472 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002473 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2474 ds_layout_ci.pNext = NULL;
2475 ds_layout_ci.bindingCount = 1;
2476 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002477
2478 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002479 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002480 ASSERT_VK_SUCCESS(err);
2481
2482 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002483 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002484 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002485 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002486 alloc_info.descriptorPool = ds_pool;
2487 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002488 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002489 ASSERT_VK_SUCCESS(err);
2490
2491 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002492 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2493 pipeline_layout_ci.pNext = NULL;
2494 pipeline_layout_ci.setLayoutCount = 1;
2495 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002496
2497 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002498 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002499 ASSERT_VK_SUCCESS(err);
2500
Mark Youngad779052016-01-06 14:26:04 -07002501 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002502
Tony Barbour552f6c02016-12-21 14:34:07 -07002503 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002504 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002505
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002506 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002507
Chia-I Wuf7458c52015-10-26 21:10:41 +08002508 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2509 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2510 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002511}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002512
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002513TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
2514 VkResult err;
2515
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002516 TEST_DESCRIPTION(
2517 "Test validation check for an invalid memory type index "
2518 "during bind[Buffer|Image]Memory time");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002519
Tony Barbour1fa09702017-03-16 12:09:08 -06002520 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002521
2522 // Create an image, allocate memory, set a bad typeIndex and then try to
2523 // bind it
2524 VkImage image;
2525 VkDeviceMemory mem;
2526 VkMemoryRequirements mem_reqs;
2527 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2528 const int32_t tex_width = 32;
2529 const int32_t tex_height = 32;
2530
2531 VkImageCreateInfo image_create_info = {};
2532 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2533 image_create_info.pNext = NULL;
2534 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2535 image_create_info.format = tex_format;
2536 image_create_info.extent.width = tex_width;
2537 image_create_info.extent.height = tex_height;
2538 image_create_info.extent.depth = 1;
2539 image_create_info.mipLevels = 1;
2540 image_create_info.arrayLayers = 1;
2541 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2542 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2543 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2544 image_create_info.flags = 0;
2545
2546 VkMemoryAllocateInfo mem_alloc = {};
2547 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2548 mem_alloc.pNext = NULL;
2549 mem_alloc.allocationSize = 0;
2550 mem_alloc.memoryTypeIndex = 0;
2551
2552 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2553 ASSERT_VK_SUCCESS(err);
2554
2555 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
2556 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002557
2558 // Introduce Failure, select invalid TypeIndex
2559 VkPhysicalDeviceMemoryProperties memory_info;
2560
2561 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
2562 unsigned int i;
2563 for (i = 0; i < memory_info.memoryTypeCount; i++) {
2564 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
2565 mem_alloc.memoryTypeIndex = i;
2566 break;
2567 }
2568 }
2569 if (i >= memory_info.memoryTypeCount) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002570 printf(" No invalid memory type index could be found; skipped.\n");
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002571 vkDestroyImage(m_device->device(), image, NULL);
2572 return;
2573 }
2574
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002575 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "for this object type are not compatible with the memory");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002576
2577 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
2578 ASSERT_VK_SUCCESS(err);
2579
2580 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2581 (void)err;
2582
2583 m_errorMonitor->VerifyFound();
2584
2585 vkDestroyImage(m_device->device(), image, NULL);
2586 vkFreeMemory(m_device->device(), mem, NULL);
2587}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002588
Karl Schultz6addd812016-02-02 17:17:23 -07002589TEST_F(VkLayerTest, BindInvalidMemory) {
2590 VkResult err;
2591 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002592
Tony Barbour1fa09702017-03-16 12:09:08 -06002593 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002594
Cortf801b982017-01-17 18:10:21 -08002595 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
Cort Strattonde748202017-02-17 12:50:01 -08002596 const int32_t tex_width = 256;
2597 const int32_t tex_height = 256;
Tobin Ehlisec598302015-09-15 15:02:17 -06002598
2599 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002600 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2601 image_create_info.pNext = NULL;
2602 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2603 image_create_info.format = tex_format;
2604 image_create_info.extent.width = tex_width;
2605 image_create_info.extent.height = tex_height;
2606 image_create_info.extent.depth = 1;
2607 image_create_info.mipLevels = 1;
2608 image_create_info.arrayLayers = 1;
2609 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002610 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -07002611 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2612 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002613
Cortf801b982017-01-17 18:10:21 -08002614 VkBufferCreateInfo buffer_create_info = {};
2615 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2616 buffer_create_info.pNext = NULL;
2617 buffer_create_info.flags = 0;
Cort Strattonde748202017-02-17 12:50:01 -08002618 buffer_create_info.size = 4 * 1024 * 1024;
2619 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
Cortf801b982017-01-17 18:10:21 -08002620 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tobin Ehlisec598302015-09-15 15:02:17 -06002621
Cortf801b982017-01-17 18:10:21 -08002622 // Create an image/buffer, allocate memory, free it, and then try to bind it
2623 {
2624 VkImage image = VK_NULL_HANDLE;
2625 VkBuffer buffer = VK_NULL_HANDLE;
2626 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2627 ASSERT_VK_SUCCESS(err);
2628 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2629 ASSERT_VK_SUCCESS(err);
2630 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2631 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2632 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002633
Cortf801b982017-01-17 18:10:21 -08002634 VkMemoryAllocateInfo image_mem_alloc = {}, buffer_mem_alloc = {};
2635 image_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2636 image_mem_alloc.allocationSize = image_mem_reqs.size;
2637 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_mem_alloc, 0);
2638 ASSERT_TRUE(pass);
2639 buffer_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2640 buffer_mem_alloc.allocationSize = buffer_mem_reqs.size;
2641 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_mem_alloc, 0);
2642 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002643
Cortf801b982017-01-17 18:10:21 -08002644 VkDeviceMemory image_mem = VK_NULL_HANDLE, buffer_mem = VK_NULL_HANDLE;
2645 err = vkAllocateMemory(device(), &image_mem_alloc, NULL, &image_mem);
2646 ASSERT_VK_SUCCESS(err);
2647 err = vkAllocateMemory(device(), &buffer_mem_alloc, NULL, &buffer_mem);
2648 ASSERT_VK_SUCCESS(err);
Tobin Ehlisec598302015-09-15 15:02:17 -06002649
Cortf801b982017-01-17 18:10:21 -08002650 vkFreeMemory(device(), image_mem, NULL);
2651 vkFreeMemory(device(), buffer_mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002652
Cortf801b982017-01-17 18:10:21 -08002653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00809);
2654 err = vkBindImageMemory(device(), image, image_mem, 0);
2655 (void)err; // This may very well return an error.
2656 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002657
Cortf801b982017-01-17 18:10:21 -08002658 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00800);
2659 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2660 (void)err; // This may very well return an error.
2661 m_errorMonitor->VerifyFound();
Tobin Ehlisec598302015-09-15 15:02:17 -06002662
Cortf801b982017-01-17 18:10:21 -08002663 vkDestroyImage(m_device->device(), image, NULL);
2664 vkDestroyBuffer(m_device->device(), buffer, NULL);
2665 }
Cort Strattonc21601b2017-01-28 14:16:16 -08002666
2667 // Try to bind memory to an object that already has a memory binding
2668 {
2669 VkImage image = VK_NULL_HANDLE;
2670 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2671 ASSERT_VK_SUCCESS(err);
2672 VkBuffer buffer = VK_NULL_HANDLE;
2673 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2674 ASSERT_VK_SUCCESS(err);
2675 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2676 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2677 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2678 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2679 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2680 image_alloc_info.allocationSize = image_mem_reqs.size;
2681 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2682 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
2683 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2684 ASSERT_TRUE(pass);
2685 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2686 ASSERT_TRUE(pass);
2687 VkDeviceMemory image_mem, buffer_mem;
2688 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2689 ASSERT_VK_SUCCESS(err);
2690 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2691 ASSERT_VK_SUCCESS(err);
2692
2693 err = vkBindImageMemory(device(), image, image_mem, 0);
2694 ASSERT_VK_SUCCESS(err);
2695 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00803);
2696 err = vkBindImageMemory(device(), image, image_mem, 0);
2697 (void)err; // This may very well return an error.
2698 m_errorMonitor->VerifyFound();
2699
2700 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2701 ASSERT_VK_SUCCESS(err);
2702 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00791);
2703 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2704 (void)err; // This may very well return an error.
2705 m_errorMonitor->VerifyFound();
2706
2707 vkFreeMemory(device(), image_mem, NULL);
2708 vkFreeMemory(device(), buffer_mem, NULL);
2709 vkDestroyImage(device(), image, NULL);
2710 vkDestroyBuffer(device(), buffer, NULL);
2711 }
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002712
Cort Strattonde748202017-02-17 12:50:01 -08002713 // Try to bind memory to an object with an invalid memoryOffset
Cort6c7dff72017-01-27 18:34:50 -08002714 {
2715 VkImage image = VK_NULL_HANDLE;
2716 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2717 ASSERT_VK_SUCCESS(err);
2718 VkBuffer buffer = VK_NULL_HANDLE;
2719 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2720 ASSERT_VK_SUCCESS(err);
2721 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2722 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2723 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2724 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2725 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002726 // Leave some extra space for alignment wiggle room
2727 image_alloc_info.allocationSize = image_mem_reqs.size + image_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002728 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002729 buffer_alloc_info.allocationSize = buffer_mem_reqs.size + buffer_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002730 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2731 ASSERT_TRUE(pass);
2732 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2733 ASSERT_TRUE(pass);
2734 VkDeviceMemory image_mem, buffer_mem;
2735 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2736 ASSERT_VK_SUCCESS(err);
2737 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2738 ASSERT_VK_SUCCESS(err);
2739
Cort Strattonde748202017-02-17 12:50:01 -08002740 // Test unaligned memory offset
2741 {
2742 if (image_mem_reqs.alignment > 1) {
2743 VkDeviceSize image_offset = 1;
2744 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02178);
2745 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2746 (void)err; // This may very well return an error.
2747 m_errorMonitor->VerifyFound();
2748 }
Cort6c7dff72017-01-27 18:34:50 -08002749
Cort Strattonde748202017-02-17 12:50:01 -08002750 if (buffer_mem_reqs.alignment > 1) {
2751 VkDeviceSize buffer_offset = 1;
2752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02174);
2753 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2754 (void)err; // This may very well return an error.
2755 m_errorMonitor->VerifyFound();
2756 }
2757 }
2758
2759 // Test memory offsets outside the memory allocation
2760 {
2761 VkDeviceSize image_offset =
2762 (image_alloc_info.allocationSize + image_mem_reqs.alignment) & ~(image_mem_reqs.alignment - 1);
2763 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00805);
2764 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2765 (void)err; // This may very well return an error.
2766 m_errorMonitor->VerifyFound();
2767
2768 VkDeviceSize buffer_offset =
2769 (buffer_alloc_info.allocationSize + buffer_mem_reqs.alignment) & ~(buffer_mem_reqs.alignment - 1);
2770 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00793);
2771 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2772 (void)err; // This may very well return an error.
2773 m_errorMonitor->VerifyFound();
2774 }
2775
2776 // Test memory offsets within the memory allocation, but which leave too little memory for
2777 // the resource.
2778 {
2779 VkDeviceSize image_offset = (image_mem_reqs.size - 1) & ~(image_mem_reqs.alignment - 1);
2780 if (image_offset > 0) {
2781 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02179);
2782 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2783 (void)err; // This may very well return an error.
2784 m_errorMonitor->VerifyFound();
2785 }
2786
2787 VkDeviceSize buffer_offset = (buffer_mem_reqs.size - 1) & ~(buffer_mem_reqs.alignment - 1);
2788 if (buffer_offset > 0) {
2789 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02175);
2790 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2791 (void)err; // This may very well return an error.
2792 m_errorMonitor->VerifyFound();
2793 }
2794 }
Cort6c7dff72017-01-27 18:34:50 -08002795
2796 vkFreeMemory(device(), image_mem, NULL);
2797 vkFreeMemory(device(), buffer_mem, NULL);
2798 vkDestroyImage(device(), image, NULL);
2799 vkDestroyBuffer(device(), buffer, NULL);
2800 }
2801
Cort Stratton4c38bb52017-01-28 13:33:10 -08002802 // Try to bind memory to an object with an invalid memory type
2803 {
2804 VkImage image = VK_NULL_HANDLE;
2805 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2806 ASSERT_VK_SUCCESS(err);
2807 VkBuffer buffer = VK_NULL_HANDLE;
2808 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2809 ASSERT_VK_SUCCESS(err);
2810 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2811 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2812 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2813 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2814 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2815 image_alloc_info.allocationSize = image_mem_reqs.size;
2816 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2817 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
Cort Strattonccc90e32017-02-04 13:47:42 -08002818 // Create a mask of available memory types *not* supported by these resources,
2819 // and try to use one of them.
Cort Stratton4c38bb52017-01-28 13:33:10 -08002820 VkPhysicalDeviceMemoryProperties memory_properties = {};
2821 vkGetPhysicalDeviceMemoryProperties(m_device->phy().handle(), &memory_properties);
Cort Strattonccc90e32017-02-04 13:47:42 -08002822 VkDeviceMemory image_mem, buffer_mem;
2823
Cort Stratton4c38bb52017-01-28 13:33:10 -08002824 uint32_t image_unsupported_mem_type_bits = ((1 << memory_properties.memoryTypeCount) - 1) & ~image_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002825 if (image_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002826 pass = m_device->phy().set_memory_type(image_unsupported_mem_type_bits, &image_alloc_info, 0);
2827 ASSERT_TRUE(pass);
2828 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2829 ASSERT_VK_SUCCESS(err);
2830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00806);
2831 err = vkBindImageMemory(device(), image, image_mem, 0);
2832 (void)err; // This may very well return an error.
2833 m_errorMonitor->VerifyFound();
2834 vkFreeMemory(device(), image_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002835 }
2836
Cort Stratton4c38bb52017-01-28 13:33:10 -08002837 uint32_t buffer_unsupported_mem_type_bits =
2838 ((1 << memory_properties.memoryTypeCount) - 1) & ~buffer_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002839 if (buffer_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002840 pass = m_device->phy().set_memory_type(buffer_unsupported_mem_type_bits, &buffer_alloc_info, 0);
2841 ASSERT_TRUE(pass);
2842 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2843 ASSERT_VK_SUCCESS(err);
2844 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00797);
2845 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2846 (void)err; // This may very well return an error.
2847 m_errorMonitor->VerifyFound();
2848 vkFreeMemory(device(), buffer_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002849 }
Cort Stratton4c38bb52017-01-28 13:33:10 -08002850
Cort Stratton4c38bb52017-01-28 13:33:10 -08002851 vkDestroyImage(device(), image, NULL);
2852 vkDestroyBuffer(device(), buffer, NULL);
2853 }
2854
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002855 // Try to bind memory to an image created with sparse memory flags
2856 {
2857 VkImageCreateInfo sparse_image_create_info = image_create_info;
2858 sparse_image_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2859 VkImageFormatProperties image_format_properties = {};
2860 err = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), sparse_image_create_info.format,
2861 sparse_image_create_info.imageType, sparse_image_create_info.tiling,
2862 sparse_image_create_info.usage, sparse_image_create_info.flags,
2863 &image_format_properties);
2864 if (!m_device->phy().features().sparseResidencyImage2D || err == VK_ERROR_FORMAT_NOT_SUPPORTED) {
2865 // most likely means sparse formats aren't supported here; skip this test.
2866 } else {
2867 ASSERT_VK_SUCCESS(err);
2868 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002869 printf(" Sparse image format not supported; skipped.\n");
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002870 return;
2871 } else {
2872 VkImage sparse_image = VK_NULL_HANDLE;
2873 err = vkCreateImage(m_device->device(), &sparse_image_create_info, NULL, &sparse_image);
2874 ASSERT_VK_SUCCESS(err);
2875 VkMemoryRequirements sparse_mem_reqs = {};
2876 vkGetImageMemoryRequirements(m_device->device(), sparse_image, &sparse_mem_reqs);
2877 if (sparse_mem_reqs.memoryTypeBits != 0) {
2878 VkMemoryAllocateInfo sparse_mem_alloc = {};
2879 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2880 sparse_mem_alloc.pNext = NULL;
2881 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2882 sparse_mem_alloc.memoryTypeIndex = 0;
2883 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2884 ASSERT_TRUE(pass);
2885 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2886 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2887 ASSERT_VK_SUCCESS(err);
2888 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00804);
2889 err = vkBindImageMemory(m_device->device(), sparse_image, sparse_mem, 0);
2890 // This may very well return an error.
2891 (void)err;
2892 m_errorMonitor->VerifyFound();
2893 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2894 }
2895 vkDestroyImage(m_device->device(), sparse_image, NULL);
2896 }
2897 }
2898 }
2899
2900 // Try to bind memory to a buffer created with sparse memory flags
2901 {
2902 VkBufferCreateInfo sparse_buffer_create_info = buffer_create_info;
2903 sparse_buffer_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2904 if (!m_device->phy().features().sparseResidencyBuffer) {
2905 // most likely means sparse formats aren't supported here; skip this test.
2906 } else {
2907 VkBuffer sparse_buffer = VK_NULL_HANDLE;
2908 err = vkCreateBuffer(m_device->device(), &sparse_buffer_create_info, NULL, &sparse_buffer);
2909 ASSERT_VK_SUCCESS(err);
2910 VkMemoryRequirements sparse_mem_reqs = {};
2911 vkGetBufferMemoryRequirements(m_device->device(), sparse_buffer, &sparse_mem_reqs);
2912 if (sparse_mem_reqs.memoryTypeBits != 0) {
2913 VkMemoryAllocateInfo sparse_mem_alloc = {};
2914 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2915 sparse_mem_alloc.pNext = NULL;
2916 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2917 sparse_mem_alloc.memoryTypeIndex = 0;
2918 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2919 ASSERT_TRUE(pass);
2920 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2921 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2922 ASSERT_VK_SUCCESS(err);
2923 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00792);
2924 err = vkBindBufferMemory(m_device->device(), sparse_buffer, sparse_mem, 0);
2925 // This may very well return an error.
2926 (void)err;
2927 m_errorMonitor->VerifyFound();
2928 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2929 }
2930 vkDestroyBuffer(m_device->device(), sparse_buffer, NULL);
2931 }
2932 }
Tobin Ehlisec598302015-09-15 15:02:17 -06002933}
2934
Karl Schultz6addd812016-02-02 17:17:23 -07002935TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2936 VkResult err;
2937 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002938
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002939 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002940
Tony Barbour1fa09702017-03-16 12:09:08 -06002941 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisec598302015-09-15 15:02:17 -06002942
Karl Schultz6addd812016-02-02 17:17:23 -07002943 // Create an image object, allocate memory, destroy the object and then try
2944 // to bind it
2945 VkImage image;
2946 VkDeviceMemory mem;
2947 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002948
Karl Schultz6addd812016-02-02 17:17:23 -07002949 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2950 const int32_t tex_width = 32;
2951 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002952
2953 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002954 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2955 image_create_info.pNext = NULL;
2956 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2957 image_create_info.format = tex_format;
2958 image_create_info.extent.width = tex_width;
2959 image_create_info.extent.height = tex_height;
2960 image_create_info.extent.depth = 1;
2961 image_create_info.mipLevels = 1;
2962 image_create_info.arrayLayers = 1;
2963 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2964 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2965 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2966 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002967
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002968 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002969 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2970 mem_alloc.pNext = NULL;
2971 mem_alloc.allocationSize = 0;
2972 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002973
Chia-I Wuf7458c52015-10-26 21:10:41 +08002974 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002975 ASSERT_VK_SUCCESS(err);
2976
Karl Schultz6addd812016-02-02 17:17:23 -07002977 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002978
2979 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002980 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002981 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002982
2983 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002984 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002985 ASSERT_VK_SUCCESS(err);
2986
2987 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002988 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002989 ASSERT_VK_SUCCESS(err);
2990
2991 // Now Try to bind memory to this destroyed object
2992 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2993 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07002994 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06002995
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002996 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002997
Chia-I Wuf7458c52015-10-26 21:10:41 +08002998 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002999}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06003000
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003001TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
3002 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
3003
Tony Barbour1fa09702017-03-16 12:09:08 -06003004 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003005 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3006
3007 VkVertexInputBindingDescription input_binding;
3008 memset(&input_binding, 0, sizeof(input_binding));
3009
3010 VkVertexInputAttributeDescription input_attribs;
3011 memset(&input_attribs, 0, sizeof(input_attribs));
3012
3013 // Pick a really bad format for this purpose and make sure it should fail
3014 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
3015 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
3016 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07003017 printf(" Format unsuitable for test; skipped.\n");
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003018 return;
3019 }
3020
3021 input_attribs.location = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003022 char const *vsSource =
3023 "#version 450\n"
3024 "\n"
3025 "out gl_PerVertex {\n"
3026 " vec4 gl_Position;\n"
3027 "};\n"
3028 "void main(){\n"
3029 " gl_Position = vec4(1);\n"
3030 "}\n";
3031 char const *fsSource =
3032 "#version 450\n"
3033 "\n"
3034 "layout(location=0) out vec4 color;\n"
3035 "void main(){\n"
3036 " color = vec4(1);\n"
3037 "}\n";
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003038
3039 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
3040 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3041 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3042
3043 VkPipelineObj pipe(m_device);
3044 pipe.AddColorAttachment();
3045 pipe.AddShader(&vs);
3046 pipe.AddShader(&fs);
3047
3048 pipe.AddVertexInputBindings(&input_binding, 1);
3049 pipe.AddVertexInputAttribs(&input_attribs, 1);
3050
3051 VkDescriptorSetObj descriptorSet(m_device);
3052 descriptorSet.AppendDummy();
3053 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
3054
3055 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
3056
3057 m_errorMonitor->VerifyFound();
3058}
3059
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003060TEST_F(VkLayerTest, ImageSampleCounts) {
Jeremy Hayes0d104082017-02-21 10:24:16 -07003061 TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger validation errors.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003062 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003063
3064 VkMemoryPropertyFlags reqs = 0;
3065 VkImageCreateInfo image_create_info = {};
3066 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3067 image_create_info.pNext = NULL;
3068 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3069 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3070 image_create_info.extent.width = 256;
3071 image_create_info.extent.height = 256;
3072 image_create_info.extent.depth = 1;
3073 image_create_info.mipLevels = 1;
3074 image_create_info.arrayLayers = 1;
3075 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3076 image_create_info.flags = 0;
3077
3078 VkImageBlit blit_region = {};
3079 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3080 blit_region.srcSubresource.baseArrayLayer = 0;
3081 blit_region.srcSubresource.layerCount = 1;
3082 blit_region.srcSubresource.mipLevel = 0;
3083 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3084 blit_region.dstSubresource.baseArrayLayer = 0;
3085 blit_region.dstSubresource.layerCount = 1;
3086 blit_region.dstSubresource.mipLevel = 0;
3087
3088 // Create two images, the source with sampleCount = 2, and attempt to blit
3089 // between them
3090 {
3091 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003092 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003093 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003094 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003095 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003096 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003097 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003098 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003099 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003100 m_errorMonitor->SetDesiredFailureMsg(
3101 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3102 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003103 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3104 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003105 m_errorMonitor->VerifyFound();
3106 m_commandBuffer->EndCommandBuffer();
3107 }
3108
3109 // Create two images, the dest with sampleCount = 4, and attempt to blit
3110 // between them
3111 {
3112 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003113 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003114 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003115 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003116 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003117 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003118 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003119 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003120 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003121 m_errorMonitor->SetDesiredFailureMsg(
3122 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3123 "was created with a sample count of VK_SAMPLE_COUNT_4_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003124 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3125 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003126 m_errorMonitor->VerifyFound();
3127 m_commandBuffer->EndCommandBuffer();
3128 }
3129
3130 VkBufferImageCopy copy_region = {};
3131 copy_region.bufferRowLength = 128;
3132 copy_region.bufferImageHeight = 128;
3133 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3134 copy_region.imageSubresource.layerCount = 1;
3135 copy_region.imageExtent.height = 64;
3136 copy_region.imageExtent.width = 64;
3137 copy_region.imageExtent.depth = 1;
3138
3139 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
3140 // buffer to image
3141 {
3142 vk_testing::Buffer src_buffer;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003143 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
3144 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003145 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003146 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003147 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003148 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003149 m_errorMonitor->SetDesiredFailureMsg(
3150 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3151 "was created with a sample count of VK_SAMPLE_COUNT_8_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003152 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
3153 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003154 m_errorMonitor->VerifyFound();
3155 m_commandBuffer->EndCommandBuffer();
3156 }
3157
3158 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
3159 // image to buffer
3160 {
3161 vk_testing::Buffer dst_buffer;
3162 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
3163 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003164 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003165 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003166 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003167 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003168 m_errorMonitor->SetDesiredFailureMsg(
3169 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3170 "was created with a sample count of VK_SAMPLE_COUNT_2_BIT but must be VK_SAMPLE_COUNT_1_BIT");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003171 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003172 dst_buffer.handle(), 1, &copy_region);
3173 m_errorMonitor->VerifyFound();
3174 m_commandBuffer->EndCommandBuffer();
3175 }
3176}
3177
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003178TEST_F(VkLayerTest, BlitImageFormats) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003179 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003180
3181 VkImageObj src_image(m_device);
3182 src_image.init(64, 64, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
3183 VkImageObj dst_image(m_device);
3184 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
3185 VkImageObj dst_image2(m_device);
Mike Stroyan131f3e72016-10-18 11:10:23 -06003186 dst_image2.init(64, 64, VK_FORMAT_R8G8B8A8_SINT, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003187
3188 VkImageBlit blitRegion = {};
3189 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3190 blitRegion.srcSubresource.baseArrayLayer = 0;
3191 blitRegion.srcSubresource.layerCount = 1;
3192 blitRegion.srcSubresource.mipLevel = 0;
3193 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3194 blitRegion.dstSubresource.baseArrayLayer = 0;
3195 blitRegion.dstSubresource.layerCount = 1;
3196 blitRegion.dstSubresource.mipLevel = 0;
3197
Dave Houlton34df4cb2016-12-01 16:43:06 -07003198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
3199
3200 // TODO: there are 9 permutations of signed, unsigned, & other for source and dest
3201 // this test is only checking 2 of them at the moment
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003202
3203 // Unsigned int vs not an int
Tony Barbour552f6c02016-12-21 14:34:07 -07003204 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003205 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image.image(), dst_image.layout(), 1,
3206 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003207
3208 m_errorMonitor->VerifyFound();
3209
Dave Houlton34df4cb2016-12-01 16:43:06 -07003210 // Test should generate 2 VU failures
3211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02190);
3212 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003213
3214 // Unsigned int vs signed int
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003215 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image2.image(), dst_image2.layout(), 1,
3216 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003217
Dave Houlton34df4cb2016-12-01 16:43:06 -07003218 // TODO: Note that this only verifies that at least one of the VU enums was found
3219 // Also, if any were not seen, they'll remain in the target list (Soln TBD, JIRA task: VL-72)
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003220 m_errorMonitor->VerifyFound();
3221
Tony Barbour552f6c02016-12-21 14:34:07 -07003222 m_commandBuffer->EndCommandBuffer();
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003223}
3224
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003225TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
3226 VkResult err;
3227 bool pass;
3228
3229 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003230 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003231
3232 // If w/d/h granularity is 1, test is not meaningful
3233 // TODO: When virtual device limits are available, create a set of limits for this test that
3234 // will always have a granularity of > 1 for w, h, and d
3235 auto index = m_device->graphics_queue_node_index_;
3236 auto queue_family_properties = m_device->phy().queue_properties();
3237
3238 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
3239 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
3240 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
3241 return;
3242 }
3243
3244 // Create two images of different types and try to copy between them
3245 VkImage srcImage;
3246 VkImage dstImage;
3247 VkDeviceMemory srcMem;
3248 VkDeviceMemory destMem;
3249 VkMemoryRequirements memReqs;
3250
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003251 VkImageCreateInfo image_create_info = {};
3252 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3253 image_create_info.pNext = NULL;
3254 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3255 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3256 image_create_info.extent.width = 32;
3257 image_create_info.extent.height = 32;
3258 image_create_info.extent.depth = 1;
3259 image_create_info.mipLevels = 1;
3260 image_create_info.arrayLayers = 4;
3261 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3262 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3263 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3264 image_create_info.flags = 0;
3265
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003266 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003267 ASSERT_VK_SUCCESS(err);
3268
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003269 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003270 ASSERT_VK_SUCCESS(err);
3271
3272 // Allocate memory
3273 VkMemoryAllocateInfo memAlloc = {};
3274 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3275 memAlloc.pNext = NULL;
3276 memAlloc.allocationSize = 0;
3277 memAlloc.memoryTypeIndex = 0;
3278
3279 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
3280 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003281 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003282 ASSERT_TRUE(pass);
3283 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
3284 ASSERT_VK_SUCCESS(err);
3285
3286 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
3287 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003288 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003289 ASSERT_VK_SUCCESS(err);
3290 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
3291 ASSERT_VK_SUCCESS(err);
3292
3293 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
3294 ASSERT_VK_SUCCESS(err);
3295 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
3296 ASSERT_VK_SUCCESS(err);
3297
Tony Barbour552f6c02016-12-21 14:34:07 -07003298 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003299 VkImageCopy copyRegion;
3300 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3301 copyRegion.srcSubresource.mipLevel = 0;
3302 copyRegion.srcSubresource.baseArrayLayer = 0;
3303 copyRegion.srcSubresource.layerCount = 1;
3304 copyRegion.srcOffset.x = 0;
3305 copyRegion.srcOffset.y = 0;
3306 copyRegion.srcOffset.z = 0;
3307 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3308 copyRegion.dstSubresource.mipLevel = 0;
3309 copyRegion.dstSubresource.baseArrayLayer = 0;
3310 copyRegion.dstSubresource.layerCount = 1;
3311 copyRegion.dstOffset.x = 0;
3312 copyRegion.dstOffset.y = 0;
3313 copyRegion.dstOffset.z = 0;
3314 copyRegion.extent.width = 1;
3315 copyRegion.extent.height = 1;
3316 copyRegion.extent.depth = 1;
3317
3318 // Introduce failure by setting srcOffset to a bad granularity value
3319 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003320 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3321 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003322 m_errorMonitor->VerifyFound();
3323
3324 // Introduce failure by setting extent to a bad granularity value
3325 copyRegion.srcOffset.y = 0;
3326 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003327 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3328 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003329 m_errorMonitor->VerifyFound();
3330
3331 // Now do some buffer/image copies
3332 vk_testing::Buffer buffer;
3333 VkMemoryPropertyFlags reqs = 0;
3334 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3335 VkBufferImageCopy region = {};
3336 region.bufferOffset = 0;
3337 region.bufferRowLength = 3;
3338 region.bufferImageHeight = 128;
3339 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3340 region.imageSubresource.layerCount = 1;
3341 region.imageExtent.height = 16;
3342 region.imageExtent.width = 16;
3343 region.imageExtent.depth = 1;
3344 region.imageOffset.x = 0;
3345 region.imageOffset.y = 0;
3346 region.imageOffset.z = 0;
3347
3348 // Introduce failure by setting bufferRowLength to a bad granularity value
3349 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003350 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3351 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3352 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003353 m_errorMonitor->VerifyFound();
3354 region.bufferRowLength = 128;
3355
3356 // Introduce failure by setting bufferOffset to a bad granularity value
3357 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003358 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3359 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3360 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003361 m_errorMonitor->VerifyFound();
3362 region.bufferOffset = 0;
3363
3364 // Introduce failure by setting bufferImageHeight to a bad granularity value
3365 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3367 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3368 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003369 m_errorMonitor->VerifyFound();
3370 region.bufferImageHeight = 128;
3371
3372 // Introduce failure by setting imageExtent to a bad granularity value
3373 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003374 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3375 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3376 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003377 m_errorMonitor->VerifyFound();
3378 region.imageExtent.width = 16;
3379
3380 // Introduce failure by setting imageOffset to a bad granularity value
3381 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003382 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3383 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3384 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003385 m_errorMonitor->VerifyFound();
3386
Tony Barbour552f6c02016-12-21 14:34:07 -07003387 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003388
3389 vkDestroyImage(m_device->device(), srcImage, NULL);
3390 vkDestroyImage(m_device->device(), dstImage, NULL);
3391 vkFreeMemory(m_device->device(), srcMem, NULL);
3392 vkFreeMemory(m_device->device(), destMem, NULL);
3393}
3394
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003395TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003396 TEST_DESCRIPTION(
3397 "Submit command buffer created using one queue family and "
3398 "attempt to submit them on a queue created in a different "
3399 "queue family.");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003400
Tony Barbour1fa09702017-03-16 12:09:08 -06003401 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07003402
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003403 // This test is meaningless unless we have multiple queue families
3404 auto queue_family_properties = m_device->phy().queue_properties();
3405 if (queue_family_properties.size() < 2) {
3406 return;
3407 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003408 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003409 // Get safe index of another queue family
3410 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
Tony Barbour1fa09702017-03-16 12:09:08 -06003411 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003412 // Create a second queue using a different queue family
3413 VkQueue other_queue;
3414 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3415
3416 // Record an empty cmd buffer
3417 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3418 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3419 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3420 vkEndCommandBuffer(m_commandBuffer->handle());
3421
3422 // And submit on the wrong queue
3423 VkSubmitInfo submit_info = {};
3424 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3425 submit_info.commandBufferCount = 1;
3426 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003427 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003428
3429 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003430}
3431
Chris Forbes4c24a922016-11-16 08:59:10 +13003432TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
Tony Barbour1fa09702017-03-16 12:09:08 -06003433 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4c24a922016-11-16 08:59:10 +13003434
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003435 // There are no attachments, but refer to attachment 0.
3436 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13003437 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003438 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13003439 };
3440
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003441 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, subpasses, 0, nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13003442 VkRenderPass rp;
3443
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003444 // "... must be less than the total number of attachments ..."
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003445 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13003446 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3447 m_errorMonitor->VerifyFound();
3448}
3449
Chris Forbesa58c4522016-09-28 15:19:39 +13003450TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
3451 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
Tony Barbour1fa09702017-03-16 12:09:08 -06003452 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa58c4522016-09-28 15:19:39 +13003453
3454 // A renderpass with two subpasses, both writing the same attachment.
3455 VkAttachmentDescription attach[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003456 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3457 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
3458 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesa58c4522016-09-28 15:19:39 +13003459 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003460 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbesa58c4522016-09-28 15:19:39 +13003461 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003462 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
3463 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbesa58c4522016-09-28 15:19:39 +13003464 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003465 VkSubpassDependency dep = {0,
3466 1,
3467 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3468 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3469 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3470 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3471 VK_DEPENDENCY_BY_REGION_BIT};
3472 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 1, &dep};
Chris Forbesa58c4522016-09-28 15:19:39 +13003473 VkRenderPass rp;
3474 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3475 ASSERT_VK_SUCCESS(err);
3476
3477 VkImageObj image(m_device);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003478 image.init_no_layout(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Chris Forbesa58c4522016-09-28 15:19:39 +13003479 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
3480
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003481 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
Chris Forbesa58c4522016-09-28 15:19:39 +13003482 VkFramebuffer fb;
3483 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
3484 ASSERT_VK_SUCCESS(err);
3485
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003486 char const *vsSource =
3487 "#version 450\n"
3488 "void main() { gl_Position = vec4(1); }\n";
3489 char const *fsSource =
3490 "#version 450\n"
3491 "layout(location=0) out vec4 color;\n"
3492 "void main() { color = vec4(1); }\n";
Chris Forbesa58c4522016-09-28 15:19:39 +13003493
3494 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3495 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3496 VkPipelineObj pipe(m_device);
3497 pipe.AddColorAttachment();
3498 pipe.AddShader(&vs);
3499 pipe.AddShader(&fs);
3500 VkViewport view_port = {};
3501 m_viewports.push_back(view_port);
3502 pipe.SetViewport(m_viewports);
3503 VkRect2D rect = {};
3504 m_scissors.push_back(rect);
3505 pipe.SetScissor(m_scissors);
3506
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003507 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 0, nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003508 VkPipelineLayout pl;
3509 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
3510 ASSERT_VK_SUCCESS(err);
3511 pipe.CreateVKPipeline(pl, rp);
3512
Tony Barbour552f6c02016-12-21 14:34:07 -07003513 m_commandBuffer->BeginCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003514
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003515 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
3516 nullptr,
3517 rp,
3518 fb,
3519 {{
3520 0, 0,
3521 },
3522 {32, 32}},
3523 0,
3524 nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003525
3526 // subtest 1: bind in the wrong subpass
3527 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3528 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003529 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003530 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3531 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3532 m_errorMonitor->VerifyFound();
3533
3534 vkCmdEndRenderPass(m_commandBuffer->handle());
3535
3536 // subtest 2: bind in correct subpass, then transition to next subpass
3537 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3538 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3539 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003540 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "built for subpass 0 but used in subpass 1");
Chris Forbesa58c4522016-09-28 15:19:39 +13003541 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3542 m_errorMonitor->VerifyFound();
3543
3544 vkCmdEndRenderPass(m_commandBuffer->handle());
3545
Tony Barbour552f6c02016-12-21 14:34:07 -07003546 m_commandBuffer->EndCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003547
3548 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3549 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3550 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3551}
3552
Tony Barbour4e919972016-08-09 13:27:40 -06003553TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003554 TEST_DESCRIPTION(
3555 "Generate INVALID_RENDER_AREA error by beginning renderpass"
3556 "with extent outside of framebuffer");
Tony Barbour1fa09702017-03-16 12:09:08 -06003557 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003558 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3559
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003560 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3561 "Cannot execute a render pass with renderArea "
3562 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003563
3564 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3565 m_renderPassBeginInfo.renderArea.extent.width = 257;
3566 m_renderPassBeginInfo.renderArea.extent.height = 257;
Tony Barbour552f6c02016-12-21 14:34:07 -07003567 m_commandBuffer->BeginCommandBuffer();
3568 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour4e919972016-08-09 13:27:40 -06003569 m_errorMonitor->VerifyFound();
3570}
3571
3572TEST_F(VkLayerTest, DisabledIndependentBlend) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003573 TEST_DESCRIPTION(
3574 "Generate INDEPENDENT_BLEND by disabling independent "
3575 "blend and then specifying different blend states for two "
3576 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003577 VkPhysicalDeviceFeatures features = {};
3578 features.independentBlend = VK_FALSE;
Tony Barbour1fa09702017-03-16 12:09:08 -06003579 ASSERT_NO_FATAL_FAILURE(Init(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003580
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003581 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3582 "Invalid Pipeline CreateInfo: If independent blend feature not "
3583 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003584
Cody Northropc31a84f2016-08-22 10:41:47 -06003585 VkDescriptorSetObj descriptorSet(m_device);
3586 descriptorSet.AppendDummy();
3587 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003588
Cody Northropc31a84f2016-08-22 10:41:47 -06003589 VkPipelineObj pipeline(m_device);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003590 // Create a renderPass with two color attachments
3591 VkAttachmentReference attachments[2] = {};
3592 attachments[0].layout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003593 attachments[1].attachment = 1;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003594 attachments[1].layout = VK_IMAGE_LAYOUT_GENERAL;
3595
3596 VkSubpassDescription subpass = {};
3597 subpass.pColorAttachments = attachments;
3598 subpass.colorAttachmentCount = 2;
3599
3600 VkRenderPassCreateInfo rpci = {};
3601 rpci.subpassCount = 1;
3602 rpci.pSubpasses = &subpass;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003603 rpci.attachmentCount = 2;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003604
Tony Barbourffd60bd2017-03-09 12:04:55 -07003605 VkAttachmentDescription attach_desc[2] = {};
3606 attach_desc[0].format = VK_FORMAT_B8G8R8A8_UNORM;
3607 attach_desc[0].samples = VK_SAMPLE_COUNT_1_BIT;
3608 attach_desc[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3609 attach_desc[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
3610 attach_desc[1].format = VK_FORMAT_B8G8R8A8_UNORM;
3611 attach_desc[1].samples = VK_SAMPLE_COUNT_1_BIT;
3612 attach_desc[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3613 attach_desc[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003614
Tony Barbourffd60bd2017-03-09 12:04:55 -07003615 rpci.pAttachments = attach_desc;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003616 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3617
3618 VkRenderPass renderpass;
3619 vkCreateRenderPass(m_device->device(), &rpci, NULL, &renderpass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003620 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003621 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003622
Cody Northropc31a84f2016-08-22 10:41:47 -06003623 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3624 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3625 att_state1.blendEnable = VK_TRUE;
3626 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3627 att_state2.blendEnable = VK_FALSE;
3628 pipeline.AddColorAttachment(0, &att_state1);
3629 pipeline.AddColorAttachment(1, &att_state2);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003630 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass);
Cody Northropc31a84f2016-08-22 10:41:47 -06003631 m_errorMonitor->VerifyFound();
Tony Barbour0ace59a2017-02-06 13:38:36 -07003632 vkDestroyRenderPass(m_device->device(), renderpass, NULL);
Tony Barbour4e919972016-08-09 13:27:40 -06003633}
3634
Mike Weiblen40b160e2017-02-06 19:21:52 -07003635// Is the Pipeline compatible with the expectations of the Renderpass/subpasses?
3636TEST_F(VkLayerTest, PipelineRenderpassCompatibility) {
3637 TEST_DESCRIPTION(
3638 "Create a graphics pipeline that is incompatible with the requirements "
3639 "of its contained Renderpass/subpasses.");
Tony Barbour1fa09702017-03-16 12:09:08 -06003640 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen40b160e2017-02-06 19:21:52 -07003641
3642 VkDescriptorSetObj ds_obj(m_device);
3643 ds_obj.AppendDummy();
3644 ds_obj.CreateVKDescriptorSet(m_commandBuffer);
3645
3646 VkShaderObj vs_obj(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
3647
3648 VkPipelineColorBlendAttachmentState att_state1 = {};
3649 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3650 att_state1.blendEnable = VK_TRUE;
3651
3652 VkRenderpassObj rp_obj(m_device);
3653
3654 {
3655 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02116);
3656 VkPipelineObj pipeline(m_device);
3657 pipeline.AddShader(&vs_obj);
3658 pipeline.AddColorAttachment(0, &att_state1);
3659
3660 VkGraphicsPipelineCreateInfo info = {};
3661 pipeline.InitGraphicsPipelineCreateInfo(&info);
3662 info.pColorBlendState = nullptr;
3663
3664 pipeline.CreateVKPipeline(ds_obj.GetPipelineLayout(), rp_obj.handle(), &info);
3665 m_errorMonitor->VerifyFound();
3666 }
3667}
3668
Chris Forbes26ec2122016-11-29 08:58:33 +13003669#if 0
Tony Barbour4e919972016-08-09 13:27:40 -06003670TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
3671 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
3672 "depth attachments in subpass");
Tony Barbour1fa09702017-03-16 12:09:08 -06003673 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour4e919972016-08-09 13:27:40 -06003674
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003675 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3676 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
Tony Barbour4e919972016-08-09 13:27:40 -06003677
3678 // Create a renderPass with a single color attachment
3679 VkAttachmentReference attach = {};
3680 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3681 VkSubpassDescription subpass = {};
3682 VkRenderPassCreateInfo rpci = {};
3683 rpci.subpassCount = 1;
3684 rpci.pSubpasses = &subpass;
3685 rpci.attachmentCount = 1;
3686 VkAttachmentDescription attach_desc = {};
3687 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3688 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3689 rpci.pAttachments = &attach_desc;
3690 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3691 VkRenderPass rp;
3692 subpass.pDepthStencilAttachment = &attach;
3693 subpass.pColorAttachments = NULL;
3694 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3695 m_errorMonitor->VerifyFound();
3696}
Chris Forbes26ec2122016-11-29 08:58:33 +13003697#endif
Tony Barbour4e919972016-08-09 13:27:40 -06003698
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003699TEST_F(VkLayerTest, UnusedPreserveAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003700 TEST_DESCRIPTION(
3701 "Create a framebuffer where a subpass has a preserve "
3702 "attachment reference of VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003703
Tony Barbour1fa09702017-03-16 12:09:08 -06003704 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003705 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3706
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must not be VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003708
3709 VkAttachmentReference color_attach = {};
3710 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3711 color_attach.attachment = 0;
3712 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
3713 VkSubpassDescription subpass = {};
3714 subpass.colorAttachmentCount = 1;
3715 subpass.pColorAttachments = &color_attach;
3716 subpass.preserveAttachmentCount = 1;
3717 subpass.pPreserveAttachments = &preserve_attachment;
3718
3719 VkRenderPassCreateInfo rpci = {};
3720 rpci.subpassCount = 1;
3721 rpci.pSubpasses = &subpass;
3722 rpci.attachmentCount = 1;
3723 VkAttachmentDescription attach_desc = {};
3724 attach_desc.format = VK_FORMAT_UNDEFINED;
3725 rpci.pAttachments = &attach_desc;
3726 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3727 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003728 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003729
3730 m_errorMonitor->VerifyFound();
3731
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003732 if (result == VK_SUCCESS) {
3733 vkDestroyRenderPass(m_device->device(), rp, NULL);
3734 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003735}
3736
Chris Forbesc5389742016-06-29 11:49:23 +12003737TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003738 TEST_DESCRIPTION(
3739 "Ensure that CreateRenderPass produces a validation error "
3740 "when the source of a subpass multisample resolve "
3741 "does not have multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003742
Tony Barbour1fa09702017-03-16 12:09:08 -06003743 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003744
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003745 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3746 "Subpass 0 requests multisample resolve from attachment 0 which has "
3747 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003748
3749 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003750 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3751 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3752 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3753 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3754 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3755 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003756 };
3757
3758 VkAttachmentReference color = {
3759 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3760 };
3761
3762 VkAttachmentReference resolve = {
3763 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3764 };
3765
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003766 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003767
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003768 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003769
3770 VkRenderPass rp;
3771 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3772
3773 m_errorMonitor->VerifyFound();
3774
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003775 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003776}
3777
3778TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003779 TEST_DESCRIPTION(
3780 "Ensure CreateRenderPass produces a validation error "
3781 "when a subpass multisample resolve operation is "
3782 "requested, and the destination of that resolve has "
3783 "multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003784
Tony Barbour1fa09702017-03-16 12:09:08 -06003785 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc5389742016-06-29 11:49:23 +12003786
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003787 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3788 "Subpass 0 requests multisample resolve into attachment 1, which "
3789 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003790
3791 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003792 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3793 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3794 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3795 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3796 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3797 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003798 };
3799
3800 VkAttachmentReference color = {
3801 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3802 };
3803
3804 VkAttachmentReference resolve = {
3805 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3806 };
3807
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003808 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003809
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003810 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003811
3812 VkRenderPass rp;
3813 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3814
3815 m_errorMonitor->VerifyFound();
3816
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003817 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003818}
3819
Chris Forbes3f128ef2016-06-29 14:58:53 +12003820TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003821 TEST_DESCRIPTION(
3822 "Ensure CreateRenderPass produces a validation error "
3823 "when the color and depth attachments used by a subpass "
3824 "have inconsistent sample counts");
Chris Forbes6655bb32016-07-01 18:27:30 +12003825
Tony Barbour1fa09702017-03-16 12:09:08 -06003826 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3f128ef2016-06-29 14:58:53 +12003827
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003828 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3829 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
Chris Forbes3f128ef2016-06-29 14:58:53 +12003830
3831 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003832 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3833 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3834 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3835 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3836 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3837 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbes3f128ef2016-06-29 14:58:53 +12003838 };
3839
3840 VkAttachmentReference color[] = {
3841 {
3842 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3843 },
3844 {
3845 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3846 },
3847 };
3848
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003849 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, color, nullptr, nullptr, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003850
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003851 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003852
3853 VkRenderPass rp;
3854 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3855
3856 m_errorMonitor->VerifyFound();
3857
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003858 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbes3f128ef2016-06-29 14:58:53 +12003859}
3860
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003861TEST_F(VkLayerTest, FramebufferCreateErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003862 TEST_DESCRIPTION(
3863 "Hit errors when attempting to create a framebuffer :\n"
3864 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
3865 " 2. Use a color image as depthStencil attachment\n"
3866 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3867 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3868 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3869 " 6. Framebuffer attachment where dimensions don't match\n"
3870 " 7. Framebuffer attachment w/o identity swizzle\n"
3871 " 8. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003872
Tony Barbour1fa09702017-03-16 12:09:08 -06003873 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003874 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3875
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003876 m_errorMonitor->SetDesiredFailureMsg(
3877 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3878 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003879
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003880 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003881 VkAttachmentReference attach = {};
3882 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3883 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003884 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003885 VkRenderPassCreateInfo rpci = {};
3886 rpci.subpassCount = 1;
3887 rpci.pSubpasses = &subpass;
3888 rpci.attachmentCount = 1;
3889 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003890 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003891 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003892 rpci.pAttachments = &attach_desc;
3893 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3894 VkRenderPass rp;
3895 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3896 ASSERT_VK_SUCCESS(err);
3897
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003898 VkImageView ivs[2];
3899 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3900 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003901 VkFramebufferCreateInfo fb_info = {};
3902 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3903 fb_info.pNext = NULL;
3904 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003905 // Set mis-matching attachmentCount
3906 fb_info.attachmentCount = 2;
3907 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003908 fb_info.width = 100;
3909 fb_info.height = 100;
3910 fb_info.layers = 1;
3911
3912 VkFramebuffer fb;
3913 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3914
3915 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003916 if (err == VK_SUCCESS) {
3917 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3918 }
3919 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003920
3921 // Create a renderPass with a depth-stencil attachment created with
3922 // IMAGE_USAGE_COLOR_ATTACHMENT
3923 // Add our color attachment to pDepthStencilAttachment
3924 subpass.pDepthStencilAttachment = &attach;
3925 subpass.pColorAttachments = NULL;
3926 VkRenderPass rp_ds;
3927 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3928 ASSERT_VK_SUCCESS(err);
3929 // Set correct attachment count, but attachment has COLOR usage bit set
3930 fb_info.attachmentCount = 1;
3931 fb_info.renderPass = rp_ds;
3932
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003933 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " conflicts with the image's IMAGE_USAGE flags ");
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003934 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3935
3936 m_errorMonitor->VerifyFound();
3937 if (err == VK_SUCCESS) {
3938 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3939 }
3940 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003941
3942 // Create new renderpass with alternate attachment format from fb
3943 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3944 subpass.pDepthStencilAttachment = NULL;
3945 subpass.pColorAttachments = &attach;
3946 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3947 ASSERT_VK_SUCCESS(err);
3948
3949 // Cause error due to mis-matched formats between rp & fb
3950 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3951 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3953 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003954 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3955
3956 m_errorMonitor->VerifyFound();
3957 if (err == VK_SUCCESS) {
3958 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3959 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003960 vkDestroyRenderPass(m_device->device(), rp, NULL);
3961
3962 // Create new renderpass with alternate sample count from fb
3963 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3964 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3965 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3966 ASSERT_VK_SUCCESS(err);
3967
3968 // Cause error due to mis-matched sample count between rp & fb
3969 fb_info.renderPass = rp;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003970 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003971 " has VK_SAMPLE_COUNT_1_BIT samples that do not match the VK_SAMPLE_COUNT_4_BIT ");
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003972 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3973
3974 m_errorMonitor->VerifyFound();
3975 if (err == VK_SUCCESS) {
3976 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3977 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003978
3979 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003980
3981 // Create a custom imageView with non-1 mip levels
3982 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003983 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003984 ASSERT_TRUE(image.initialized());
3985
3986 VkImageView view;
3987 VkImageViewCreateInfo ivci = {};
3988 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3989 ivci.image = image.handle();
3990 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3991 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3992 ivci.subresourceRange.layerCount = 1;
3993 ivci.subresourceRange.baseMipLevel = 0;
3994 // Set level count 2 (only 1 is allowed for FB attachment)
3995 ivci.subresourceRange.levelCount = 2;
3996 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3997 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3998 ASSERT_VK_SUCCESS(err);
3999 // Re-create renderpass to have matching sample count
4000 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
4001 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
4002 ASSERT_VK_SUCCESS(err);
4003
4004 fb_info.renderPass = rp;
4005 fb_info.pAttachments = &view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004006 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has mip levelCount of 2 but only ");
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004007 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4008
4009 m_errorMonitor->VerifyFound();
4010 if (err == VK_SUCCESS) {
4011 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4012 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004013 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004014 // Update view to original color buffer and grow FB dimensions too big
4015 fb_info.pAttachments = ivs;
4016 fb_info.height = 1024;
4017 fb_info.width = 1024;
4018 fb_info.layers = 2;
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004019 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " Attachment dimensions must be at least as large. ");
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004020 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4021
4022 m_errorMonitor->VerifyFound();
4023 if (err == VK_SUCCESS) {
4024 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4025 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004026 // Create view attachment with non-identity swizzle
4027 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4028 ivci.image = image.handle();
4029 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4030 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4031 ivci.subresourceRange.layerCount = 1;
4032 ivci.subresourceRange.baseMipLevel = 0;
4033 ivci.subresourceRange.levelCount = 1;
4034 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4035 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4036 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4037 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4038 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4039 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4040 ASSERT_VK_SUCCESS(err);
4041
4042 fb_info.pAttachments = &view;
4043 fb_info.height = 100;
4044 fb_info.width = 100;
4045 fb_info.layers = 1;
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004046 m_errorMonitor->SetDesiredFailureMsg(
4047 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4048 " has non-identy swizzle. All framebuffer attachments must have been created with the identity swizzle. ");
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004049 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4050
4051 m_errorMonitor->VerifyFound();
4052 if (err == VK_SUCCESS) {
4053 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4054 }
4055 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004056 // reset attachment to color attachment
4057 fb_info.pAttachments = ivs;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004058
4059 // Request fb that exceeds max width
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004060 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004061 fb_info.height = 100;
4062 fb_info.layers = 1;
4063 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00413);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004064 m_errorMonitor->SetDesiredFailureMsg(
4065 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004066 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4067 "Here are the respective dimensions for attachment");
4068
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004069 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4070
4071 m_errorMonitor->VerifyFound();
4072 if (err == VK_SUCCESS) {
4073 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4074 }
4075
4076 // Request fb that exceeds max height
4077 fb_info.width = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004078 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004079 fb_info.layers = 1;
4080 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00414);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004081 m_errorMonitor->SetDesiredFailureMsg(
4082 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004083 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4084 "Here are the respective dimensions for attachment");
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004085 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4086
4087 m_errorMonitor->VerifyFound();
4088 if (err == VK_SUCCESS) {
4089 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4090 }
4091
4092 // Request fb that exceeds max layers
4093 fb_info.width = 100;
4094 fb_info.height = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004095 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004096 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00415);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004097 m_errorMonitor->SetDesiredFailureMsg(
4098 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004099 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4100 "Here are the respective dimensions for attachment");
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004101 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4102
4103 m_errorMonitor->VerifyFound();
4104 if (err == VK_SUCCESS) {
4105 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4106 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004107
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004108 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004109}
4110
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004111TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004112 TEST_DESCRIPTION(
4113 "Run a simple draw calls to validate failure when Depth Bias dynamic "
4114 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004115
Tony Barbour1fa09702017-03-16 12:09:08 -06004116 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004117 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004118 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
4119 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004120 m_errorMonitor->VerifyFound();
4121}
4122
4123TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004124 TEST_DESCRIPTION(
4125 "Run a simple draw calls to validate failure when Line Width dynamic "
4126 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004127
Tony Barbour1fa09702017-03-16 12:09:08 -06004128 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004129 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
4131 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004132 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004133}
4134
4135TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004136 TEST_DESCRIPTION(
4137 "Run a simple draw calls to validate failure when Viewport dynamic "
4138 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004139
Tony Barbour1fa09702017-03-16 12:09:08 -06004140 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004141 // Dynamic viewport state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004142 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4143 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004144 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004145 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004146}
4147
4148TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004149 TEST_DESCRIPTION(
4150 "Run a simple draw calls to validate failure when Scissor dynamic "
4151 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004152
Tony Barbour1fa09702017-03-16 12:09:08 -06004153 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004154 // Dynamic scissor state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004155 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4156 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004157 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004158 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004159}
4160
Cortd713fe82016-07-27 09:51:27 -07004161TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004162 TEST_DESCRIPTION(
4163 "Run a simple draw calls to validate failure when Blend Constants "
4164 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004165
Tony Barbour1fa09702017-03-16 12:09:08 -06004166 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004167 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004168 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4169 "Dynamic blend constants state not set for this command buffer");
4170 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06004171 m_errorMonitor->VerifyFound();
4172}
4173
4174TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004175 TEST_DESCRIPTION(
4176 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
4177 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004178
Tony Barbour1fa09702017-03-16 12:09:08 -06004179 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004180 if (!m_device->phy().features().depthBounds) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07004181 printf(" Device does not support depthBounds test; skipped.\n");
Tobin Ehlis21c88352016-05-26 06:15:45 -06004182 return;
4183 }
4184 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4186 "Dynamic depth bounds state not set for this command buffer");
4187 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004188 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004189}
4190
4191TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004192 TEST_DESCRIPTION(
4193 "Run a simple draw calls to validate failure when Stencil Read dynamic "
4194 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004195
Tony Barbour1fa09702017-03-16 12:09:08 -06004196 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004197 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4199 "Dynamic stencil read mask state not set for this command buffer");
4200 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004201 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004202}
4203
4204TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004205 TEST_DESCRIPTION(
4206 "Run a simple draw calls to validate failure when Stencil Write dynamic"
4207 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004208
Tony Barbour1fa09702017-03-16 12:09:08 -06004209 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004210 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4212 "Dynamic stencil write mask state not set for this command buffer");
4213 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004214 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004215}
4216
4217TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004218 TEST_DESCRIPTION(
4219 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
4220 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004221
Tony Barbour1fa09702017-03-16 12:09:08 -06004222 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004223 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4225 "Dynamic stencil reference state not set for this command buffer");
4226 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004227 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06004228}
4229
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004230TEST_F(VkLayerTest, IndexBufferNotBound) {
4231 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004232
Tony Barbour1fa09702017-03-16 12:09:08 -06004233 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004234 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4235 "Index buffer object not bound to this command buffer when Indexed ");
4236 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004237 m_errorMonitor->VerifyFound();
4238}
4239
Karl Schultz6addd812016-02-02 17:17:23 -07004240TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004241 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4242 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
4243 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004244
Tony Barbour1fa09702017-03-16 12:09:08 -06004245 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004246 ASSERT_NO_FATAL_FAILURE(InitViewport());
4247 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4248
Karl Schultz6addd812016-02-02 17:17:23 -07004249 // We luck out b/c by default the framework creates CB w/ the
4250 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tony Barbour552f6c02016-12-21 14:34:07 -07004251 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004252 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07004253 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004254
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004255 // Bypass framework since it does the waits automatically
4256 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004257 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08004258 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4259 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004260 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004261 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07004262 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004263 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004264 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08004265 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004266 submit_info.pSignalSemaphores = NULL;
4267
Chris Forbes40028e22016-06-13 09:59:34 +12004268 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07004269 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004270 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004271
Karl Schultz6addd812016-02-02 17:17:23 -07004272 // Cause validation error by re-submitting cmd buffer that should only be
4273 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12004274 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004275 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004276
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004277 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004278}
4279
Karl Schultz6addd812016-02-02 17:17:23 -07004280TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004281 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07004282 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004283
Tony Barbour1fa09702017-03-16 12:09:08 -06004284 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004285 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004286
Karl Schultz6addd812016-02-02 17:17:23 -07004287 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
4288 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004289 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004290 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004291 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004292
4293 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004294 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4295 ds_pool_ci.pNext = NULL;
4296 ds_pool_ci.flags = 0;
4297 ds_pool_ci.maxSets = 1;
4298 ds_pool_ci.poolSizeCount = 1;
4299 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004300
4301 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004302 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004303 ASSERT_VK_SUCCESS(err);
4304
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004305 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
4306 dsl_binding_samp.binding = 0;
4307 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4308 dsl_binding_samp.descriptorCount = 1;
4309 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
4310 dsl_binding_samp.pImmutableSamplers = NULL;
4311
4312 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4313 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4314 ds_layout_ci.pNext = NULL;
4315 ds_layout_ci.bindingCount = 1;
4316 ds_layout_ci.pBindings = &dsl_binding_samp;
4317
4318 VkDescriptorSetLayout ds_layout_samp;
4319 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
4320 ASSERT_VK_SUCCESS(err);
4321
4322 // Try to allocate 2 sets when pool only has 1 set
4323 VkDescriptorSet descriptor_sets[2];
4324 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
4325 VkDescriptorSetAllocateInfo alloc_info = {};
4326 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4327 alloc_info.descriptorSetCount = 2;
4328 alloc_info.descriptorPool = ds_pool;
4329 alloc_info.pSetLayouts = set_layouts;
4330 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
4331 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
4332 m_errorMonitor->VerifyFound();
4333
4334 alloc_info.descriptorSetCount = 1;
4335 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004336 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004337 dsl_binding.binding = 0;
4338 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4339 dsl_binding.descriptorCount = 1;
4340 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4341 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004342
Karl Schultz6addd812016-02-02 17:17:23 -07004343 ds_layout_ci.bindingCount = 1;
4344 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004345
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004346 VkDescriptorSetLayout ds_layout_ub;
4347 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004348 ASSERT_VK_SUCCESS(err);
4349
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004350 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004351 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004352 alloc_info.pSetLayouts = &ds_layout_ub;
4353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
4354 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004355
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004356 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004357
Karl Schultz2825ab92016-12-02 08:23:14 -07004358 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004359 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08004360 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004361}
4362
Karl Schultz6addd812016-02-02 17:17:23 -07004363TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
4364 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06004365
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004366 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00922);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004367
Tony Barbour1fa09702017-03-16 12:09:08 -06004368 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise735c692015-10-08 13:13:50 -06004369 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06004370
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004371 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004372 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4373 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06004374
4375 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004376 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4377 ds_pool_ci.pNext = NULL;
4378 ds_pool_ci.maxSets = 1;
4379 ds_pool_ci.poolSizeCount = 1;
4380 ds_pool_ci.flags = 0;
4381 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
4382 // app can only call vkResetDescriptorPool on this pool.;
4383 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06004384
4385 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004386 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06004387 ASSERT_VK_SUCCESS(err);
4388
4389 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004390 dsl_binding.binding = 0;
4391 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4392 dsl_binding.descriptorCount = 1;
4393 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4394 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06004395
4396 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004397 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4398 ds_layout_ci.pNext = NULL;
4399 ds_layout_ci.bindingCount = 1;
4400 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06004401
4402 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004403 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06004404 ASSERT_VK_SUCCESS(err);
4405
4406 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004407 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004408 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004409 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004410 alloc_info.descriptorPool = ds_pool;
4411 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004412 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06004413 ASSERT_VK_SUCCESS(err);
4414
4415 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004416 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06004417
Chia-I Wuf7458c52015-10-26 21:10:41 +08004418 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4419 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06004420}
4421
Karl Schultz6addd812016-02-02 17:17:23 -07004422TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004423 // Attempt to clear Descriptor Pool with bad object.
4424 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06004425
Tony Barbour1fa09702017-03-16 12:09:08 -06004426 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004427 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004428 uint64_t fake_pool_handle = 0xbaad6001;
4429 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
4430 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06004431 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004432}
4433
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004434TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004435 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
4436 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004437 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06004438 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004439
4440 uint64_t fake_set_handle = 0xbaad6001;
4441 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06004442 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004443 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06004444
Tony Barbour1fa09702017-03-16 12:09:08 -06004445 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004446
4447 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
4448 layout_bindings[0].binding = 0;
4449 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4450 layout_bindings[0].descriptorCount = 1;
4451 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
4452 layout_bindings[0].pImmutableSamplers = NULL;
4453
4454 VkDescriptorSetLayout descriptor_set_layout;
4455 VkDescriptorSetLayoutCreateInfo dslci = {};
4456 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4457 dslci.pNext = NULL;
4458 dslci.bindingCount = 1;
4459 dslci.pBindings = layout_bindings;
4460 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004461 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004462
4463 VkPipelineLayout pipeline_layout;
4464 VkPipelineLayoutCreateInfo plci = {};
4465 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4466 plci.pNext = NULL;
4467 plci.setLayoutCount = 1;
4468 plci.pSetLayouts = &descriptor_set_layout;
4469 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004470 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004471
Tony Barbour552f6c02016-12-21 14:34:07 -07004472 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004473 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
4474 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06004475 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07004476 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -06004477 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
4478 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004479}
4480
Karl Schultz6addd812016-02-02 17:17:23 -07004481TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004482 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
4483 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004484 uint64_t fake_layout_handle = 0xbaad6001;
4485 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004486 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Tony Barbour1fa09702017-03-16 12:09:08 -06004487 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -06004488 VkPipelineLayout pipeline_layout;
4489 VkPipelineLayoutCreateInfo plci = {};
4490 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4491 plci.pNext = NULL;
4492 plci.setLayoutCount = 1;
4493 plci.pSetLayouts = &bad_layout;
4494 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
4495
4496 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004497}
4498
Mark Muellerd4914412016-06-13 17:52:06 -06004499TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004500 TEST_DESCRIPTION(
4501 "This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
4502 "1) A uniform buffer update must have a valid buffer index."
4503 "2) When using an array of descriptors in a single WriteDescriptor,"
4504 " the descriptor types and stageflags must all be the same."
4505 "3) Immutable Sampler state must match across descriptors");
Mark Muellerd4914412016-06-13 17:52:06 -06004506
Mike Weiblena6666382017-01-05 15:16:11 -07004507 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00941);
Mark Muellerd4914412016-06-13 17:52:06 -06004508
Tony Barbour1fa09702017-03-16 12:09:08 -06004509 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerd4914412016-06-13 17:52:06 -06004510 VkDescriptorPoolSize ds_type_count[4] = {};
4511 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4512 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004513 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004514 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004515 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004516 ds_type_count[2].descriptorCount = 1;
4517 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4518 ds_type_count[3].descriptorCount = 1;
4519
4520 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4521 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4522 ds_pool_ci.maxSets = 1;
4523 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
4524 ds_pool_ci.pPoolSizes = ds_type_count;
4525
4526 VkDescriptorPool ds_pool;
4527 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4528 ASSERT_VK_SUCCESS(err);
4529
Mark Muellerb9896722016-06-16 09:54:29 -06004530 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004531 layout_binding[0].binding = 0;
4532 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4533 layout_binding[0].descriptorCount = 1;
4534 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4535 layout_binding[0].pImmutableSamplers = NULL;
4536
4537 layout_binding[1].binding = 1;
4538 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4539 layout_binding[1].descriptorCount = 1;
4540 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4541 layout_binding[1].pImmutableSamplers = NULL;
4542
4543 VkSamplerCreateInfo sampler_ci = {};
4544 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4545 sampler_ci.pNext = NULL;
4546 sampler_ci.magFilter = VK_FILTER_NEAREST;
4547 sampler_ci.minFilter = VK_FILTER_NEAREST;
4548 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4549 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4550 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4551 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4552 sampler_ci.mipLodBias = 1.0;
4553 sampler_ci.anisotropyEnable = VK_FALSE;
4554 sampler_ci.maxAnisotropy = 1;
4555 sampler_ci.compareEnable = VK_FALSE;
4556 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4557 sampler_ci.minLod = 1.0;
4558 sampler_ci.maxLod = 1.0;
4559 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4560 sampler_ci.unnormalizedCoordinates = VK_FALSE;
4561 VkSampler sampler;
4562
4563 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
4564 ASSERT_VK_SUCCESS(err);
4565
4566 layout_binding[2].binding = 2;
4567 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4568 layout_binding[2].descriptorCount = 1;
4569 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4570 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
4571
Mark Muellerd4914412016-06-13 17:52:06 -06004572 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4573 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4574 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
4575 ds_layout_ci.pBindings = layout_binding;
4576 VkDescriptorSetLayout ds_layout;
4577 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4578 ASSERT_VK_SUCCESS(err);
4579
4580 VkDescriptorSetAllocateInfo alloc_info = {};
4581 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4582 alloc_info.descriptorSetCount = 1;
4583 alloc_info.descriptorPool = ds_pool;
4584 alloc_info.pSetLayouts = &ds_layout;
4585 VkDescriptorSet descriptorSet;
4586 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4587 ASSERT_VK_SUCCESS(err);
4588
4589 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4590 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4591 pipeline_layout_ci.pNext = NULL;
4592 pipeline_layout_ci.setLayoutCount = 1;
4593 pipeline_layout_ci.pSetLayouts = &ds_layout;
4594
4595 VkPipelineLayout pipeline_layout;
4596 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4597 ASSERT_VK_SUCCESS(err);
4598
Mark Mueller5c838ce2016-06-16 09:54:29 -06004599 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004600 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4601 descriptor_write.dstSet = descriptorSet;
4602 descriptor_write.dstBinding = 0;
4603 descriptor_write.descriptorCount = 1;
4604 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4605
Mark Mueller5c838ce2016-06-16 09:54:29 -06004606 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004607 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4608 m_errorMonitor->VerifyFound();
4609
4610 // Create a buffer to update the descriptor with
4611 uint32_t qfi = 0;
4612 VkBufferCreateInfo buffCI = {};
4613 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4614 buffCI.size = 1024;
4615 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4616 buffCI.queueFamilyIndexCount = 1;
4617 buffCI.pQueueFamilyIndices = &qfi;
4618
4619 VkBuffer dyub;
4620 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4621 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004622
Tony Barboure132c5f2016-12-12 11:50:20 -07004623 VkDeviceMemory mem;
4624 VkMemoryRequirements mem_reqs;
4625 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4626
4627 VkMemoryAllocateInfo mem_alloc_info = {};
4628 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4629 mem_alloc_info.allocationSize = mem_reqs.size;
4630 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4631 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4632 ASSERT_VK_SUCCESS(err);
4633
4634 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4635 ASSERT_VK_SUCCESS(err);
4636
4637 VkDescriptorBufferInfo buffInfo[2] = {};
4638 buffInfo[0].buffer = dyub;
4639 buffInfo[0].offset = 0;
4640 buffInfo[0].range = 1024;
4641 buffInfo[1].buffer = dyub;
4642 buffInfo[1].offset = 0;
4643 buffInfo[1].range = 1024;
4644 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004645 descriptor_write.descriptorCount = 2;
4646
Mark Mueller5c838ce2016-06-16 09:54:29 -06004647 // 2) The stateFlags don't match between the first and second descriptor
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004649 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4650 m_errorMonitor->VerifyFound();
4651
Mark Mueller5c838ce2016-06-16 09:54:29 -06004652 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4653 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004654 descriptor_write.dstBinding = 1;
4655 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004656
Mark Mueller5c838ce2016-06-16 09:54:29 -06004657 // Make pImageInfo index non-null to avoid complaints of it missing
4658 VkDescriptorImageInfo imageInfo = {};
4659 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4660 descriptor_write.pImageInfo = &imageInfo;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004662 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4663 m_errorMonitor->VerifyFound();
4664
Mark Muellerd4914412016-06-13 17:52:06 -06004665 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004666 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004667 vkDestroySampler(m_device->device(), sampler, NULL);
4668 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4669 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4670 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4671}
4672
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004673TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004674 TEST_DESCRIPTION(
4675 "Attempt to draw with a command buffer that is invalid "
4676 "due to a buffer dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004677 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004678
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004679 VkBuffer buffer;
4680 VkDeviceMemory mem;
4681 VkMemoryRequirements mem_reqs;
4682
4683 VkBufferCreateInfo buf_info = {};
4684 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004685 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004686 buf_info.size = 256;
4687 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4688 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4689 ASSERT_VK_SUCCESS(err);
4690
4691 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4692
4693 VkMemoryAllocateInfo alloc_info = {};
4694 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4695 alloc_info.allocationSize = 256;
4696 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004697 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004698 if (!pass) {
4699 vkDestroyBuffer(m_device->device(), buffer, NULL);
4700 return;
4701 }
4702 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4703 ASSERT_VK_SUCCESS(err);
4704
4705 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4706 ASSERT_VK_SUCCESS(err);
4707
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004708 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004709 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004710 m_commandBuffer->EndCommandBuffer();
4711
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004712 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004713 // Destroy buffer dependency prior to submit to cause ERROR
4714 vkDestroyBuffer(m_device->device(), buffer, NULL);
4715
4716 VkSubmitInfo submit_info = {};
4717 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4718 submit_info.commandBufferCount = 1;
4719 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4720 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4721
4722 m_errorMonitor->VerifyFound();
Rene Lindsayab6c5cd2016-12-20 14:05:37 -07004723 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004724 vkFreeMemory(m_device->handle(), mem, NULL);
4725}
4726
Tobin Ehlisea413442016-09-28 10:23:59 -06004727TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4728 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4729
Tony Barbour1fa09702017-03-16 12:09:08 -06004730 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisea413442016-09-28 10:23:59 -06004731 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4732
4733 VkDescriptorPoolSize ds_type_count;
4734 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4735 ds_type_count.descriptorCount = 1;
4736
4737 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4738 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4739 ds_pool_ci.maxSets = 1;
4740 ds_pool_ci.poolSizeCount = 1;
4741 ds_pool_ci.pPoolSizes = &ds_type_count;
4742
4743 VkDescriptorPool ds_pool;
4744 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4745 ASSERT_VK_SUCCESS(err);
4746
4747 VkDescriptorSetLayoutBinding layout_binding;
4748 layout_binding.binding = 0;
4749 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4750 layout_binding.descriptorCount = 1;
4751 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4752 layout_binding.pImmutableSamplers = NULL;
4753
4754 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4755 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4756 ds_layout_ci.bindingCount = 1;
4757 ds_layout_ci.pBindings = &layout_binding;
4758 VkDescriptorSetLayout ds_layout;
4759 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4760 ASSERT_VK_SUCCESS(err);
4761
4762 VkDescriptorSetAllocateInfo alloc_info = {};
4763 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4764 alloc_info.descriptorSetCount = 1;
4765 alloc_info.descriptorPool = ds_pool;
4766 alloc_info.pSetLayouts = &ds_layout;
4767 VkDescriptorSet descriptor_set;
4768 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4769 ASSERT_VK_SUCCESS(err);
4770
4771 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4772 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4773 pipeline_layout_ci.pNext = NULL;
4774 pipeline_layout_ci.setLayoutCount = 1;
4775 pipeline_layout_ci.pSetLayouts = &ds_layout;
4776
4777 VkPipelineLayout pipeline_layout;
4778 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4779 ASSERT_VK_SUCCESS(err);
4780
4781 VkBuffer buffer;
4782 uint32_t queue_family_index = 0;
4783 VkBufferCreateInfo buffer_create_info = {};
4784 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4785 buffer_create_info.size = 1024;
4786 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4787 buffer_create_info.queueFamilyIndexCount = 1;
4788 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4789
4790 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4791 ASSERT_VK_SUCCESS(err);
4792
4793 VkMemoryRequirements memory_reqs;
4794 VkDeviceMemory buffer_memory;
4795
4796 VkMemoryAllocateInfo memory_info = {};
4797 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4798 memory_info.allocationSize = 0;
4799 memory_info.memoryTypeIndex = 0;
4800
4801 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4802 memory_info.allocationSize = memory_reqs.size;
4803 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4804 ASSERT_TRUE(pass);
4805
4806 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4807 ASSERT_VK_SUCCESS(err);
4808 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4809 ASSERT_VK_SUCCESS(err);
4810
4811 VkBufferView view;
4812 VkBufferViewCreateInfo bvci = {};
4813 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4814 bvci.buffer = buffer;
4815 bvci.format = VK_FORMAT_R8_UNORM;
4816 bvci.range = VK_WHOLE_SIZE;
4817
4818 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4819 ASSERT_VK_SUCCESS(err);
4820
4821 VkWriteDescriptorSet descriptor_write = {};
4822 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4823 descriptor_write.dstSet = descriptor_set;
4824 descriptor_write.dstBinding = 0;
4825 descriptor_write.descriptorCount = 1;
4826 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4827 descriptor_write.pTexelBufferView = &view;
4828
4829 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4830
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004831 char const *vsSource =
4832 "#version 450\n"
4833 "\n"
4834 "out gl_PerVertex { \n"
4835 " vec4 gl_Position;\n"
4836 "};\n"
4837 "void main(){\n"
4838 " gl_Position = vec4(1);\n"
4839 "}\n";
4840 char const *fsSource =
4841 "#version 450\n"
4842 "\n"
4843 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4844 "layout(location=0) out vec4 x;\n"
4845 "void main(){\n"
4846 " x = imageLoad(s, 0);\n"
4847 "}\n";
Tobin Ehlisea413442016-09-28 10:23:59 -06004848 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4849 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4850 VkPipelineObj pipe(m_device);
4851 pipe.AddShader(&vs);
4852 pipe.AddShader(&fs);
4853 pipe.AddColorAttachment();
4854 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4855
Tobin Ehlisea413442016-09-28 10:23:59 -06004856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer view ");
4857
Tony Barbour552f6c02016-12-21 14:34:07 -07004858 m_commandBuffer->BeginCommandBuffer();
4859 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4860
Tobin Ehlisea413442016-09-28 10:23:59 -06004861 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4862 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4863 VkRect2D scissor = {{0, 0}, {16, 16}};
4864 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4865 // Bind pipeline to cmd buffer
4866 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4867 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4868 &descriptor_set, 0, nullptr);
4869 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07004870 m_commandBuffer->EndRenderPass();
4871 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisea413442016-09-28 10:23:59 -06004872
4873 // Delete BufferView in order to invalidate cmd buffer
4874 vkDestroyBufferView(m_device->device(), view, NULL);
4875 // Now attempt submit of cmd buffer
4876 VkSubmitInfo submit_info = {};
4877 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4878 submit_info.commandBufferCount = 1;
4879 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4880 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4881 m_errorMonitor->VerifyFound();
4882
4883 // Clean-up
4884 vkDestroyBuffer(m_device->device(), buffer, NULL);
4885 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4886 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4887 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4888 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4889}
4890
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004891TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004892 TEST_DESCRIPTION(
4893 "Attempt to draw with a command buffer that is invalid "
4894 "due to an image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004895 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004896
4897 VkImage image;
4898 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4899 VkImageCreateInfo image_create_info = {};
4900 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4901 image_create_info.pNext = NULL;
4902 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4903 image_create_info.format = tex_format;
4904 image_create_info.extent.width = 32;
4905 image_create_info.extent.height = 32;
4906 image_create_info.extent.depth = 1;
4907 image_create_info.mipLevels = 1;
4908 image_create_info.arrayLayers = 1;
4909 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4910 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004911 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004912 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004913 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004914 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004915 // Have to bind memory to image before recording cmd in cmd buffer using it
4916 VkMemoryRequirements mem_reqs;
4917 VkDeviceMemory image_mem;
4918 bool pass;
4919 VkMemoryAllocateInfo mem_alloc = {};
4920 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4921 mem_alloc.pNext = NULL;
4922 mem_alloc.memoryTypeIndex = 0;
4923 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4924 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004925 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004926 ASSERT_TRUE(pass);
4927 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4928 ASSERT_VK_SUCCESS(err);
4929 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4930 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004931
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004932 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004933 VkClearColorValue ccv;
4934 ccv.float32[0] = 1.0f;
4935 ccv.float32[1] = 1.0f;
4936 ccv.float32[2] = 1.0f;
4937 ccv.float32[3] = 1.0f;
4938 VkImageSubresourceRange isr = {};
4939 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004940 isr.baseArrayLayer = 0;
4941 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004942 isr.layerCount = 1;
4943 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004944 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004945 m_commandBuffer->EndCommandBuffer();
4946
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004948 // Destroy image dependency prior to submit to cause ERROR
4949 vkDestroyImage(m_device->device(), image, NULL);
4950
4951 VkSubmitInfo submit_info = {};
4952 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4953 submit_info.commandBufferCount = 1;
4954 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4955 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4956
4957 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004958 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004959}
4960
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004961TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004962 TEST_DESCRIPTION(
4963 "Attempt to draw with a command buffer that is invalid "
4964 "due to a framebuffer image dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06004965 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004966 VkFormatProperties format_properties;
4967 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004968 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4969 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004970 return;
4971 }
4972
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004973 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4974
4975 VkImageCreateInfo image_ci = {};
4976 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4977 image_ci.pNext = NULL;
4978 image_ci.imageType = VK_IMAGE_TYPE_2D;
4979 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4980 image_ci.extent.width = 32;
4981 image_ci.extent.height = 32;
4982 image_ci.extent.depth = 1;
4983 image_ci.mipLevels = 1;
4984 image_ci.arrayLayers = 1;
4985 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
4986 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004987 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004988 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4989 image_ci.flags = 0;
4990 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004991 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004992
4993 VkMemoryRequirements memory_reqs;
4994 VkDeviceMemory image_memory;
4995 bool pass;
4996 VkMemoryAllocateInfo memory_info = {};
4997 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4998 memory_info.pNext = NULL;
4999 memory_info.allocationSize = 0;
5000 memory_info.memoryTypeIndex = 0;
5001 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5002 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005003 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005004 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005005 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005006 ASSERT_VK_SUCCESS(err);
5007 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5008 ASSERT_VK_SUCCESS(err);
5009
5010 VkImageViewCreateInfo ivci = {
5011 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5012 nullptr,
5013 0,
5014 image,
5015 VK_IMAGE_VIEW_TYPE_2D,
5016 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005017 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005018 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5019 };
5020 VkImageView view;
5021 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5022 ASSERT_VK_SUCCESS(err);
5023
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005024 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005025 VkFramebuffer fb;
5026 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5027 ASSERT_VK_SUCCESS(err);
5028
5029 // Just use default renderpass with our framebuffer
5030 m_renderPassBeginInfo.framebuffer = fb;
Jeremy Hayesba817e12017-03-03 15:51:11 -07005031 m_renderPassBeginInfo.renderArea.extent.width = 32;
5032 m_renderPassBeginInfo.renderArea.extent.height = 32;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005033 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005034 m_commandBuffer->BeginCommandBuffer();
5035 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5036 m_commandBuffer->EndRenderPass();
5037 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005038 // Destroy image attached to framebuffer to invalidate cmd buffer
5039 vkDestroyImage(m_device->device(), image, NULL);
5040 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005041 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005042 QueueCommandBuffer(false);
5043 m_errorMonitor->VerifyFound();
5044
5045 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5046 vkDestroyImageView(m_device->device(), view, nullptr);
5047 vkFreeMemory(m_device->device(), image_memory, nullptr);
5048}
5049
Tobin Ehlisb329f992016-10-12 13:20:29 -06005050TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
5051 TEST_DESCRIPTION("Delete in-use framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005052 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb329f992016-10-12 13:20:29 -06005053 VkFormatProperties format_properties;
5054 VkResult err = VK_SUCCESS;
5055 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5056
Tobin Ehlisb329f992016-10-12 13:20:29 -06005057 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5058
5059 VkImageObj image(m_device);
5060 image.init(256, 256, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
5061 ASSERT_TRUE(image.initialized());
5062 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5063
5064 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5065 VkFramebuffer fb;
5066 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5067 ASSERT_VK_SUCCESS(err);
5068
5069 // Just use default renderpass with our framebuffer
5070 m_renderPassBeginInfo.framebuffer = fb;
5071 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005072 m_commandBuffer->BeginCommandBuffer();
5073 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5074 m_commandBuffer->EndRenderPass();
5075 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisb329f992016-10-12 13:20:29 -06005076 // Submit cmd buffer to put it in-flight
5077 VkSubmitInfo submit_info = {};
5078 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5079 submit_info.commandBufferCount = 1;
5080 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5081 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5082 // Destroy framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005083 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00422);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005084 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5085 m_errorMonitor->VerifyFound();
5086 // Wait for queue to complete so we can safely destroy everything
5087 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005088 m_errorMonitor->SetUnexpectedError("If framebuffer is not VK_NULL_HANDLE, framebuffer must be a valid VkFramebuffer handle");
5089 m_errorMonitor->SetUnexpectedError("Unable to remove Framebuffer obj");
Tobin Ehlisb329f992016-10-12 13:20:29 -06005090 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5091}
5092
Tobin Ehlis88becd72016-09-21 14:33:41 -06005093TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
5094 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005095 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis88becd72016-09-21 14:33:41 -06005096 VkFormatProperties format_properties;
5097 VkResult err = VK_SUCCESS;
5098 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005099
Tobin Ehlis88becd72016-09-21 14:33:41 -06005100 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5101
5102 VkImageCreateInfo image_ci = {};
5103 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5104 image_ci.pNext = NULL;
5105 image_ci.imageType = VK_IMAGE_TYPE_2D;
5106 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5107 image_ci.extent.width = 256;
5108 image_ci.extent.height = 256;
5109 image_ci.extent.depth = 1;
5110 image_ci.mipLevels = 1;
5111 image_ci.arrayLayers = 1;
5112 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5113 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06005114 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06005115 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5116 image_ci.flags = 0;
5117 VkImage image;
5118 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
5119
5120 VkMemoryRequirements memory_reqs;
5121 VkDeviceMemory image_memory;
5122 bool pass;
5123 VkMemoryAllocateInfo memory_info = {};
5124 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5125 memory_info.pNext = NULL;
5126 memory_info.allocationSize = 0;
5127 memory_info.memoryTypeIndex = 0;
5128 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5129 memory_info.allocationSize = memory_reqs.size;
5130 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5131 ASSERT_TRUE(pass);
5132 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5133 ASSERT_VK_SUCCESS(err);
5134 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5135 ASSERT_VK_SUCCESS(err);
5136
5137 VkImageViewCreateInfo ivci = {
5138 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5139 nullptr,
5140 0,
5141 image,
5142 VK_IMAGE_VIEW_TYPE_2D,
5143 VK_FORMAT_B8G8R8A8_UNORM,
5144 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
5145 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5146 };
5147 VkImageView view;
5148 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5149 ASSERT_VK_SUCCESS(err);
5150
5151 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5152 VkFramebuffer fb;
5153 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5154 ASSERT_VK_SUCCESS(err);
5155
5156 // Just use default renderpass with our framebuffer
5157 m_renderPassBeginInfo.framebuffer = fb;
5158 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005159 m_commandBuffer->BeginCommandBuffer();
5160 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5161 m_commandBuffer->EndRenderPass();
5162 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis88becd72016-09-21 14:33:41 -06005163 // Submit cmd buffer to put it (and attached imageView) in-flight
5164 VkSubmitInfo submit_info = {};
5165 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5166 submit_info.commandBufferCount = 1;
5167 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5168 // Submit cmd buffer to put framebuffer and children in-flight
5169 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5170 // Destroy image attached to framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005171 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00743);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005172 vkDestroyImage(m_device->device(), image, NULL);
5173 m_errorMonitor->VerifyFound();
5174 // Wait for queue to complete so we can safely destroy image and other objects
5175 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005176 m_errorMonitor->SetUnexpectedError("If image is not VK_NULL_HANDLE, image must be a valid VkImage handle");
5177 m_errorMonitor->SetUnexpectedError("Unable to remove Image obj");
Tobin Ehlis88becd72016-09-21 14:33:41 -06005178 vkDestroyImage(m_device->device(), image, NULL);
5179 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5180 vkDestroyImageView(m_device->device(), view, nullptr);
5181 vkFreeMemory(m_device->device(), image_memory, nullptr);
5182}
5183
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005184TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
5185 TEST_DESCRIPTION("Delete in-use renderPass.");
5186
Tony Barbour1fa09702017-03-16 12:09:08 -06005187 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005188 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5189
5190 // Create simple renderpass
5191 VkAttachmentReference attach = {};
5192 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
5193 VkSubpassDescription subpass = {};
5194 subpass.pColorAttachments = &attach;
5195 VkRenderPassCreateInfo rpci = {};
5196 rpci.subpassCount = 1;
5197 rpci.pSubpasses = &subpass;
5198 rpci.attachmentCount = 1;
5199 VkAttachmentDescription attach_desc = {};
5200 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
5201 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
5202 rpci.pAttachments = &attach_desc;
5203 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5204 VkRenderPass rp;
5205 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5206 ASSERT_VK_SUCCESS(err);
5207
5208 // Create a pipeline that uses the given renderpass
5209 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5210 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5211
5212 VkPipelineLayout pipeline_layout;
5213 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5214 ASSERT_VK_SUCCESS(err);
5215
5216 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5217 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5218 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005219 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005220 vp_state_ci.pViewports = &vp;
5221 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005222 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005223 vp_state_ci.pScissors = &scissors;
5224
5225 VkPipelineShaderStageCreateInfo shaderStages[2];
5226 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5227
5228 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005229 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005230 // but add it to be able to run on more devices
5231 shaderStages[0] = vs.GetStageCreateInfo();
5232 shaderStages[1] = fs.GetStageCreateInfo();
5233
5234 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5235 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5236
5237 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5238 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5239 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5240
5241 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5242 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5243 rs_ci.rasterizerDiscardEnable = true;
5244 rs_ci.lineWidth = 1.0f;
5245
5246 VkPipelineColorBlendAttachmentState att = {};
5247 att.blendEnable = VK_FALSE;
5248 att.colorWriteMask = 0xf;
5249
5250 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5251 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5252 cb_ci.attachmentCount = 1;
5253 cb_ci.pAttachments = &att;
5254
5255 VkGraphicsPipelineCreateInfo gp_ci = {};
5256 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5257 gp_ci.stageCount = 2;
5258 gp_ci.pStages = shaderStages;
5259 gp_ci.pVertexInputState = &vi_ci;
5260 gp_ci.pInputAssemblyState = &ia_ci;
5261 gp_ci.pViewportState = &vp_state_ci;
5262 gp_ci.pRasterizationState = &rs_ci;
5263 gp_ci.pColorBlendState = &cb_ci;
5264 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5265 gp_ci.layout = pipeline_layout;
5266 gp_ci.renderPass = rp;
5267
5268 VkPipelineCacheCreateInfo pc_ci = {};
5269 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5270
5271 VkPipeline pipeline;
5272 VkPipelineCache pipe_cache;
5273 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
5274 ASSERT_VK_SUCCESS(err);
5275
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005276 m_errorMonitor->SetUnexpectedError(
5277 "If pColorBlendState is not NULL, The attachmentCount member of pColorBlendState must be equal to the colorAttachmentCount "
5278 "used to create subpass");
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005279 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
5280 ASSERT_VK_SUCCESS(err);
5281 // Bind pipeline to cmd buffer, will also bind renderpass
5282 m_commandBuffer->BeginCommandBuffer();
5283 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5284 m_commandBuffer->EndCommandBuffer();
5285
5286 VkSubmitInfo submit_info = {};
5287 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5288 submit_info.commandBufferCount = 1;
5289 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5290 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5291
5292 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
5293 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5294 m_errorMonitor->VerifyFound();
5295
5296 // Wait for queue to complete so we can safely destroy everything
5297 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005298 m_errorMonitor->SetUnexpectedError("If renderPass is not VK_NULL_HANDLE, renderPass must be a valid VkRenderPass handle");
5299 m_errorMonitor->SetUnexpectedError("Unable to remove Render Pass obj");
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005300 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5301 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5302 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
5303 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
5304}
5305
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005306TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005307 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005308 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005309
5310 VkImage image;
5311 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5312 VkImageCreateInfo image_create_info = {};
5313 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5314 image_create_info.pNext = NULL;
5315 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5316 image_create_info.format = tex_format;
5317 image_create_info.extent.width = 32;
5318 image_create_info.extent.height = 32;
5319 image_create_info.extent.depth = 1;
5320 image_create_info.mipLevels = 1;
5321 image_create_info.arrayLayers = 1;
5322 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5323 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005324 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005325 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005326 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005327 ASSERT_VK_SUCCESS(err);
5328 // Have to bind memory to image before recording cmd in cmd buffer using it
5329 VkMemoryRequirements mem_reqs;
5330 VkDeviceMemory image_mem;
5331 bool pass;
5332 VkMemoryAllocateInfo mem_alloc = {};
5333 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5334 mem_alloc.pNext = NULL;
5335 mem_alloc.memoryTypeIndex = 0;
5336 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
5337 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005338 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005339 ASSERT_TRUE(pass);
5340 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
5341 ASSERT_VK_SUCCESS(err);
5342
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005343 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
5344 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005345 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005346
5347 m_commandBuffer->BeginCommandBuffer();
5348 VkClearColorValue ccv;
5349 ccv.float32[0] = 1.0f;
5350 ccv.float32[1] = 1.0f;
5351 ccv.float32[2] = 1.0f;
5352 ccv.float32[3] = 1.0f;
5353 VkImageSubresourceRange isr = {};
5354 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5355 isr.baseArrayLayer = 0;
5356 isr.baseMipLevel = 0;
5357 isr.layerCount = 1;
5358 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005359 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005360 m_commandBuffer->EndCommandBuffer();
5361
5362 m_errorMonitor->VerifyFound();
5363 vkDestroyImage(m_device->device(), image, NULL);
5364 vkFreeMemory(m_device->device(), image_mem, nullptr);
5365}
5366
5367TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005368 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005369 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005370
5371 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005372 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005373 VK_IMAGE_TILING_OPTIMAL, 0);
5374 ASSERT_TRUE(image.initialized());
5375
5376 VkBuffer buffer;
5377 VkDeviceMemory mem;
5378 VkMemoryRequirements mem_reqs;
5379
5380 VkBufferCreateInfo buf_info = {};
5381 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12005382 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005383 buf_info.size = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005384 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5385 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
5386 ASSERT_VK_SUCCESS(err);
5387
5388 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
5389
5390 VkMemoryAllocateInfo alloc_info = {};
5391 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005392 alloc_info.allocationSize = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005393 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005394 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005395 if (!pass) {
5396 vkDestroyBuffer(m_device->device(), buffer, NULL);
5397 return;
5398 }
5399 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
5400 ASSERT_VK_SUCCESS(err);
5401
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005402 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5403 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005404 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005405 VkBufferImageCopy region = {};
Mark Lobodzinski80871462017-02-16 10:37:27 -07005406 region.bufferRowLength = 16;
5407 region.bufferImageHeight = 16;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005408 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5409
5410 region.imageSubresource.layerCount = 1;
5411 region.imageExtent.height = 4;
5412 region.imageExtent.width = 4;
5413 region.imageExtent.depth = 1;
5414 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005415 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5416 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005417 m_commandBuffer->EndCommandBuffer();
5418
5419 m_errorMonitor->VerifyFound();
5420
5421 vkDestroyBuffer(m_device->device(), buffer, NULL);
5422 vkFreeMemory(m_device->handle(), mem, NULL);
5423}
5424
Tobin Ehlis85940f52016-07-07 16:57:21 -06005425TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005426 TEST_DESCRIPTION(
5427 "Attempt to draw with a command buffer that is invalid "
5428 "due to an event dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005429 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85940f52016-07-07 16:57:21 -06005430
5431 VkEvent event;
5432 VkEventCreateInfo evci = {};
5433 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5434 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
5435 ASSERT_VK_SUCCESS(result);
5436
5437 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005438 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06005439 m_commandBuffer->EndCommandBuffer();
5440
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005441 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005442 // Destroy event dependency prior to submit to cause ERROR
5443 vkDestroyEvent(m_device->device(), event, NULL);
5444
5445 VkSubmitInfo submit_info = {};
5446 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5447 submit_info.commandBufferCount = 1;
5448 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5449 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5450
5451 m_errorMonitor->VerifyFound();
5452}
5453
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005454TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005455 TEST_DESCRIPTION(
5456 "Attempt to draw with a command buffer that is invalid "
5457 "due to a query pool dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005458 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005459
5460 VkQueryPool query_pool;
5461 VkQueryPoolCreateInfo qpci{};
5462 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5463 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
5464 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005465 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005466 ASSERT_VK_SUCCESS(result);
5467
5468 m_commandBuffer->BeginCommandBuffer();
5469 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
5470 m_commandBuffer->EndCommandBuffer();
5471
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005472 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound query pool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005473 // Destroy query pool dependency prior to submit to cause ERROR
5474 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
5475
5476 VkSubmitInfo submit_info = {};
5477 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5478 submit_info.commandBufferCount = 1;
5479 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5480 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5481
5482 m_errorMonitor->VerifyFound();
5483}
5484
Tobin Ehlis24130d92016-07-08 15:50:53 -06005485TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005486 TEST_DESCRIPTION(
5487 "Attempt to draw with a command buffer that is invalid "
5488 "due to a pipeline dependency being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005489 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis24130d92016-07-08 15:50:53 -06005490 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5491
5492 VkResult err;
5493
5494 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5495 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5496
5497 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005498 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005499 ASSERT_VK_SUCCESS(err);
5500
5501 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5502 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5503 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005504 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06005505 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005506 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005507 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis24130d92016-07-08 15:50:53 -06005508 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005509
5510 VkPipelineShaderStageCreateInfo shaderStages[2];
5511 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5512
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005513 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005514 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this); // We shouldn't need a fragment shader
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005515 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06005516 shaderStages[0] = vs.GetStageCreateInfo();
5517 shaderStages[1] = fs.GetStageCreateInfo();
5518
5519 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5520 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5521
5522 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5523 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5524 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5525
5526 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5527 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12005528 rs_ci.rasterizerDiscardEnable = true;
5529 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005530
5531 VkPipelineColorBlendAttachmentState att = {};
5532 att.blendEnable = VK_FALSE;
5533 att.colorWriteMask = 0xf;
5534
5535 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5536 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5537 cb_ci.attachmentCount = 1;
5538 cb_ci.pAttachments = &att;
5539
5540 VkGraphicsPipelineCreateInfo gp_ci = {};
5541 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5542 gp_ci.stageCount = 2;
5543 gp_ci.pStages = shaderStages;
5544 gp_ci.pVertexInputState = &vi_ci;
5545 gp_ci.pInputAssemblyState = &ia_ci;
5546 gp_ci.pViewportState = &vp_state_ci;
5547 gp_ci.pRasterizationState = &rs_ci;
5548 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005549 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5550 gp_ci.layout = pipeline_layout;
5551 gp_ci.renderPass = renderPass();
5552
5553 VkPipelineCacheCreateInfo pc_ci = {};
5554 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5555
5556 VkPipeline pipeline;
5557 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005558 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005559 ASSERT_VK_SUCCESS(err);
5560
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005561 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005562 ASSERT_VK_SUCCESS(err);
5563
5564 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005565 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005566 m_commandBuffer->EndCommandBuffer();
5567 // Now destroy pipeline in order to cause error when submitting
5568 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5569
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005570 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005571
5572 VkSubmitInfo submit_info = {};
5573 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5574 submit_info.commandBufferCount = 1;
5575 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5576 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5577
5578 m_errorMonitor->VerifyFound();
5579 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5580 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5581}
5582
Tobin Ehlis31289162016-08-17 14:57:58 -06005583TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005584 TEST_DESCRIPTION(
5585 "Attempt to draw with a command buffer that is invalid "
5586 "due to a bound descriptor set with a buffer dependency "
5587 "being destroyed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005588 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis31289162016-08-17 14:57:58 -06005589 ASSERT_NO_FATAL_FAILURE(InitViewport());
5590 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5591
5592 VkDescriptorPoolSize ds_type_count = {};
5593 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5594 ds_type_count.descriptorCount = 1;
5595
5596 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5597 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5598 ds_pool_ci.pNext = NULL;
5599 ds_pool_ci.maxSets = 1;
5600 ds_pool_ci.poolSizeCount = 1;
5601 ds_pool_ci.pPoolSizes = &ds_type_count;
5602
5603 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005604 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06005605 ASSERT_VK_SUCCESS(err);
5606
5607 VkDescriptorSetLayoutBinding dsl_binding = {};
5608 dsl_binding.binding = 0;
5609 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5610 dsl_binding.descriptorCount = 1;
5611 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5612 dsl_binding.pImmutableSamplers = NULL;
5613
5614 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5615 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5616 ds_layout_ci.pNext = NULL;
5617 ds_layout_ci.bindingCount = 1;
5618 ds_layout_ci.pBindings = &dsl_binding;
5619 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005620 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005621 ASSERT_VK_SUCCESS(err);
5622
5623 VkDescriptorSet descriptorSet;
5624 VkDescriptorSetAllocateInfo alloc_info = {};
5625 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5626 alloc_info.descriptorSetCount = 1;
5627 alloc_info.descriptorPool = ds_pool;
5628 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005629 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005630 ASSERT_VK_SUCCESS(err);
5631
5632 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5633 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5634 pipeline_layout_ci.pNext = NULL;
5635 pipeline_layout_ci.setLayoutCount = 1;
5636 pipeline_layout_ci.pSetLayouts = &ds_layout;
5637
5638 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005639 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005640 ASSERT_VK_SUCCESS(err);
5641
5642 // Create a buffer to update the descriptor with
5643 uint32_t qfi = 0;
5644 VkBufferCreateInfo buffCI = {};
5645 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5646 buffCI.size = 1024;
5647 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5648 buffCI.queueFamilyIndexCount = 1;
5649 buffCI.pQueueFamilyIndices = &qfi;
5650
5651 VkBuffer buffer;
5652 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5653 ASSERT_VK_SUCCESS(err);
5654 // Allocate memory and bind to buffer so we can make it to the appropriate
5655 // error
5656 VkMemoryAllocateInfo mem_alloc = {};
5657 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5658 mem_alloc.pNext = NULL;
5659 mem_alloc.allocationSize = 1024;
5660 mem_alloc.memoryTypeIndex = 0;
5661
5662 VkMemoryRequirements memReqs;
5663 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005664 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005665 if (!pass) {
5666 vkDestroyBuffer(m_device->device(), buffer, NULL);
5667 return;
5668 }
5669
5670 VkDeviceMemory mem;
5671 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5672 ASSERT_VK_SUCCESS(err);
5673 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5674 ASSERT_VK_SUCCESS(err);
5675 // Correctly update descriptor to avoid "NOT_UPDATED" error
5676 VkDescriptorBufferInfo buffInfo = {};
5677 buffInfo.buffer = buffer;
5678 buffInfo.offset = 0;
5679 buffInfo.range = 1024;
5680
5681 VkWriteDescriptorSet descriptor_write;
5682 memset(&descriptor_write, 0, sizeof(descriptor_write));
5683 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5684 descriptor_write.dstSet = descriptorSet;
5685 descriptor_write.dstBinding = 0;
5686 descriptor_write.descriptorCount = 1;
5687 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5688 descriptor_write.pBufferInfo = &buffInfo;
5689
5690 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5691
5692 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005693 char const *vsSource =
5694 "#version 450\n"
5695 "\n"
5696 "out gl_PerVertex { \n"
5697 " vec4 gl_Position;\n"
5698 "};\n"
5699 "void main(){\n"
5700 " gl_Position = vec4(1);\n"
5701 "}\n";
5702 char const *fsSource =
5703 "#version 450\n"
5704 "\n"
5705 "layout(location=0) out vec4 x;\n"
5706 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5707 "void main(){\n"
5708 " x = vec4(bar.y);\n"
5709 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005710 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5711 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5712 VkPipelineObj pipe(m_device);
5713 pipe.AddShader(&vs);
5714 pipe.AddShader(&fs);
5715 pipe.AddColorAttachment();
5716 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5717
Tony Barbour552f6c02016-12-21 14:34:07 -07005718 m_commandBuffer->BeginCommandBuffer();
5719 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005720 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5721 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5722 &descriptorSet, 0, NULL);
Rene Lindsay0583ac92017-01-16 14:29:10 -07005723
5724 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
5725 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
5726
Tobin Ehlis31289162016-08-17 14:57:58 -06005727 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005728 m_commandBuffer->EndRenderPass();
5729 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005730 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005731 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5732 vkDestroyBuffer(m_device->device(), buffer, NULL);
5733 // Attempt to submit cmd buffer
5734 VkSubmitInfo submit_info = {};
5735 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5736 submit_info.commandBufferCount = 1;
5737 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5738 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5739 m_errorMonitor->VerifyFound();
5740 // Cleanup
5741 vkFreeMemory(m_device->device(), mem, NULL);
5742
5743 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5744 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5745 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5746}
5747
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005748TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005749 TEST_DESCRIPTION(
5750 "Attempt to draw with a command buffer that is invalid "
5751 "due to a bound descriptor sets with a combined image "
5752 "sampler having their image, sampler, and descriptor set "
5753 "each respectively destroyed and then attempting to "
5754 "submit associated cmd buffers. Attempt to destroy a "
5755 "DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06005756 ASSERT_NO_FATAL_FAILURE(Init(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005757 ASSERT_NO_FATAL_FAILURE(InitViewport());
5758 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5759
5760 VkDescriptorPoolSize ds_type_count = {};
5761 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5762 ds_type_count.descriptorCount = 1;
5763
5764 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5765 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5766 ds_pool_ci.pNext = NULL;
Rene Lindsayed88b732017-01-27 15:55:29 -07005767 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005768 ds_pool_ci.maxSets = 1;
5769 ds_pool_ci.poolSizeCount = 1;
5770 ds_pool_ci.pPoolSizes = &ds_type_count;
5771
5772 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005773 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005774 ASSERT_VK_SUCCESS(err);
5775
5776 VkDescriptorSetLayoutBinding dsl_binding = {};
5777 dsl_binding.binding = 0;
5778 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5779 dsl_binding.descriptorCount = 1;
5780 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5781 dsl_binding.pImmutableSamplers = NULL;
5782
5783 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5784 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5785 ds_layout_ci.pNext = NULL;
5786 ds_layout_ci.bindingCount = 1;
5787 ds_layout_ci.pBindings = &dsl_binding;
5788 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005789 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005790 ASSERT_VK_SUCCESS(err);
5791
5792 VkDescriptorSet descriptorSet;
5793 VkDescriptorSetAllocateInfo alloc_info = {};
5794 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5795 alloc_info.descriptorSetCount = 1;
5796 alloc_info.descriptorPool = ds_pool;
5797 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005798 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005799 ASSERT_VK_SUCCESS(err);
5800
5801 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5802 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5803 pipeline_layout_ci.pNext = NULL;
5804 pipeline_layout_ci.setLayoutCount = 1;
5805 pipeline_layout_ci.pSetLayouts = &ds_layout;
5806
5807 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005808 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005809 ASSERT_VK_SUCCESS(err);
5810
5811 // Create images to update the descriptor with
5812 VkImage image;
5813 VkImage image2;
5814 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5815 const int32_t tex_width = 32;
5816 const int32_t tex_height = 32;
5817 VkImageCreateInfo image_create_info = {};
5818 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5819 image_create_info.pNext = NULL;
5820 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5821 image_create_info.format = tex_format;
5822 image_create_info.extent.width = tex_width;
5823 image_create_info.extent.height = tex_height;
5824 image_create_info.extent.depth = 1;
5825 image_create_info.mipLevels = 1;
5826 image_create_info.arrayLayers = 1;
5827 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5828 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5829 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5830 image_create_info.flags = 0;
5831 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5832 ASSERT_VK_SUCCESS(err);
5833 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5834 ASSERT_VK_SUCCESS(err);
5835
5836 VkMemoryRequirements memory_reqs;
5837 VkDeviceMemory image_memory;
5838 bool pass;
5839 VkMemoryAllocateInfo memory_info = {};
5840 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5841 memory_info.pNext = NULL;
5842 memory_info.allocationSize = 0;
5843 memory_info.memoryTypeIndex = 0;
5844 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5845 // Allocate enough memory for both images
5846 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005847 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005848 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005849 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005850 ASSERT_VK_SUCCESS(err);
5851 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5852 ASSERT_VK_SUCCESS(err);
5853 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005854 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005855 ASSERT_VK_SUCCESS(err);
5856
5857 VkImageViewCreateInfo image_view_create_info = {};
5858 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5859 image_view_create_info.image = image;
5860 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5861 image_view_create_info.format = tex_format;
5862 image_view_create_info.subresourceRange.layerCount = 1;
5863 image_view_create_info.subresourceRange.baseMipLevel = 0;
5864 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005865 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005866
5867 VkImageView view;
5868 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005869 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005870 ASSERT_VK_SUCCESS(err);
5871 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005872 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005873 ASSERT_VK_SUCCESS(err);
5874 // Create Samplers
5875 VkSamplerCreateInfo sampler_ci = {};
5876 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5877 sampler_ci.pNext = NULL;
5878 sampler_ci.magFilter = VK_FILTER_NEAREST;
5879 sampler_ci.minFilter = VK_FILTER_NEAREST;
5880 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5881 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5882 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5883 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5884 sampler_ci.mipLodBias = 1.0;
5885 sampler_ci.anisotropyEnable = VK_FALSE;
5886 sampler_ci.maxAnisotropy = 1;
5887 sampler_ci.compareEnable = VK_FALSE;
5888 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5889 sampler_ci.minLod = 1.0;
5890 sampler_ci.maxLod = 1.0;
5891 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5892 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5893 VkSampler sampler;
5894 VkSampler sampler2;
5895 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5896 ASSERT_VK_SUCCESS(err);
5897 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5898 ASSERT_VK_SUCCESS(err);
5899 // Update descriptor with image and sampler
5900 VkDescriptorImageInfo img_info = {};
5901 img_info.sampler = sampler;
5902 img_info.imageView = view;
5903 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5904
5905 VkWriteDescriptorSet descriptor_write;
5906 memset(&descriptor_write, 0, sizeof(descriptor_write));
5907 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5908 descriptor_write.dstSet = descriptorSet;
5909 descriptor_write.dstBinding = 0;
5910 descriptor_write.descriptorCount = 1;
5911 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5912 descriptor_write.pImageInfo = &img_info;
5913
5914 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5915
5916 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005917 char const *vsSource =
5918 "#version 450\n"
5919 "\n"
5920 "out gl_PerVertex { \n"
5921 " vec4 gl_Position;\n"
5922 "};\n"
5923 "void main(){\n"
5924 " gl_Position = vec4(1);\n"
5925 "}\n";
5926 char const *fsSource =
5927 "#version 450\n"
5928 "\n"
5929 "layout(set=0, binding=0) uniform sampler2D s;\n"
5930 "layout(location=0) out vec4 x;\n"
5931 "void main(){\n"
5932 " x = texture(s, vec2(1));\n"
5933 "}\n";
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005934 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5935 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5936 VkPipelineObj pipe(m_device);
5937 pipe.AddShader(&vs);
5938 pipe.AddShader(&fs);
5939 pipe.AddColorAttachment();
5940 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5941
5942 // First error case is destroying sampler prior to cmd buffer submission
Jeremy Hayesb91c79d2017-02-27 15:09:03 -07005943 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound sampler");
Tony Barbour552f6c02016-12-21 14:34:07 -07005944 m_commandBuffer->BeginCommandBuffer();
5945 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005946 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5947 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5948 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005949 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5950 VkRect2D scissor = {{0, 0}, {16, 16}};
5951 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5952 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005953 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005954 m_commandBuffer->EndRenderPass();
5955 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005956 // Destroy sampler invalidates the cmd buffer, causing error on submit
5957 vkDestroySampler(m_device->device(), sampler, NULL);
5958 // Attempt to submit cmd buffer
5959 VkSubmitInfo submit_info = {};
5960 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5961 submit_info.commandBufferCount = 1;
5962 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5963 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5964 m_errorMonitor->VerifyFound();
Rene Lindsaya31285f2017-01-11 16:35:53 -07005965
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005966 // Now re-update descriptor with valid sampler and delete image
5967 img_info.sampler = sampler2;
5968 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005969
5970 VkCommandBufferBeginInfo info = {};
5971 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5972 info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
5973
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Rene Lindsayed88b732017-01-27 15:55:29 -07005975 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005976 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005977 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5978 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5979 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005980 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5981 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005982 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005983 m_commandBuffer->EndRenderPass();
5984 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005985 // Destroy image invalidates the cmd buffer, causing error on submit
5986 vkDestroyImage(m_device->device(), image, NULL);
5987 // Attempt to submit cmd buffer
5988 submit_info = {};
5989 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5990 submit_info.commandBufferCount = 1;
5991 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5992 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5993 m_errorMonitor->VerifyFound();
5994 // Now update descriptor to be valid, but then free descriptor
5995 img_info.imageView = view2;
5996 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005997 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005998 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005999 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6000 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6001 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07006002 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6003 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006004 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006005 m_commandBuffer->EndRenderPass();
6006 m_commandBuffer->EndCommandBuffer();
Tony Barbourc373c012017-01-26 10:53:28 -07006007 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -07006008
6009 // Immediately try to destroy the descriptor set in the active command buffer - failure expected
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006010 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006011 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06006012 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006013
6014 // Try again once the queue is idle - should succeed w/o error
Dave Houltond5507dd2017-01-24 15:29:02 -07006015 // TODO - though the particular error above doesn't re-occur, there are other 'unexpecteds' still to clean up
Dave Houltonfbf52152017-01-06 12:55:29 -07006016 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006017 m_errorMonitor->SetUnexpectedError(
6018 "pDescriptorSets must be a pointer to an array of descriptorSetCount VkDescriptorSet handles, each element of which must "
6019 "either be a valid handle or VK_NULL_HANDLE");
6020 m_errorMonitor->SetUnexpectedError("Unable to remove Descriptor Set obj");
Dave Houltonfbf52152017-01-06 12:55:29 -07006021 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
6022
6023 // Attempt to submit cmd buffer containing the freed descriptor set
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006024 submit_info = {};
6025 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6026 submit_info.commandBufferCount = 1;
6027 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07006028 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound descriptor set ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006029 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6030 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006031
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006032 // Cleanup
6033 vkFreeMemory(m_device->device(), image_memory, NULL);
6034 vkDestroySampler(m_device->device(), sampler2, NULL);
6035 vkDestroyImage(m_device->device(), image2, NULL);
6036 vkDestroyImageView(m_device->device(), view, NULL);
6037 vkDestroyImageView(m_device->device(), view2, NULL);
6038 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6039 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6040 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6041}
6042
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006043TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
6044 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006045 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006046 ASSERT_NO_FATAL_FAILURE(InitViewport());
6047 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6048
6049 VkDescriptorPoolSize ds_type_count = {};
6050 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6051 ds_type_count.descriptorCount = 1;
6052
6053 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6054 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6055 ds_pool_ci.pNext = NULL;
6056 ds_pool_ci.maxSets = 1;
6057 ds_pool_ci.poolSizeCount = 1;
6058 ds_pool_ci.pPoolSizes = &ds_type_count;
6059
6060 VkDescriptorPool ds_pool;
6061 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6062 ASSERT_VK_SUCCESS(err);
6063
6064 VkDescriptorSetLayoutBinding dsl_binding = {};
6065 dsl_binding.binding = 0;
6066 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6067 dsl_binding.descriptorCount = 1;
6068 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6069 dsl_binding.pImmutableSamplers = NULL;
6070
6071 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6072 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6073 ds_layout_ci.pNext = NULL;
6074 ds_layout_ci.bindingCount = 1;
6075 ds_layout_ci.pBindings = &dsl_binding;
6076 VkDescriptorSetLayout ds_layout;
6077 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6078 ASSERT_VK_SUCCESS(err);
6079
6080 VkDescriptorSet descriptor_set;
6081 VkDescriptorSetAllocateInfo alloc_info = {};
6082 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6083 alloc_info.descriptorSetCount = 1;
6084 alloc_info.descriptorPool = ds_pool;
6085 alloc_info.pSetLayouts = &ds_layout;
6086 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
6087 ASSERT_VK_SUCCESS(err);
6088
6089 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6090 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6091 pipeline_layout_ci.pNext = NULL;
6092 pipeline_layout_ci.setLayoutCount = 1;
6093 pipeline_layout_ci.pSetLayouts = &ds_layout;
6094
6095 VkPipelineLayout pipeline_layout;
6096 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6097 ASSERT_VK_SUCCESS(err);
6098
6099 // Create image to update the descriptor with
6100 VkImageObj image(m_device);
6101 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
6102 ASSERT_TRUE(image.initialized());
6103
6104 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
6105 // Create Sampler
6106 VkSamplerCreateInfo sampler_ci = {};
6107 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6108 sampler_ci.pNext = NULL;
6109 sampler_ci.magFilter = VK_FILTER_NEAREST;
6110 sampler_ci.minFilter = VK_FILTER_NEAREST;
6111 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6112 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6113 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6114 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6115 sampler_ci.mipLodBias = 1.0;
6116 sampler_ci.anisotropyEnable = VK_FALSE;
6117 sampler_ci.maxAnisotropy = 1;
6118 sampler_ci.compareEnable = VK_FALSE;
6119 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6120 sampler_ci.minLod = 1.0;
6121 sampler_ci.maxLod = 1.0;
6122 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6123 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6124 VkSampler sampler;
6125 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6126 ASSERT_VK_SUCCESS(err);
6127 // Update descriptor with image and sampler
6128 VkDescriptorImageInfo img_info = {};
6129 img_info.sampler = sampler;
6130 img_info.imageView = view;
6131 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6132
6133 VkWriteDescriptorSet descriptor_write;
6134 memset(&descriptor_write, 0, sizeof(descriptor_write));
6135 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6136 descriptor_write.dstSet = descriptor_set;
6137 descriptor_write.dstBinding = 0;
6138 descriptor_write.descriptorCount = 1;
6139 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6140 descriptor_write.pImageInfo = &img_info;
6141
6142 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6143
6144 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006145 char const *vsSource =
6146 "#version 450\n"
6147 "\n"
6148 "out gl_PerVertex { \n"
6149 " vec4 gl_Position;\n"
6150 "};\n"
6151 "void main(){\n"
6152 " gl_Position = vec4(1);\n"
6153 "}\n";
6154 char const *fsSource =
6155 "#version 450\n"
6156 "\n"
6157 "layout(set=0, binding=0) uniform sampler2D s;\n"
6158 "layout(location=0) out vec4 x;\n"
6159 "void main(){\n"
6160 " x = texture(s, vec2(1));\n"
6161 "}\n";
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006162 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6163 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6164 VkPipelineObj pipe(m_device);
6165 pipe.AddShader(&vs);
6166 pipe.AddShader(&fs);
6167 pipe.AddColorAttachment();
6168 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6169
Tony Barbour552f6c02016-12-21 14:34:07 -07006170 m_commandBuffer->BeginCommandBuffer();
6171 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006172 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6173 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6174 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006175
6176 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6177 VkRect2D scissor = {{0, 0}, {16, 16}};
6178 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6179 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6180
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006181 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006182 m_commandBuffer->EndRenderPass();
6183 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006184 // Submit cmd buffer to put pool in-flight
6185 VkSubmitInfo submit_info = {};
6186 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6187 submit_info.commandBufferCount = 1;
6188 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6189 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6190 // Destroy pool while in-flight, causing error
6191 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete descriptor pool ");
6192 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6193 m_errorMonitor->VerifyFound();
6194 vkQueueWaitIdle(m_device->m_queue);
6195 // Cleanup
6196 vkDestroySampler(m_device->device(), sampler, NULL);
6197 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6198 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006199 m_errorMonitor->SetUnexpectedError(
6200 "If descriptorPool is not VK_NULL_HANDLE, descriptorPool must be a valid VkDescriptorPool handle");
6201 m_errorMonitor->SetUnexpectedError("Unable to remove Descriptor Pool obj");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006202 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006203 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006204}
6205
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006206TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
6207 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
Tony Barbour1fa09702017-03-16 12:09:08 -06006208 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006209 ASSERT_NO_FATAL_FAILURE(InitViewport());
6210 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6211
6212 VkDescriptorPoolSize ds_type_count = {};
6213 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6214 ds_type_count.descriptorCount = 1;
6215
6216 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6217 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6218 ds_pool_ci.pNext = NULL;
6219 ds_pool_ci.maxSets = 1;
6220 ds_pool_ci.poolSizeCount = 1;
6221 ds_pool_ci.pPoolSizes = &ds_type_count;
6222
6223 VkDescriptorPool ds_pool;
6224 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6225 ASSERT_VK_SUCCESS(err);
6226
6227 VkDescriptorSetLayoutBinding dsl_binding = {};
6228 dsl_binding.binding = 0;
6229 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6230 dsl_binding.descriptorCount = 1;
6231 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6232 dsl_binding.pImmutableSamplers = NULL;
6233
6234 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6235 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6236 ds_layout_ci.pNext = NULL;
6237 ds_layout_ci.bindingCount = 1;
6238 ds_layout_ci.pBindings = &dsl_binding;
6239 VkDescriptorSetLayout ds_layout;
6240 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6241 ASSERT_VK_SUCCESS(err);
6242
6243 VkDescriptorSet descriptorSet;
6244 VkDescriptorSetAllocateInfo alloc_info = {};
6245 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6246 alloc_info.descriptorSetCount = 1;
6247 alloc_info.descriptorPool = ds_pool;
6248 alloc_info.pSetLayouts = &ds_layout;
6249 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6250 ASSERT_VK_SUCCESS(err);
6251
6252 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6253 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6254 pipeline_layout_ci.pNext = NULL;
6255 pipeline_layout_ci.setLayoutCount = 1;
6256 pipeline_layout_ci.pSetLayouts = &ds_layout;
6257
6258 VkPipelineLayout pipeline_layout;
6259 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6260 ASSERT_VK_SUCCESS(err);
6261
6262 // Create images to update the descriptor with
6263 VkImage image;
6264 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6265 const int32_t tex_width = 32;
6266 const int32_t tex_height = 32;
6267 VkImageCreateInfo image_create_info = {};
6268 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6269 image_create_info.pNext = NULL;
6270 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6271 image_create_info.format = tex_format;
6272 image_create_info.extent.width = tex_width;
6273 image_create_info.extent.height = tex_height;
6274 image_create_info.extent.depth = 1;
6275 image_create_info.mipLevels = 1;
6276 image_create_info.arrayLayers = 1;
6277 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6278 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6279 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6280 image_create_info.flags = 0;
6281 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6282 ASSERT_VK_SUCCESS(err);
6283 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
6284 VkMemoryRequirements memory_reqs;
6285 VkDeviceMemory image_memory;
6286 bool pass;
6287 VkMemoryAllocateInfo memory_info = {};
6288 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6289 memory_info.pNext = NULL;
6290 memory_info.allocationSize = 0;
6291 memory_info.memoryTypeIndex = 0;
6292 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
6293 // Allocate enough memory for image
6294 memory_info.allocationSize = memory_reqs.size;
6295 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
6296 ASSERT_TRUE(pass);
6297 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
6298 ASSERT_VK_SUCCESS(err);
6299 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
6300 ASSERT_VK_SUCCESS(err);
6301
6302 VkImageViewCreateInfo image_view_create_info = {};
6303 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6304 image_view_create_info.image = image;
6305 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6306 image_view_create_info.format = tex_format;
6307 image_view_create_info.subresourceRange.layerCount = 1;
6308 image_view_create_info.subresourceRange.baseMipLevel = 0;
6309 image_view_create_info.subresourceRange.levelCount = 1;
6310 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6311
6312 VkImageView view;
6313 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6314 ASSERT_VK_SUCCESS(err);
6315 // Create Samplers
6316 VkSamplerCreateInfo sampler_ci = {};
6317 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6318 sampler_ci.pNext = NULL;
6319 sampler_ci.magFilter = VK_FILTER_NEAREST;
6320 sampler_ci.minFilter = VK_FILTER_NEAREST;
6321 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6322 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6323 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6324 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6325 sampler_ci.mipLodBias = 1.0;
6326 sampler_ci.anisotropyEnable = VK_FALSE;
6327 sampler_ci.maxAnisotropy = 1;
6328 sampler_ci.compareEnable = VK_FALSE;
6329 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6330 sampler_ci.minLod = 1.0;
6331 sampler_ci.maxLod = 1.0;
6332 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6333 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6334 VkSampler sampler;
6335 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6336 ASSERT_VK_SUCCESS(err);
6337 // Update descriptor with image and sampler
6338 VkDescriptorImageInfo img_info = {};
6339 img_info.sampler = sampler;
6340 img_info.imageView = view;
6341 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6342
6343 VkWriteDescriptorSet descriptor_write;
6344 memset(&descriptor_write, 0, sizeof(descriptor_write));
6345 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6346 descriptor_write.dstSet = descriptorSet;
6347 descriptor_write.dstBinding = 0;
6348 descriptor_write.descriptorCount = 1;
6349 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6350 descriptor_write.pImageInfo = &img_info;
6351 // Break memory binding and attempt update
6352 vkFreeMemory(m_device->device(), image_memory, nullptr);
6353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006354 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006355 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6356 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
6357 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6358 m_errorMonitor->VerifyFound();
6359 // Cleanup
6360 vkDestroyImage(m_device->device(), image, NULL);
6361 vkDestroySampler(m_device->device(), sampler, NULL);
6362 vkDestroyImageView(m_device->device(), view, NULL);
6363 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6364 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6365 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6366}
6367
Karl Schultz6addd812016-02-02 17:17:23 -07006368TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006369 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6370 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006371 // Create a valid cmd buffer
6372 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006373 uint64_t fake_pipeline_handle = 0xbaad6001;
6374 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Tony Barbour1fa09702017-03-16 12:09:08 -06006375 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006376 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6377
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006378 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07006379 m_commandBuffer->BeginCommandBuffer();
6380 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006381 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06006382 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006383
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006384 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006385 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006386 Draw(1, 0, 0, 0);
6387 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006388
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006389 // Finally same check once more but with Dispatch/Compute
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006390 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "At Draw/Dispatch time no valid VkPipeline is bound!");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006391 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006392 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6393 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006394}
6395
Karl Schultz6addd812016-02-02 17:17:23 -07006396TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06006397 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07006398 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006399
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006400 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006401
Tony Barbour1fa09702017-03-16 12:09:08 -06006402 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006403 ASSERT_NO_FATAL_FAILURE(InitViewport());
6404 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006405 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006406 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6407 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006408
6409 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006410 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6411 ds_pool_ci.pNext = NULL;
6412 ds_pool_ci.maxSets = 1;
6413 ds_pool_ci.poolSizeCount = 1;
6414 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006415
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006416 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006417 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006418 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006419
Tony Barboureb254902015-07-15 12:50:33 -06006420 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006421 dsl_binding.binding = 0;
6422 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6423 dsl_binding.descriptorCount = 1;
6424 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6425 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006426
Tony Barboureb254902015-07-15 12:50:33 -06006427 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006428 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6429 ds_layout_ci.pNext = NULL;
6430 ds_layout_ci.bindingCount = 1;
6431 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006432 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006433 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006434 ASSERT_VK_SUCCESS(err);
6435
6436 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006437 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006438 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006439 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006440 alloc_info.descriptorPool = ds_pool;
6441 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006442 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006443 ASSERT_VK_SUCCESS(err);
6444
Tony Barboureb254902015-07-15 12:50:33 -06006445 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006446 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6447 pipeline_layout_ci.pNext = NULL;
6448 pipeline_layout_ci.setLayoutCount = 1;
6449 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006450
6451 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006452 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006453 ASSERT_VK_SUCCESS(err);
6454
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006455 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006456 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006457 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006458 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006459
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006460 VkPipelineObj pipe(m_device);
6461 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006462 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006463 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006464 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006465
Tony Barbour552f6c02016-12-21 14:34:07 -07006466 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006467 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6468 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6469 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006470
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006471 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006472
Chia-I Wuf7458c52015-10-26 21:10:41 +08006473 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6474 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6475 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006476}
6477
Karl Schultz6addd812016-02-02 17:17:23 -07006478TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006479 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006480 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006481
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006482 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006483
Tony Barbour1fa09702017-03-16 12:09:08 -06006484 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006485 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006486 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6487 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006488
6489 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006490 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6491 ds_pool_ci.pNext = NULL;
6492 ds_pool_ci.maxSets = 1;
6493 ds_pool_ci.poolSizeCount = 1;
6494 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006495
6496 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006497 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006498 ASSERT_VK_SUCCESS(err);
6499
6500 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006501 dsl_binding.binding = 0;
6502 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6503 dsl_binding.descriptorCount = 1;
6504 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6505 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006506
6507 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006508 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6509 ds_layout_ci.pNext = NULL;
6510 ds_layout_ci.bindingCount = 1;
6511 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006512 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006513 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006514 ASSERT_VK_SUCCESS(err);
6515
6516 VkDescriptorSet descriptorSet;
6517 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006518 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006519 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006520 alloc_info.descriptorPool = ds_pool;
6521 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006522 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006523 ASSERT_VK_SUCCESS(err);
6524
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006525 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006526 VkWriteDescriptorSet descriptor_write;
6527 memset(&descriptor_write, 0, sizeof(descriptor_write));
6528 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6529 descriptor_write.dstSet = descriptorSet;
6530 descriptor_write.dstBinding = 0;
6531 descriptor_write.descriptorCount = 1;
6532 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6533 descriptor_write.pTexelBufferView = &view;
6534
6535 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6536
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006537 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006538
6539 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6540 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6541}
6542
Mark Youngd339ba32016-05-30 13:28:35 -06006543TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006544 TEST_DESCRIPTION("Attempt to create a buffer view with a buffer that has no memory bound to it.");
Mark Youngd339ba32016-05-30 13:28:35 -06006545
6546 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006547 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006548 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06006549
Tony Barbour1fa09702017-03-16 12:09:08 -06006550 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -06006551
6552 // Create a buffer with no bound memory and then attempt to create
6553 // a buffer view.
6554 VkBufferCreateInfo buff_ci = {};
6555 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12006556 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06006557 buff_ci.size = 256;
6558 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6559 VkBuffer buffer;
6560 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6561 ASSERT_VK_SUCCESS(err);
6562
6563 VkBufferViewCreateInfo buff_view_ci = {};
6564 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6565 buff_view_ci.buffer = buffer;
6566 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6567 buff_view_ci.range = VK_WHOLE_SIZE;
6568 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006569 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06006570
6571 m_errorMonitor->VerifyFound();
6572 vkDestroyBuffer(m_device->device(), buffer, NULL);
6573 // If last error is success, it still created the view, so delete it.
6574 if (err == VK_SUCCESS) {
6575 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6576 }
6577}
6578
Karl Schultz6addd812016-02-02 17:17:23 -07006579TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6580 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6581 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006582 // 1. No dynamicOffset supplied
6583 // 2. Too many dynamicOffsets supplied
6584 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006585 VkResult err;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006586 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6587 " requires 1 dynamicOffsets, but only "
6588 "0 dynamicOffsets are left in "
6589 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006590
Tony Barbour1fa09702017-03-16 12:09:08 -06006591 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006592 ASSERT_NO_FATAL_FAILURE(InitViewport());
6593 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6594
6595 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006596 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6597 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006598
6599 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006600 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6601 ds_pool_ci.pNext = NULL;
6602 ds_pool_ci.maxSets = 1;
6603 ds_pool_ci.poolSizeCount = 1;
6604 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006605
6606 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006607 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006608 ASSERT_VK_SUCCESS(err);
6609
6610 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006611 dsl_binding.binding = 0;
6612 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6613 dsl_binding.descriptorCount = 1;
6614 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6615 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006616
6617 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006618 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6619 ds_layout_ci.pNext = NULL;
6620 ds_layout_ci.bindingCount = 1;
6621 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006622 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006623 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006624 ASSERT_VK_SUCCESS(err);
6625
6626 VkDescriptorSet descriptorSet;
6627 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006628 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006629 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006630 alloc_info.descriptorPool = ds_pool;
6631 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006632 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006633 ASSERT_VK_SUCCESS(err);
6634
6635 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006636 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6637 pipeline_layout_ci.pNext = NULL;
6638 pipeline_layout_ci.setLayoutCount = 1;
6639 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006640
6641 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006642 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006643 ASSERT_VK_SUCCESS(err);
6644
6645 // Create a buffer to update the descriptor with
6646 uint32_t qfi = 0;
6647 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006648 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6649 buffCI.size = 1024;
6650 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6651 buffCI.queueFamilyIndexCount = 1;
6652 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006653
6654 VkBuffer dyub;
6655 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6656 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006657 // Allocate memory and bind to buffer so we can make it to the appropriate
6658 // error
6659 VkMemoryAllocateInfo mem_alloc = {};
6660 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6661 mem_alloc.pNext = NULL;
6662 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006663 mem_alloc.memoryTypeIndex = 0;
6664
6665 VkMemoryRequirements memReqs;
6666 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006667 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006668 if (!pass) {
6669 vkDestroyBuffer(m_device->device(), dyub, NULL);
6670 return;
6671 }
6672
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006673 VkDeviceMemory mem;
6674 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6675 ASSERT_VK_SUCCESS(err);
6676 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6677 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006678 // Correctly update descriptor to avoid "NOT_UPDATED" error
6679 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006680 buffInfo.buffer = dyub;
6681 buffInfo.offset = 0;
6682 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006683
6684 VkWriteDescriptorSet descriptor_write;
6685 memset(&descriptor_write, 0, sizeof(descriptor_write));
6686 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6687 descriptor_write.dstSet = descriptorSet;
6688 descriptor_write.dstBinding = 0;
6689 descriptor_write.descriptorCount = 1;
6690 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6691 descriptor_write.pBufferInfo = &buffInfo;
6692
6693 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6694
Tony Barbour552f6c02016-12-21 14:34:07 -07006695 m_commandBuffer->BeginCommandBuffer();
6696 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006697 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6698 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006699 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006700 uint32_t pDynOff[2] = {512, 756};
6701 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006702 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6703 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6704 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6705 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006706 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006707 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006708 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6709 " dynamic offset 512 combined with "
6710 "offset 0 and range 1024 that "
6711 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006712 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006713 char const *vsSource =
6714 "#version 450\n"
6715 "\n"
6716 "out gl_PerVertex { \n"
6717 " vec4 gl_Position;\n"
6718 "};\n"
6719 "void main(){\n"
6720 " gl_Position = vec4(1);\n"
6721 "}\n";
6722 char const *fsSource =
6723 "#version 450\n"
6724 "\n"
6725 "layout(location=0) out vec4 x;\n"
6726 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6727 "void main(){\n"
6728 " x = vec4(bar.y);\n"
6729 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006730 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6731 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6732 VkPipelineObj pipe(m_device);
6733 pipe.AddShader(&vs);
6734 pipe.AddShader(&fs);
6735 pipe.AddColorAttachment();
6736 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6737
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006738 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6739 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6740 VkRect2D scissor = {{0, 0}, {16, 16}};
6741 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6742
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006743 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006744 // This update should succeed, but offset size of 512 will overstep buffer
6745 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006746 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6747 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006748 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006749 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006750
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006751 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006752 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006753
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006754 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006755 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006756 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6757}
6758
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006759TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006760 TEST_DESCRIPTION(
6761 "Attempt to update a descriptor with a non-sparse buffer "
6762 "that doesn't have memory bound");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006763 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006765 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006766 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6767 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006768
Tony Barbour1fa09702017-03-16 12:09:08 -06006769 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006770 ASSERT_NO_FATAL_FAILURE(InitViewport());
6771 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6772
6773 VkDescriptorPoolSize ds_type_count = {};
6774 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6775 ds_type_count.descriptorCount = 1;
6776
6777 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6778 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6779 ds_pool_ci.pNext = NULL;
6780 ds_pool_ci.maxSets = 1;
6781 ds_pool_ci.poolSizeCount = 1;
6782 ds_pool_ci.pPoolSizes = &ds_type_count;
6783
6784 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006785 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006786 ASSERT_VK_SUCCESS(err);
6787
6788 VkDescriptorSetLayoutBinding dsl_binding = {};
6789 dsl_binding.binding = 0;
6790 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6791 dsl_binding.descriptorCount = 1;
6792 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6793 dsl_binding.pImmutableSamplers = NULL;
6794
6795 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6796 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6797 ds_layout_ci.pNext = NULL;
6798 ds_layout_ci.bindingCount = 1;
6799 ds_layout_ci.pBindings = &dsl_binding;
6800 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006801 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006802 ASSERT_VK_SUCCESS(err);
6803
6804 VkDescriptorSet descriptorSet;
6805 VkDescriptorSetAllocateInfo alloc_info = {};
6806 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6807 alloc_info.descriptorSetCount = 1;
6808 alloc_info.descriptorPool = ds_pool;
6809 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006810 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006811 ASSERT_VK_SUCCESS(err);
6812
6813 // Create a buffer to update the descriptor with
6814 uint32_t qfi = 0;
6815 VkBufferCreateInfo buffCI = {};
6816 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6817 buffCI.size = 1024;
6818 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6819 buffCI.queueFamilyIndexCount = 1;
6820 buffCI.pQueueFamilyIndices = &qfi;
6821
6822 VkBuffer dyub;
6823 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6824 ASSERT_VK_SUCCESS(err);
6825
6826 // Attempt to update descriptor without binding memory to it
6827 VkDescriptorBufferInfo buffInfo = {};
6828 buffInfo.buffer = dyub;
6829 buffInfo.offset = 0;
6830 buffInfo.range = 1024;
6831
6832 VkWriteDescriptorSet descriptor_write;
6833 memset(&descriptor_write, 0, sizeof(descriptor_write));
6834 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6835 descriptor_write.dstSet = descriptorSet;
6836 descriptor_write.dstBinding = 0;
6837 descriptor_write.descriptorCount = 1;
6838 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6839 descriptor_write.pBufferInfo = &buffInfo;
6840
6841 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6842 m_errorMonitor->VerifyFound();
6843
6844 vkDestroyBuffer(m_device->device(), dyub, NULL);
6845 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6846 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6847}
6848
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006849TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006850 VkResult err;
Tony Barbour1fa09702017-03-16 12:09:08 -06006851 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006852 ASSERT_NO_FATAL_FAILURE(InitViewport());
6853 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6854
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006855 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006856 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006857 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6858 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6859 pipeline_layout_ci.pushConstantRangeCount = 1;
6860 pipeline_layout_ci.pPushConstantRanges = &pc_range;
6861
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006862 //
6863 // Check for invalid push constant ranges in pipeline layouts.
6864 //
6865 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006866 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006867 char const *msg;
6868 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006869
Karl Schultzc81037d2016-05-12 08:11:23 -06006870 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
6871 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
6872 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
6873 "vkCreatePipelineLayout() call has push constants index 0 with "
6874 "size 0."},
6875 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
6876 "vkCreatePipelineLayout() call has push constants index 0 with "
6877 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006878 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06006879 "vkCreatePipelineLayout() call has push constants index 0 with "
6880 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006881 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06006882 "vkCreatePipelineLayout() call has push constants index 0 with "
6883 "size 0."},
6884 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6885 "vkCreatePipelineLayout() call has push constants index 0 with "
6886 "offset 1. Offset must"},
6887 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
6888 "vkCreatePipelineLayout() call has push constants index 0 "
6889 "with offset "},
6890 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
6891 "vkCreatePipelineLayout() call has push constants "
6892 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006893 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06006894 "vkCreatePipelineLayout() call has push constants index 0 "
6895 "with offset "},
6896 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
6897 "vkCreatePipelineLayout() call has push "
6898 "constants index 0 with offset "},
6899 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
6900 "vkCreatePipelineLayout() call has push "
6901 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006902 }};
6903
6904 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06006905 for (const auto &iter : range_tests) {
6906 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006907 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6908 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006909 m_errorMonitor->VerifyFound();
6910 if (VK_SUCCESS == err) {
6911 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6912 }
6913 }
6914
6915 // Check for invalid stage flag
6916 pc_range.offset = 0;
6917 pc_range.size = 16;
6918 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006919 m_errorMonitor->SetDesiredFailureMsg(
6920 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6921 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006922 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006923 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006924 if (VK_SUCCESS == err) {
6925 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6926 }
6927
Karl Schultzc59b72d2017-02-24 15:45:05 -07006928 // Check for duplicate stage flags in a list of push constant ranges.
6929 // A shader can only have one push constant block and that block is mapped
6930 // to the push constant range that has that shader's stage flag set.
6931 // The shader's stage flag can only appear once in all the ranges, so the
6932 // implementation can find the one and only range to map it to.
Karl Schultzc81037d2016-05-12 08:11:23 -06006933 const uint32_t ranges_per_test = 5;
Karl Schultzc59b72d2017-02-24 15:45:05 -07006934 struct DuplicateStageFlagsTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006935 VkPushConstantRange const ranges[ranges_per_test];
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006936 std::vector<char const *> const msg;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006937 };
Karl Schultzc59b72d2017-02-24 15:45:05 -07006938 // Overlapping ranges are OK, but a stage flag can appear only once.
6939 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
6940 {
6941 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6942 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6943 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6944 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006945 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzc59b72d2017-02-24 15:45:05 -07006946 {
6947 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
6948 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
6949 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
6950 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
6951 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
6952 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
6953 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
6954 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
6955 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
6956 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
6957 }},
6958 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6959 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
6960 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
6961 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6962 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
6963 {
6964 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
6965 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
6966 }},
6967 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
6968 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
6969 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6970 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6971 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
6972 {
6973 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
6974 }},
6975 },
6976 };
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006977
Karl Schultzc59b72d2017-02-24 15:45:05 -07006978 for (const auto &iter : duplicate_stageFlags_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006979 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06006980 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Karl Schultzc59b72d2017-02-24 15:45:05 -07006981 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg.begin(), iter.msg.end());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006982 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006983 m_errorMonitor->VerifyFound();
6984 if (VK_SUCCESS == err) {
6985 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6986 }
6987 }
6988
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006989 //
6990 // CmdPushConstants tests
6991 //
6992
Karl Schultzc59b72d2017-02-24 15:45:05 -07006993 // Setup a pipeline layout with ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06006994 const VkPushConstantRange pc_range2[] = {
Karl Schultzc59b72d2017-02-24 15:45:05 -07006995 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006996 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006997 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006998 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006999 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007000 ASSERT_VK_SUCCESS(err);
Karl Schultzc59b72d2017-02-24 15:45:05 -07007001
7002 const uint8_t dummy_values[100] = {};
7003
7004 m_commandBuffer->BeginCommandBuffer();
7005 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007006
7007 // Check for invalid stage flag
Karl Schultzc59b72d2017-02-24 15:45:05 -07007008 // Note that VU 00996 isn't reached due to parameter validation
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007009 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007010 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007011 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007012
Karl Schultzc59b72d2017-02-24 15:45:05 -07007013 m_errorMonitor->ExpectSuccess();
7014 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16, dummy_values);
7015 m_errorMonitor->VerifyNotFound();
7016 m_errorMonitor->ExpectSuccess();
7017 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT, 64, 16, dummy_values);
7018 m_errorMonitor->VerifyNotFound();
7019 const std::array<VkPushConstantRange, 6> cmd_range_tests = {{
7020 {VK_SHADER_STAGE_FRAGMENT_BIT, 64, 16},
7021 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7022 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16},
7023 {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
7024 {VK_SHADER_STAGE_VERTEX_BIT, 24, 16},
7025 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007026 }};
Karl Schultzc59b72d2017-02-24 15:45:05 -07007027 for (const auto &iter : cmd_range_tests) {
7028 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00988);
7029 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.stageFlags, iter.offset, iter.size,
7030 dummy_values);
Karl Schultzc81037d2016-05-12 08:11:23 -06007031 m_errorMonitor->VerifyFound();
7032 }
Karl Schultzc81037d2016-05-12 08:11:23 -06007033
Tony Barbour552f6c02016-12-21 14:34:07 -07007034 m_commandBuffer->EndRenderPass();
7035 m_commandBuffer->EndCommandBuffer();
Karl Schultzc59b72d2017-02-24 15:45:05 -07007036 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007037}
7038
Karl Schultz6addd812016-02-02 17:17:23 -07007039TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007040 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007041 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007042
Tony Barbour1fa09702017-03-16 12:09:08 -06007043 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007044 ASSERT_NO_FATAL_FAILURE(InitViewport());
7045 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7046
7047 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7048 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007049 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7050 ds_type_count[0].descriptorCount = 10;
7051 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7052 ds_type_count[1].descriptorCount = 2;
7053 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7054 ds_type_count[2].descriptorCount = 2;
7055 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7056 ds_type_count[3].descriptorCount = 5;
7057 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7058 // type
7059 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7060 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7061 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007062
7063 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007064 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7065 ds_pool_ci.pNext = NULL;
7066 ds_pool_ci.maxSets = 5;
7067 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7068 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007069
7070 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007071 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007072 ASSERT_VK_SUCCESS(err);
7073
7074 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7075 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007076 dsl_binding[0].binding = 0;
7077 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7078 dsl_binding[0].descriptorCount = 5;
7079 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7080 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007081
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007082 // Create layout identical to set0 layout but w/ different stageFlags
7083 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007084 dsl_fs_stage_only.binding = 0;
7085 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7086 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007087 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7088 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07007089 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007090 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007091 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7092 ds_layout_ci.pNext = NULL;
7093 ds_layout_ci.bindingCount = 1;
7094 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007095 static const uint32_t NUM_LAYOUTS = 4;
7096 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007097 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007098 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7099 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007100 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007101 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007102 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007103 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007104 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007105 dsl_binding[0].binding = 0;
7106 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007107 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007108 dsl_binding[1].binding = 1;
7109 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7110 dsl_binding[1].descriptorCount = 2;
7111 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7112 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007113 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007114 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007115 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007116 ASSERT_VK_SUCCESS(err);
7117 dsl_binding[0].binding = 0;
7118 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007119 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007120 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007121 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007122 ASSERT_VK_SUCCESS(err);
7123 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007124 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007125 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007126 ASSERT_VK_SUCCESS(err);
7127
7128 static const uint32_t NUM_SETS = 4;
7129 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7130 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007131 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007132 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007133 alloc_info.descriptorPool = ds_pool;
7134 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007135 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007136 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007137 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007138 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007139 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007140 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007141 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007142
7143 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007144 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7145 pipeline_layout_ci.pNext = NULL;
7146 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7147 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007148
7149 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007150 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007151 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007152 // Create pipelineLayout with only one setLayout
7153 pipeline_layout_ci.setLayoutCount = 1;
7154 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007155 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007156 ASSERT_VK_SUCCESS(err);
7157 // Create pipelineLayout with 2 descriptor setLayout at index 0
7158 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7159 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007160 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007161 ASSERT_VK_SUCCESS(err);
7162 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7163 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7164 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007165 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007166 ASSERT_VK_SUCCESS(err);
7167 // Create pipelineLayout with UB type, but stageFlags for FS only
7168 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7169 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007170 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007171 ASSERT_VK_SUCCESS(err);
7172 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7173 VkDescriptorSetLayout pl_bad_s0[2] = {};
7174 pl_bad_s0[0] = ds_layout_fs_only;
7175 pl_bad_s0[1] = ds_layout[1];
7176 pipeline_layout_ci.setLayoutCount = 2;
7177 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7178 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007179 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007180 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007181
Tobin Ehlis88452832015-12-03 09:40:56 -07007182 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007183 char const *vsSource =
7184 "#version 450\n"
7185 "\n"
7186 "out gl_PerVertex {\n"
7187 " vec4 gl_Position;\n"
7188 "};\n"
7189 "void main(){\n"
7190 " gl_Position = vec4(1);\n"
7191 "}\n";
7192 char const *fsSource =
7193 "#version 450\n"
7194 "\n"
7195 "layout(location=0) out vec4 x;\n"
7196 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7197 "void main(){\n"
7198 " x = vec4(bar.y);\n"
7199 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07007200 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7201 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007202 VkPipelineObj pipe(m_device);
7203 pipe.AddShader(&vs);
7204 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007205 pipe.AddColorAttachment();
7206 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007207
Tony Barbour552f6c02016-12-21 14:34:07 -07007208 m_commandBuffer->BeginCommandBuffer();
7209 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07007210
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007211 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07007212 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7213 // of PSO
7214 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7215 // cmd_pipeline.c
7216 // due to the fact that cmd_alloc_dset_data() has not been called in
7217 // cmd_bind_graphics_pipeline()
7218 // TODO : Want to cause various binding incompatibility issues here to test
7219 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007220 // First cause various verify_layout_compatibility() fails
7221 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007222 // verify_set_layout_compatibility fail cases:
7223 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007225 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7226 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007227 m_errorMonitor->VerifyFound();
7228
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007229 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007230 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
7231 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
7232 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007233 m_errorMonitor->VerifyFound();
7234
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007235 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007236 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7237 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007238 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
7239 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
7240 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007241 m_errorMonitor->VerifyFound();
7242
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007243 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7244 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007245 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
7246 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
7247 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007248 m_errorMonitor->VerifyFound();
7249
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007250 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7251 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007252 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7253 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
7254 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7255 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007256 m_errorMonitor->VerifyFound();
7257
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007258 // Cause INFO messages due to disturbing previously bound Sets
7259 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007260 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7261 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007262 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007263 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
7264 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7265 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007266 m_errorMonitor->VerifyFound();
7267
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007268 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7269 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007270 // 2. Disturb set after last bound set
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007271 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7272 " newly bound as set #0 so set #1 and "
7273 "any subsequent sets were disturbed ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007274 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7275 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007276 m_errorMonitor->VerifyFound();
7277
Tobin Ehlis10fad692016-07-07 12:00:36 -06007278 // Now that we're done actively using the pipelineLayout that gfx pipeline
7279 // was created with, we should be able to delete it. Do that now to verify
7280 // that validation obeys pipelineLayout lifetime
7281 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7282
Tobin Ehlis88452832015-12-03 09:40:56 -07007283 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007284 // 1. Error due to not binding required set (we actually use same code as
7285 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007286 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7287 &descriptorSet[0], 0, NULL);
7288 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7289 &descriptorSet[1], 0, NULL);
7290 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " uses set #0 but that set is not bound.");
Rene Lindsay9f228e42017-01-16 13:57:45 -07007291
7292 VkViewport viewport = {0, 0, 16, 16, 0, 1};
7293 VkRect2D scissor = {{0, 0}, {16, 16}};
7294 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
7295 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
7296
Tobin Ehlis88452832015-12-03 09:40:56 -07007297 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007298 m_errorMonitor->VerifyFound();
7299
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007300 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007301 // 2. Error due to bound set not being compatible with PSO's
7302 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007303 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7304 &descriptorSet[0], 0, NULL);
7305 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007306 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007307 m_errorMonitor->VerifyFound();
7308
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007309 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007310 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007311 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7312 }
7313 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007314 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7315 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7316}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007317
Karl Schultz6addd812016-02-02 17:17:23 -07007318TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007319 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7320 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007321
Tony Barbour1fa09702017-03-16 12:09:08 -06007322 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007323 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007324 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007325 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007326
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007327 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007328}
7329
Karl Schultz6addd812016-02-02 17:17:23 -07007330TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7331 VkResult err;
7332 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007333
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007334 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007335
Tony Barbour1fa09702017-03-16 12:09:08 -06007336 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007337
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007338 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007339 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007340 cmd.pNext = NULL;
Mike Schuchardt06304c22017-03-01 17:09:09 -07007341 cmd.commandPool = m_commandPool->handle();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007342 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007343 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007344
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007345 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007346 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007347
7348 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07007349 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07007350 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7351
7352 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007353 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007354 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007355 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007356 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007357
7358 // The error should be caught by validation of the BeginCommandBuffer call
7359 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7360
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007361 m_errorMonitor->VerifyFound();
Mike Schuchardt06304c22017-03-01 17:09:09 -07007362 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007363}
7364
Karl Schultz6addd812016-02-02 17:17:23 -07007365TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007366 // Cause error due to Begin while recording CB
7367 // Then cause 2 errors for attempting to reset CB w/o having
7368 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7369 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06007370 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007371
Tony Barbour1fa09702017-03-16 12:09:08 -06007372 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007373
7374 // Calls AllocateCommandBuffers
7375 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7376
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007377 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07007378 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007379 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7380 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007381 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7382 cmd_buf_info.pNext = NULL;
7383 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007384 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007385
7386 // Begin CB to transition to recording state
7387 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7388 // Can't re-begin. This should trigger error
7389 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007390 m_errorMonitor->VerifyFound();
7391
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007392 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007393 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007394 // Reset attempt will trigger error due to incorrect CommandPool state
7395 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007396 m_errorMonitor->VerifyFound();
7397
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007398 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007399 // Transition CB to RECORDED state
7400 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7401 // Now attempting to Begin will implicitly reset, which triggers error
7402 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007403 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007404}
7405
Karl Schultz6addd812016-02-02 17:17:23 -07007406TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007407 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007408 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007409
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007410 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7411 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007412
Tony Barbour1fa09702017-03-16 12:09:08 -06007413 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007414 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007415
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007416 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007417 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7418 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007419
7420 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007421 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7422 ds_pool_ci.pNext = NULL;
7423 ds_pool_ci.maxSets = 1;
7424 ds_pool_ci.poolSizeCount = 1;
7425 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007426
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007427 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007428 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007429 ASSERT_VK_SUCCESS(err);
7430
Tony Barboureb254902015-07-15 12:50:33 -06007431 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007432 dsl_binding.binding = 0;
7433 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7434 dsl_binding.descriptorCount = 1;
7435 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7436 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007437
Tony Barboureb254902015-07-15 12:50:33 -06007438 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007439 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7440 ds_layout_ci.pNext = NULL;
7441 ds_layout_ci.bindingCount = 1;
7442 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007443
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007444 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007445 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007446 ASSERT_VK_SUCCESS(err);
7447
7448 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007449 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007450 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007451 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007452 alloc_info.descriptorPool = ds_pool;
7453 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007454 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007455 ASSERT_VK_SUCCESS(err);
7456
Tony Barboureb254902015-07-15 12:50:33 -06007457 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007458 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7459 pipeline_layout_ci.setLayoutCount = 1;
7460 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007461
7462 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007463 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007464 ASSERT_VK_SUCCESS(err);
7465
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007466 VkViewport vp = {}; // Just need dummy vp to point to
7467 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007468
7469 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007470 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7471 vp_state_ci.scissorCount = 1;
7472 vp_state_ci.pScissors = &sc;
7473 vp_state_ci.viewportCount = 1;
7474 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007475
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007476 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7477 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7478 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7479 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7480 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7481 rs_state_ci.depthClampEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007482 rs_state_ci.rasterizerDiscardEnable = VK_TRUE;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007483 rs_state_ci.depthBiasEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007484 rs_state_ci.lineWidth = 1.0f;
7485
7486 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7487 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7488 vi_ci.pNext = nullptr;
7489 vi_ci.vertexBindingDescriptionCount = 0;
7490 vi_ci.pVertexBindingDescriptions = nullptr;
7491 vi_ci.vertexAttributeDescriptionCount = 0;
7492 vi_ci.pVertexAttributeDescriptions = nullptr;
7493
7494 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7495 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7496 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7497
7498 VkPipelineShaderStageCreateInfo shaderStages[2];
7499 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7500
7501 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7502 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Dave Houlton59a20702017-02-02 17:26:23 -07007503 shaderStages[0] = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007504 shaderStages[1] = fs.GetStageCreateInfo();
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007505
Tony Barboureb254902015-07-15 12:50:33 -06007506 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007507 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7508 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007509 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007510 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7511 gp_ci.layout = pipeline_layout;
7512 gp_ci.renderPass = renderPass();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007513 gp_ci.pVertexInputState = &vi_ci;
7514 gp_ci.pInputAssemblyState = &ia_ci;
7515
7516 gp_ci.stageCount = 1;
7517 gp_ci.pStages = shaderStages;
Tony Barboureb254902015-07-15 12:50:33 -06007518
7519 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007520 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7521 pc_ci.initialDataSize = 0;
7522 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007523
7524 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007525 VkPipelineCache pipelineCache;
7526
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007527 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007528 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007529 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007530 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007531
Chia-I Wuf7458c52015-10-26 21:10:41 +08007532 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7533 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7534 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7535 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007536}
Rene Lindsayae4977b2017-01-23 14:55:54 -07007537
Tobin Ehlis912df022015-09-17 08:46:18 -06007538/*// TODO : This test should be good, but needs Tess support in compiler to run
7539TEST_F(VkLayerTest, InvalidPatchControlPoints)
7540{
7541 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007542 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007543
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007544 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007545 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7546primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007547
Tony Barbour1fa09702017-03-16 12:09:08 -06007548 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis912df022015-09-17 08:46:18 -06007549 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007550
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007551 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007552 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007553 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007554
7555 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7556 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7557 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007558 ds_pool_ci.poolSizeCount = 1;
7559 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007560
7561 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007562 err = vkCreateDescriptorPool(m_device->device(),
7563VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007564 ASSERT_VK_SUCCESS(err);
7565
7566 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007567 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007568 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007569 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007570 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7571 dsl_binding.pImmutableSamplers = NULL;
7572
7573 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007574 ds_layout_ci.sType =
7575VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007576 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007577 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007578 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007579
7580 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007581 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7582&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007583 ASSERT_VK_SUCCESS(err);
7584
7585 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007586 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7587VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007588 ASSERT_VK_SUCCESS(err);
7589
7590 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007591 pipeline_layout_ci.sType =
7592VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007593 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007594 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007595 pipeline_layout_ci.pSetLayouts = &ds_layout;
7596
7597 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007598 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7599&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007600 ASSERT_VK_SUCCESS(err);
7601
7602 VkPipelineShaderStageCreateInfo shaderStages[3];
7603 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7604
Karl Schultz6addd812016-02-02 17:17:23 -07007605 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7606this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007607 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007608 VkShaderObj
7609tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7610this);
7611 VkShaderObj
7612te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7613this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007614
Karl Schultz6addd812016-02-02 17:17:23 -07007615 shaderStages[0].sType =
7616VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007617 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007618 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007619 shaderStages[1].sType =
7620VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007621 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007622 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007623 shaderStages[2].sType =
7624VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007625 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007626 shaderStages[2].shader = te.handle();
7627
7628 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007629 iaCI.sType =
7630VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007631 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007632
7633 VkPipelineTessellationStateCreateInfo tsCI = {};
7634 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7635 tsCI.patchControlPoints = 0; // This will cause an error
7636
7637 VkGraphicsPipelineCreateInfo gp_ci = {};
7638 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7639 gp_ci.pNext = NULL;
7640 gp_ci.stageCount = 3;
7641 gp_ci.pStages = shaderStages;
7642 gp_ci.pVertexInputState = NULL;
7643 gp_ci.pInputAssemblyState = &iaCI;
7644 gp_ci.pTessellationState = &tsCI;
7645 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007646 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007647 gp_ci.pMultisampleState = NULL;
7648 gp_ci.pDepthStencilState = NULL;
7649 gp_ci.pColorBlendState = NULL;
7650 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7651 gp_ci.layout = pipeline_layout;
7652 gp_ci.renderPass = renderPass();
7653
7654 VkPipelineCacheCreateInfo pc_ci = {};
7655 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7656 pc_ci.pNext = NULL;
7657 pc_ci.initialSize = 0;
7658 pc_ci.initialData = 0;
7659 pc_ci.maxSize = 0;
7660
7661 VkPipeline pipeline;
7662 VkPipelineCache pipelineCache;
7663
Karl Schultz6addd812016-02-02 17:17:23 -07007664 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7665&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007666 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007667 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7668&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007669
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007670 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007671
Chia-I Wuf7458c52015-10-26 21:10:41 +08007672 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7673 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7674 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7675 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007676}
7677*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007678
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007679TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007680 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007681
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007682 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007683
Tony Barbour1fa09702017-03-16 12:09:08 -06007684 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007685 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007686
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007687 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007688 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7689 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007690
7691 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007692 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7693 ds_pool_ci.maxSets = 1;
7694 ds_pool_ci.poolSizeCount = 1;
7695 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007696
7697 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007698 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007699 ASSERT_VK_SUCCESS(err);
7700
7701 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007702 dsl_binding.binding = 0;
7703 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7704 dsl_binding.descriptorCount = 1;
7705 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007706
7707 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007708 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7709 ds_layout_ci.bindingCount = 1;
7710 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007711
7712 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007713 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007714 ASSERT_VK_SUCCESS(err);
7715
7716 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007717 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007718 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007719 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007720 alloc_info.descriptorPool = ds_pool;
7721 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007722 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007723 ASSERT_VK_SUCCESS(err);
7724
7725 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007726 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7727 pipeline_layout_ci.setLayoutCount = 1;
7728 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007729
7730 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007731 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007732 ASSERT_VK_SUCCESS(err);
7733
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007734 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007735 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007736 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007737 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007738 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007739 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007740
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007741 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7742 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7743 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7744 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7745 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7746 rs_state_ci.depthClampEnable = VK_FALSE;
7747 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7748 rs_state_ci.depthBiasEnable = VK_FALSE;
7749
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007750 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7751 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7752 vi_ci.pNext = nullptr;
7753 vi_ci.vertexBindingDescriptionCount = 0;
7754 vi_ci.pVertexBindingDescriptions = nullptr;
7755 vi_ci.vertexAttributeDescriptionCount = 0;
7756 vi_ci.pVertexAttributeDescriptions = nullptr;
7757
7758 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7759 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7760 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7761
7762 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7763 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7764 pipe_ms_state_ci.pNext = NULL;
7765 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7766 pipe_ms_state_ci.sampleShadingEnable = 0;
7767 pipe_ms_state_ci.minSampleShading = 1.0;
7768 pipe_ms_state_ci.pSampleMask = NULL;
7769
Cody Northropeb3a6c12015-10-05 14:44:45 -06007770 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007771 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007772
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007773 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007774 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08007775 shaderStages[0] = vs.GetStageCreateInfo();
7776 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007777
7778 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007779 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7780 gp_ci.stageCount = 2;
7781 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007782 gp_ci.pVertexInputState = &vi_ci;
7783 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007784 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007785 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007786 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007787 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7788 gp_ci.layout = pipeline_layout;
7789 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007790
7791 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007792 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007793
7794 VkPipeline pipeline;
7795 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007796 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007797 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007798
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007799 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007800 printf(" MultiViewport feature is disabled -- skipping enabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007801
7802 // Check case where multiViewport is disabled and viewport count is not 1
7803 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7804 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
7805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
7806 vp_state_ci.scissorCount = 0;
7807 vp_state_ci.viewportCount = 0;
7808 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7809 m_errorMonitor->VerifyFound();
7810 } else {
7811 if (m_device->props.limits.maxViewports == 1) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007812 printf(" Device limit maxViewports is 1, skipping tests that require higher limits.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007813 } else {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007814 printf(" MultiViewport feature is enabled -- skipping disabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007815
7816 // Check is that viewportcount and scissorcount match
7817 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
7818 vp_state_ci.scissorCount = 1;
7819 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
7820 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7821 m_errorMonitor->VerifyFound();
7822
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007823 // Check case where multiViewport is enabled and viewport count is greater than max
7824 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7825 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
7826 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
7827 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
7828 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
7829 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7830 m_errorMonitor->VerifyFound();
7831 }
7832 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06007833
Chia-I Wuf7458c52015-10-26 21:10:41 +08007834 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7835 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7836 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7837 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007838}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007839
7840// Don't set viewport state in PSO. This is an error b/c we always need this state for the counts even if the data is going to be
7841// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07007842TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07007843 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007844
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007845 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
7846
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007848
Tony Barbour1fa09702017-03-16 12:09:08 -06007849 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007850 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007851
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007852 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007853 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7854 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007855
7856 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007857 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7858 ds_pool_ci.maxSets = 1;
7859 ds_pool_ci.poolSizeCount = 1;
7860 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007861
7862 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007863 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007864 ASSERT_VK_SUCCESS(err);
7865
7866 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007867 dsl_binding.binding = 0;
7868 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7869 dsl_binding.descriptorCount = 1;
7870 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007871
7872 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007873 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7874 ds_layout_ci.bindingCount = 1;
7875 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007876
7877 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007878 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007879 ASSERT_VK_SUCCESS(err);
7880
7881 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007882 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007883 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007884 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007885 alloc_info.descriptorPool = ds_pool;
7886 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007887 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007888 ASSERT_VK_SUCCESS(err);
7889
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007890 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7891 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7892 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7893
7894 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7895 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7896 vi_ci.pNext = nullptr;
7897 vi_ci.vertexBindingDescriptionCount = 0;
7898 vi_ci.pVertexBindingDescriptions = nullptr;
7899 vi_ci.vertexAttributeDescriptionCount = 0;
7900 vi_ci.pVertexAttributeDescriptions = nullptr;
7901
7902 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7903 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7904 pipe_ms_state_ci.pNext = NULL;
7905 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
7906 pipe_ms_state_ci.sampleShadingEnable = 0;
7907 pipe_ms_state_ci.minSampleShading = 1.0;
7908 pipe_ms_state_ci.pSampleMask = NULL;
7909
Tobin Ehlise68360f2015-10-01 11:15:13 -06007910 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007911 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7912 pipeline_layout_ci.setLayoutCount = 1;
7913 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007914
7915 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007916 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007917 ASSERT_VK_SUCCESS(err);
7918
7919 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7920 // Set scissor as dynamic to avoid second error
7921 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007922 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7923 dyn_state_ci.dynamicStateCount = 1;
7924 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007925
Cody Northropeb3a6c12015-10-05 14:44:45 -06007926 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007927 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007928
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007929 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007930 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7931 // We shouldn't need a fragment shader but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08007932 shaderStages[0] = vs.GetStageCreateInfo();
7933 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007934
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007935 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7936 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7937 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7938 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7939 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7940 rs_state_ci.depthClampEnable = VK_FALSE;
7941 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7942 rs_state_ci.depthBiasEnable = VK_FALSE;
7943
Tobin Ehlise68360f2015-10-01 11:15:13 -06007944 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007945 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7946 gp_ci.stageCount = 2;
7947 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007948 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007949 // Not setting VP state w/o dynamic vp state should cause validation error
7950 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007951 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007952 gp_ci.pVertexInputState = &vi_ci;
7953 gp_ci.pInputAssemblyState = &ia_ci;
7954 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007955 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7956 gp_ci.layout = pipeline_layout;
7957 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007958
7959 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007960 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007961
7962 VkPipeline pipeline;
7963 VkPipelineCache pipelineCache;
7964
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007965 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007966 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007967 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007968
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007969 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007970
Chia-I Wuf7458c52015-10-26 21:10:41 +08007971 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7972 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7973 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7974 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007975}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007976
7977// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
7978// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07007979TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
7980 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007981
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007982 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007983
Tony Barbour1fa09702017-03-16 12:09:08 -06007984 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007985
7986 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007987 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007988 return;
7989 }
7990
Tobin Ehlise68360f2015-10-01 11:15:13 -06007991 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007992
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007993 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007994 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7995 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007996
7997 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007998 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7999 ds_pool_ci.maxSets = 1;
8000 ds_pool_ci.poolSizeCount = 1;
8001 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008002
8003 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008004 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008005 ASSERT_VK_SUCCESS(err);
8006
8007 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008008 dsl_binding.binding = 0;
8009 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8010 dsl_binding.descriptorCount = 1;
8011 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008012
8013 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008014 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8015 ds_layout_ci.bindingCount = 1;
8016 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008017
8018 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008019 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008020 ASSERT_VK_SUCCESS(err);
8021
8022 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008023 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008024 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008025 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008026 alloc_info.descriptorPool = ds_pool;
8027 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008028 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008029 ASSERT_VK_SUCCESS(err);
8030
8031 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008032 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8033 pipeline_layout_ci.setLayoutCount = 1;
8034 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008035
8036 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008037 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008038 ASSERT_VK_SUCCESS(err);
8039
8040 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008041 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8042 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008043 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008044 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008045 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008046
8047 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8048 // Set scissor as dynamic to avoid that error
8049 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008050 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8051 dyn_state_ci.dynamicStateCount = 1;
8052 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008053
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008054 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8055 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8056 pipe_ms_state_ci.pNext = NULL;
8057 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8058 pipe_ms_state_ci.sampleShadingEnable = 0;
8059 pipe_ms_state_ci.minSampleShading = 1.0;
8060 pipe_ms_state_ci.pSampleMask = NULL;
8061
Cody Northropeb3a6c12015-10-05 14:44:45 -06008062 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008063 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008064
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008065 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008066 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8067 // We shouldn't need a fragment shader but add it to be able to run on more devices
Chia-I Wu28e06912015-10-31 00:31:16 +08008068 shaderStages[0] = vs.GetStageCreateInfo();
8069 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008070
Cody Northropf6622dc2015-10-06 10:33:21 -06008071 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8072 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8073 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008074 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008075 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008076 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008077 vi_ci.pVertexAttributeDescriptions = nullptr;
8078
8079 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8080 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8081 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8082
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008083 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008084 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008085 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06008086 rs_ci.pNext = nullptr;
8087
Mark Youngc89c6312016-03-31 16:03:20 -06008088 VkPipelineColorBlendAttachmentState att = {};
8089 att.blendEnable = VK_FALSE;
8090 att.colorWriteMask = 0xf;
8091
Cody Northropf6622dc2015-10-06 10:33:21 -06008092 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8093 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8094 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008095 cb_ci.attachmentCount = 1;
8096 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008097
Tobin Ehlise68360f2015-10-01 11:15:13 -06008098 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008099 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8100 gp_ci.stageCount = 2;
8101 gp_ci.pStages = shaderStages;
8102 gp_ci.pVertexInputState = &vi_ci;
8103 gp_ci.pInputAssemblyState = &ia_ci;
8104 gp_ci.pViewportState = &vp_state_ci;
8105 gp_ci.pRasterizationState = &rs_ci;
8106 gp_ci.pColorBlendState = &cb_ci;
8107 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008108 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008109 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8110 gp_ci.layout = pipeline_layout;
8111 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008112
8113 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008114 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008115
8116 VkPipeline pipeline;
8117 VkPipelineCache pipelineCache;
8118
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008119 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008120 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008121 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008122
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008123 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008124
Tobin Ehlisd332f282015-10-02 11:00:56 -06008125 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008126 // First need to successfully create the PSO from above by setting
8127 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06008128 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic scissor(s) 0 are used by pipeline state object, ");
Karl Schultz6addd812016-02-02 17:17:23 -07008129
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008130 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008131 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008132 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008133 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008134 m_commandBuffer->BeginCommandBuffer();
8135 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008136 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008137 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07008138 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008139 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07008140 Draw(1, 0, 0, 0);
8141
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008142 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008143
8144 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8145 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8146 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8147 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008148 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008149}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008150
8151// Create PSO w/o non-zero scissorCount but no scissor data, then run second test where dynamic viewportCount doesn't match PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008152// viewportCount
8153TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8154 VkResult err;
8155
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008156 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07008157
Tony Barbour1fa09702017-03-16 12:09:08 -06008158 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008159
8160 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008161 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008162 return;
8163 }
8164
Karl Schultz6addd812016-02-02 17:17:23 -07008165 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8166
8167 VkDescriptorPoolSize ds_type_count = {};
8168 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8169 ds_type_count.descriptorCount = 1;
8170
8171 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8172 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8173 ds_pool_ci.maxSets = 1;
8174 ds_pool_ci.poolSizeCount = 1;
8175 ds_pool_ci.pPoolSizes = &ds_type_count;
8176
8177 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008178 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07008179 ASSERT_VK_SUCCESS(err);
8180
8181 VkDescriptorSetLayoutBinding dsl_binding = {};
8182 dsl_binding.binding = 0;
8183 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8184 dsl_binding.descriptorCount = 1;
8185 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8186
8187 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8188 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8189 ds_layout_ci.bindingCount = 1;
8190 ds_layout_ci.pBindings = &dsl_binding;
8191
8192 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008193 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008194 ASSERT_VK_SUCCESS(err);
8195
8196 VkDescriptorSet descriptorSet;
8197 VkDescriptorSetAllocateInfo alloc_info = {};
8198 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8199 alloc_info.descriptorSetCount = 1;
8200 alloc_info.descriptorPool = ds_pool;
8201 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008202 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07008203 ASSERT_VK_SUCCESS(err);
8204
8205 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8206 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8207 pipeline_layout_ci.setLayoutCount = 1;
8208 pipeline_layout_ci.pSetLayouts = &ds_layout;
8209
8210 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008211 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008212 ASSERT_VK_SUCCESS(err);
8213
8214 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8215 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8216 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008217 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008218 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008219 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008220
8221 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8222 // Set scissor as dynamic to avoid that error
8223 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8224 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8225 dyn_state_ci.dynamicStateCount = 1;
8226 dyn_state_ci.pDynamicStates = &vp_state;
8227
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008228 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8229 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8230 pipe_ms_state_ci.pNext = NULL;
8231 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8232 pipe_ms_state_ci.sampleShadingEnable = 0;
8233 pipe_ms_state_ci.minSampleShading = 1.0;
8234 pipe_ms_state_ci.pSampleMask = NULL;
8235
Karl Schultz6addd812016-02-02 17:17:23 -07008236 VkPipelineShaderStageCreateInfo shaderStages[2];
8237 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8238
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008239 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008240 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8241 // We shouldn't need a fragment shader but add it to be able to run on more devices
Karl Schultz6addd812016-02-02 17:17:23 -07008242 shaderStages[0] = vs.GetStageCreateInfo();
8243 shaderStages[1] = fs.GetStageCreateInfo();
8244
8245 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8246 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8247 vi_ci.pNext = nullptr;
8248 vi_ci.vertexBindingDescriptionCount = 0;
8249 vi_ci.pVertexBindingDescriptions = nullptr;
8250 vi_ci.vertexAttributeDescriptionCount = 0;
8251 vi_ci.pVertexAttributeDescriptions = nullptr;
8252
8253 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8254 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8255 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8256
8257 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8258 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008259 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07008260 rs_ci.pNext = nullptr;
8261
Mark Youngc89c6312016-03-31 16:03:20 -06008262 VkPipelineColorBlendAttachmentState att = {};
8263 att.blendEnable = VK_FALSE;
8264 att.colorWriteMask = 0xf;
8265
Karl Schultz6addd812016-02-02 17:17:23 -07008266 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8267 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8268 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008269 cb_ci.attachmentCount = 1;
8270 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008271
8272 VkGraphicsPipelineCreateInfo gp_ci = {};
8273 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8274 gp_ci.stageCount = 2;
8275 gp_ci.pStages = shaderStages;
8276 gp_ci.pVertexInputState = &vi_ci;
8277 gp_ci.pInputAssemblyState = &ia_ci;
8278 gp_ci.pViewportState = &vp_state_ci;
8279 gp_ci.pRasterizationState = &rs_ci;
8280 gp_ci.pColorBlendState = &cb_ci;
8281 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008282 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008283 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8284 gp_ci.layout = pipeline_layout;
8285 gp_ci.renderPass = renderPass();
8286
8287 VkPipelineCacheCreateInfo pc_ci = {};
8288 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8289
8290 VkPipeline pipeline;
8291 VkPipelineCache pipelineCache;
8292
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008293 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07008294 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008295 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008296
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008297 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008298
8299 // Now hit second fail case where we set scissor w/ different count than PSO
8300 // First need to successfully create the PSO from above by setting
8301 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008302 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8303 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008304
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008305 VkRect2D sc = {}; // Just need dummy vp to point to
Tobin Ehlisd332f282015-10-02 11:00:56 -06008306 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008307 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008308 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008309 m_commandBuffer->BeginCommandBuffer();
8310 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008311 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008312 VkViewport viewports[1] = {};
8313 viewports[0].width = 8;
8314 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06008315 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008316 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008317 Draw(1, 0, 0, 0);
8318
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008319 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008320
Chia-I Wuf7458c52015-10-26 21:10:41 +08008321 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8322 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8323 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8324 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008325 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008326}
8327
Mark Young7394fdd2016-03-31 14:56:43 -06008328TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8329 VkResult err;
8330
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008331 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008332
Tony Barbour1fa09702017-03-16 12:09:08 -06008333 ASSERT_NO_FATAL_FAILURE(Init());
Mark Young7394fdd2016-03-31 14:56:43 -06008334 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8335
8336 VkDescriptorPoolSize ds_type_count = {};
8337 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8338 ds_type_count.descriptorCount = 1;
8339
8340 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8341 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8342 ds_pool_ci.maxSets = 1;
8343 ds_pool_ci.poolSizeCount = 1;
8344 ds_pool_ci.pPoolSizes = &ds_type_count;
8345
8346 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008347 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06008348 ASSERT_VK_SUCCESS(err);
8349
8350 VkDescriptorSetLayoutBinding dsl_binding = {};
8351 dsl_binding.binding = 0;
8352 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8353 dsl_binding.descriptorCount = 1;
8354 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8355
8356 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8357 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8358 ds_layout_ci.bindingCount = 1;
8359 ds_layout_ci.pBindings = &dsl_binding;
8360
8361 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008362 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008363 ASSERT_VK_SUCCESS(err);
8364
8365 VkDescriptorSet descriptorSet;
8366 VkDescriptorSetAllocateInfo alloc_info = {};
8367 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8368 alloc_info.descriptorSetCount = 1;
8369 alloc_info.descriptorPool = ds_pool;
8370 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008371 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06008372 ASSERT_VK_SUCCESS(err);
8373
8374 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8375 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8376 pipeline_layout_ci.setLayoutCount = 1;
8377 pipeline_layout_ci.pSetLayouts = &ds_layout;
8378
8379 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008380 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008381 ASSERT_VK_SUCCESS(err);
8382
8383 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8384 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8385 vp_state_ci.scissorCount = 1;
8386 vp_state_ci.pScissors = NULL;
8387 vp_state_ci.viewportCount = 1;
8388 vp_state_ci.pViewports = NULL;
8389
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008390 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06008391 // Set scissor as dynamic to avoid that error
8392 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8393 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8394 dyn_state_ci.dynamicStateCount = 2;
8395 dyn_state_ci.pDynamicStates = dynamic_states;
8396
8397 VkPipelineShaderStageCreateInfo shaderStages[2];
8398 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8399
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008400 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8401 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008402 this); // TODO - We shouldn't need a fragment shader
8403 // but add it to be able to run on more devices
Mark Young7394fdd2016-03-31 14:56:43 -06008404 shaderStages[0] = vs.GetStageCreateInfo();
8405 shaderStages[1] = fs.GetStageCreateInfo();
8406
8407 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8408 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8409 vi_ci.pNext = nullptr;
8410 vi_ci.vertexBindingDescriptionCount = 0;
8411 vi_ci.pVertexBindingDescriptions = nullptr;
8412 vi_ci.vertexAttributeDescriptionCount = 0;
8413 vi_ci.pVertexAttributeDescriptions = nullptr;
8414
8415 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8416 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8417 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8418
8419 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8420 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8421 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07008422 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06008423
Mark Young47107952016-05-02 15:59:55 -06008424 // Check too low (line width of -1.0f).
8425 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008426
8427 VkPipelineColorBlendAttachmentState att = {};
8428 att.blendEnable = VK_FALSE;
8429 att.colorWriteMask = 0xf;
8430
8431 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8432 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8433 cb_ci.pNext = nullptr;
8434 cb_ci.attachmentCount = 1;
8435 cb_ci.pAttachments = &att;
8436
8437 VkGraphicsPipelineCreateInfo gp_ci = {};
8438 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8439 gp_ci.stageCount = 2;
8440 gp_ci.pStages = shaderStages;
8441 gp_ci.pVertexInputState = &vi_ci;
8442 gp_ci.pInputAssemblyState = &ia_ci;
8443 gp_ci.pViewportState = &vp_state_ci;
8444 gp_ci.pRasterizationState = &rs_ci;
8445 gp_ci.pColorBlendState = &cb_ci;
8446 gp_ci.pDynamicState = &dyn_state_ci;
8447 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8448 gp_ci.layout = pipeline_layout;
8449 gp_ci.renderPass = renderPass();
8450
8451 VkPipelineCacheCreateInfo pc_ci = {};
8452 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8453
8454 VkPipeline pipeline;
8455 VkPipelineCache pipelineCache;
8456
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008457 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008458 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008459 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008460
8461 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008462 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008463
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008464 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008465
8466 // Check too high (line width of 65536.0f).
8467 rs_ci.lineWidth = 65536.0f;
8468
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008469 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008470 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008471 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008472
8473 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008474 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008475
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008476 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008477
8478 dyn_state_ci.dynamicStateCount = 3;
8479
8480 rs_ci.lineWidth = 1.0f;
8481
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008482 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008483 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008484 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07008485 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008486 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008487
8488 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008489 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008490 m_errorMonitor->VerifyFound();
8491
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008492 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008493
8494 // Check too high with dynamic setting.
8495 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8496 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07008497 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06008498
8499 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8500 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8501 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8502 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008503 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008504}
8505
Karl Schultz6addd812016-02-02 17:17:23 -07008506TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008507 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008508 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07008509 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008510
Tony Barbour1fa09702017-03-16 12:09:08 -06008511 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008512 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008513
Tony Barbour552f6c02016-12-21 14:34:07 -07008514 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008515 // Don't care about RenderPass handle b/c error should be flagged before
8516 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008517 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008518
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008519 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008520}
8521
Karl Schultz6addd812016-02-02 17:17:23 -07008522TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008523 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008524 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8525 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008526
Tony Barbour1fa09702017-03-16 12:09:08 -06008527 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008528 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008529
Tony Barbour552f6c02016-12-21 14:34:07 -07008530 m_commandBuffer->BeginCommandBuffer();
8531 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07008532 // Just create a dummy Renderpass that's non-NULL so we can get to the
8533 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008534 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008535
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008536 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008537}
8538
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008539TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008540 TEST_DESCRIPTION(
8541 "Begin a renderPass where clearValueCount is less than"
8542 "the number of renderPass attachments that use loadOp"
8543 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008544
Tony Barbour1fa09702017-03-16 12:09:08 -06008545 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008546 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8547
8548 // Create a renderPass with a single attachment that uses loadOp CLEAR
8549 VkAttachmentReference attach = {};
8550 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8551 VkSubpassDescription subpass = {};
8552 subpass.inputAttachmentCount = 1;
8553 subpass.pInputAttachments = &attach;
8554 VkRenderPassCreateInfo rpci = {};
8555 rpci.subpassCount = 1;
8556 rpci.pSubpasses = &subpass;
8557 rpci.attachmentCount = 1;
8558 VkAttachmentDescription attach_desc = {};
Rene Lindsay4bf0e4c2017-01-31 14:20:34 -07008559 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008560 // Set loadOp to CLEAR
8561 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8562 rpci.pAttachments = &attach_desc;
8563 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8564 VkRenderPass rp;
8565 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8566
8567 VkCommandBufferInheritanceInfo hinfo = {};
8568 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
8569 hinfo.renderPass = VK_NULL_HANDLE;
8570 hinfo.subpass = 0;
8571 hinfo.framebuffer = VK_NULL_HANDLE;
8572 hinfo.occlusionQueryEnable = VK_FALSE;
8573 hinfo.queryFlags = 0;
8574 hinfo.pipelineStatistics = 0;
8575 VkCommandBufferBeginInfo info = {};
8576 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8577 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8578 info.pInheritanceInfo = &hinfo;
8579
8580 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8581 VkRenderPassBeginInfo rp_begin = {};
8582 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8583 rp_begin.pNext = NULL;
8584 rp_begin.renderPass = renderPass();
8585 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008586 rp_begin.clearValueCount = 0; // Should be 1
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008587
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07008588 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008589
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008590 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008591
8592 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06008593
8594 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008595}
8596
Slawomir Cygan0808f392016-11-28 17:53:23 +01008597TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008598 TEST_DESCRIPTION(
8599 "Begin a renderPass where clearValueCount is greater than"
8600 "the number of renderPass attachments that use loadOp"
8601 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008602
Tony Barbour1fa09702017-03-16 12:09:08 -06008603 ASSERT_NO_FATAL_FAILURE(Init());
Slawomir Cygan0808f392016-11-28 17:53:23 +01008604 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8605
8606 // Create a renderPass with a single attachment that uses loadOp CLEAR
8607 VkAttachmentReference attach = {};
8608 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8609 VkSubpassDescription subpass = {};
8610 subpass.inputAttachmentCount = 1;
8611 subpass.pInputAttachments = &attach;
8612 VkRenderPassCreateInfo rpci = {};
8613 rpci.subpassCount = 1;
8614 rpci.pSubpasses = &subpass;
8615 rpci.attachmentCount = 1;
8616 VkAttachmentDescription attach_desc = {};
8617 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
8618 // Set loadOp to CLEAR
8619 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8620 rpci.pAttachments = &attach_desc;
8621 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8622 VkRenderPass rp;
8623 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8624
8625 VkCommandBufferBeginInfo info = {};
8626 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8627 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8628
8629 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8630 VkRenderPassBeginInfo rp_begin = {};
8631 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8632 rp_begin.pNext = NULL;
8633 rp_begin.renderPass = renderPass();
8634 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008635 rp_begin.clearValueCount = 2; // Should be 1
Slawomir Cygan0808f392016-11-28 17:53:23 +01008636
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008637 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
8638 " has a clearValueCount of"
8639 " 2 but only first 1 entries in pClearValues array are used");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008640
8641 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
8642
8643 m_errorMonitor->VerifyFound();
8644
8645 vkDestroyRenderPass(m_device->device(), rp, NULL);
8646}
8647
Cody Northrop3bb4d962016-05-09 16:15:57 -06008648TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
Cody Northrop3bb4d962016-05-09 16:15:57 -06008649 TEST_DESCRIPTION("End a command buffer with an active render pass");
8650
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008651 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8652 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06008653
Tony Barbour1fa09702017-03-16 12:09:08 -06008654 ASSERT_NO_FATAL_FAILURE(Init());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008655 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8656
Tony Barbour552f6c02016-12-21 14:34:07 -07008657 m_commandBuffer->BeginCommandBuffer();
8658 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8659 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008660
8661 m_errorMonitor->VerifyFound();
8662
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008663 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
8664 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06008665}
8666
Karl Schultz6addd812016-02-02 17:17:23 -07008667TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008668 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008669 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8670 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008671
Tony Barbour1fa09702017-03-16 12:09:08 -06008672 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008673 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008674
Tony Barbour552f6c02016-12-21 14:34:07 -07008675 m_commandBuffer->BeginCommandBuffer();
8676 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008677
8678 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008679 vk_testing::Buffer dstBuffer;
8680 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008681
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008682 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008683
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008684 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008685}
8686
Karl Schultz6addd812016-02-02 17:17:23 -07008687TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008688 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008689 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8690 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008691
Tony Barbour1fa09702017-03-16 12:09:08 -06008692 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008693 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008694
Tony Barbour552f6c02016-12-21 14:34:07 -07008695 m_commandBuffer->BeginCommandBuffer();
8696 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008697
8698 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008699 vk_testing::Buffer dstBuffer;
8700 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008701
Karl Schultz6addd812016-02-02 17:17:23 -07008702 VkDeviceSize dstOffset = 0;
Rene Lindsay32d26902017-02-02 16:49:24 -07008703 uint32_t Data[] = {1, 2, 3, 4, 5, 6, 7, 8};
8704 VkDeviceSize dataSize = sizeof(Data) / sizeof(uint32_t);
8705 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, &Data);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008706
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008707 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008708}
8709
Karl Schultz6addd812016-02-02 17:17:23 -07008710TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008711 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008712 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8713 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008714
Tony Barbour1fa09702017-03-16 12:09:08 -06008715 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008716 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008717
Tony Barbour552f6c02016-12-21 14:34:07 -07008718 m_commandBuffer->BeginCommandBuffer();
8719 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008720
Michael Lentine0a369f62016-02-03 16:51:46 -06008721 VkClearColorValue clear_color;
8722 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07008723 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8724 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8725 const int32_t tex_width = 32;
8726 const int32_t tex_height = 32;
8727 VkImageCreateInfo image_create_info = {};
8728 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8729 image_create_info.pNext = NULL;
8730 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8731 image_create_info.format = tex_format;
8732 image_create_info.extent.width = tex_width;
8733 image_create_info.extent.height = tex_height;
8734 image_create_info.extent.depth = 1;
8735 image_create_info.mipLevels = 1;
8736 image_create_info.arrayLayers = 1;
8737 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8738 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
Jeremy Hayesa3d5c7b2017-03-07 16:01:52 -07008739 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008740
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008741 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008742 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008743
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008744 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008745
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008746 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008747
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008748 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008749}
8750
Karl Schultz6addd812016-02-02 17:17:23 -07008751TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008752 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008753 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8754 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008755
Tony Barbour1fa09702017-03-16 12:09:08 -06008756 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008757 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008758
Tony Barbourf887b162017-03-09 10:06:46 -07008759 auto depth_format = find_depth_stencil_format(m_device);
8760 if (!depth_format) {
8761 printf(" No Depth + Stencil format found. Skipped.\n");
8762 return;
8763 }
8764
Tony Barbour552f6c02016-12-21 14:34:07 -07008765 m_commandBuffer->BeginCommandBuffer();
8766 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008767
8768 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07008769 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008770 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
8771 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -07008772 image_create_info.format = depth_format;
Karl Schultz6addd812016-02-02 17:17:23 -07008773 image_create_info.extent.width = 64;
8774 image_create_info.extent.height = 64;
8775 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8776 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008777
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008778 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008779 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008780
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008781 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008782
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008783 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
8784 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008785
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008786 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008787}
8788
Karl Schultz6addd812016-02-02 17:17:23 -07008789TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008790 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008791 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008792
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008793 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8794 "vkCmdClearAttachments(): This call "
8795 "must be issued inside an active "
8796 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008797
Tony Barbour1fa09702017-03-16 12:09:08 -06008798 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008799 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008800
8801 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008802 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008803 ASSERT_VK_SUCCESS(err);
8804
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008805 VkClearAttachment color_attachment;
8806 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8807 color_attachment.clearValue.color.float32[0] = 0;
8808 color_attachment.clearValue.color.float32[1] = 0;
8809 color_attachment.clearValue.color.float32[2] = 0;
8810 color_attachment.clearValue.color.float32[3] = 0;
8811 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008812 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008813 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008814
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008815 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008816}
8817
Chris Forbes3b97e932016-09-07 11:29:24 +12008818TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008819 TEST_DESCRIPTION(
8820 "Test that an error is produced when CmdNextSubpass is "
8821 "called too many times in a renderpass instance");
Chris Forbes3b97e932016-09-07 11:29:24 +12008822
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008823 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8824 "vkCmdNextSubpass(): Attempted to advance "
8825 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12008826
Tony Barbour1fa09702017-03-16 12:09:08 -06008827 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3b97e932016-09-07 11:29:24 +12008828 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8829
Tony Barbour552f6c02016-12-21 14:34:07 -07008830 m_commandBuffer->BeginCommandBuffer();
8831 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12008832
8833 // error here.
8834 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
8835 m_errorMonitor->VerifyFound();
8836
Tony Barbour552f6c02016-12-21 14:34:07 -07008837 m_commandBuffer->EndRenderPass();
8838 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12008839}
8840
Chris Forbes6d624702016-09-07 13:57:05 +12008841TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008842 TEST_DESCRIPTION(
8843 "Test that an error is produced when CmdEndRenderPass is "
8844 "called before the final subpass has been reached");
Chris Forbes6d624702016-09-07 13:57:05 +12008845
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8847 "vkCmdEndRenderPass(): Called before reaching "
8848 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12008849
Tony Barbour1fa09702017-03-16 12:09:08 -06008850 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008851 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
8852 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12008853
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008854 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12008855
8856 VkRenderPass rp;
8857 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
8858 ASSERT_VK_SUCCESS(err);
8859
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008860 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12008861
8862 VkFramebuffer fb;
8863 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
8864 ASSERT_VK_SUCCESS(err);
8865
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008866 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12008867
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008868 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {16, 16}}, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12008869
8870 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
8871
8872 // Error here.
8873 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8874 m_errorMonitor->VerifyFound();
8875
8876 // Clean up.
8877 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
8878 vkDestroyRenderPass(m_device->device(), rp, nullptr);
8879}
8880
Karl Schultz9e66a292016-04-21 15:57:51 -06008881TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
8882 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8884 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06008885
Tony Barbour1fa09702017-03-16 12:09:08 -06008886 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour552f6c02016-12-21 14:34:07 -07008887 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06008888
8889 VkBufferMemoryBarrier buf_barrier = {};
8890 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8891 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8892 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8893 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8894 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8895 buf_barrier.buffer = VK_NULL_HANDLE;
8896 buf_barrier.offset = 0;
8897 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008898 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8899 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06008900
8901 m_errorMonitor->VerifyFound();
8902}
8903
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008904TEST_F(VkLayerTest, InvalidBarriers) {
8905 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
8906
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008907 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008908
Tony Barbour1fa09702017-03-16 12:09:08 -06008909 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -07008910 auto depth_format = find_depth_stencil_format(m_device);
8911 if (!depth_format) {
8912 printf(" No Depth + Stencil format found. Skipped.\n");
8913 return;
8914 }
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008915 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8916
8917 VkMemoryBarrier mem_barrier = {};
8918 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
8919 mem_barrier.pNext = NULL;
8920 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8921 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07008922 m_commandBuffer->BeginCommandBuffer();
8923 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008924 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008925 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008926 &mem_barrier, 0, nullptr, 0, nullptr);
8927 m_errorMonitor->VerifyFound();
8928
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008930 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008931 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008932 ASSERT_TRUE(image.initialized());
8933 VkImageMemoryBarrier img_barrier = {};
8934 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8935 img_barrier.pNext = NULL;
8936 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8937 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8938 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8939 // New layout can't be UNDEFINED
8940 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8941 img_barrier.image = image.handle();
8942 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8943 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8944 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8945 img_barrier.subresourceRange.baseArrayLayer = 0;
8946 img_barrier.subresourceRange.baseMipLevel = 0;
8947 img_barrier.subresourceRange.layerCount = 1;
8948 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008949 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8950 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008951 m_errorMonitor->VerifyFound();
8952 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8953
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008954 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8955 "Subresource must have the sum of the "
8956 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008957 // baseArrayLayer + layerCount must be <= image's arrayLayers
8958 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008959 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8960 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008961 m_errorMonitor->VerifyFound();
8962 img_barrier.subresourceRange.baseArrayLayer = 0;
8963
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008964 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008965 // baseMipLevel + levelCount must be <= image's mipLevels
8966 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008967 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8968 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008969 m_errorMonitor->VerifyFound();
8970 img_barrier.subresourceRange.baseMipLevel = 0;
8971
Mike Weiblen7053aa32017-01-25 15:21:10 -07008972 // levelCount must be non-zero.
8973 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
8974 img_barrier.subresourceRange.levelCount = 0;
8975 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8976 nullptr, 0, nullptr, 1, &img_barrier);
8977 m_errorMonitor->VerifyFound();
8978 img_barrier.subresourceRange.levelCount = 1;
8979
8980 // layerCount must be non-zero.
8981 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
8982 img_barrier.subresourceRange.layerCount = 0;
8983 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8984 nullptr, 0, nullptr, 1, &img_barrier);
8985 m_errorMonitor->VerifyFound();
8986 img_barrier.subresourceRange.layerCount = 1;
8987
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008988 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Buffer Barriers cannot be used during a render pass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008989 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07008990 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8991 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008992 VkBufferMemoryBarrier buf_barrier = {};
8993 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8994 buf_barrier.pNext = NULL;
8995 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8996 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8997 buf_barrier.buffer = buffer.handle();
8998 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8999 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
9000 buf_barrier.offset = 0;
9001 buf_barrier.size = VK_WHOLE_SIZE;
9002 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009003 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9004 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009005 m_errorMonitor->VerifyFound();
9006 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9007
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009008 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009009 buf_barrier.offset = 257;
9010 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009011 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9012 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009013 m_errorMonitor->VerifyFound();
9014 buf_barrier.offset = 0;
9015
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009016 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009017 buf_barrier.size = 257;
9018 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009019 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9020 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009021 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009022
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009023 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009024 m_errorMonitor->SetDesiredFailureMsg(
9025 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009026 "Depth/stencil image formats must have at least one of VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009027 VkDepthStencilObj ds_image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -07009028 ds_image.Init(m_device, 128, 128, depth_format);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009029 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06009030 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9031 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009032 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009033
9034 // Not having DEPTH or STENCIL set is an error
Rene Lindsay4834cba2017-02-02 17:18:56 -07009035 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009036 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9037 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009038 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07009039
9040 // Having anything other than DEPTH or STENCIL is an error
9041 m_errorMonitor->SetDesiredFailureMsg(
9042 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9043 "Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
9044 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
9045 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9046 nullptr, 0, nullptr, 1, &img_barrier);
9047 m_errorMonitor->VerifyFound();
9048
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009049 // Now test depth-only
9050 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009051 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
9052 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009053 VkDepthStencilObj d_image(m_device);
9054 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
9055 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009056 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009057 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009058 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009059
9060 // DEPTH bit must be set
9061 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9062 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009063 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009064 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9065 0, nullptr, 0, nullptr, 1, &img_barrier);
9066 m_errorMonitor->VerifyFound();
9067
9068 // No bits other than DEPTH may be set
9069 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9070 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
9071 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009072 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9073 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009074 m_errorMonitor->VerifyFound();
9075 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009076
9077 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009078 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
9079 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009080 VkDepthStencilObj s_image(m_device);
9081 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
9082 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009083 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009084 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009085 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06009086 // Use of COLOR aspect on depth image is error
Dave Houltonf3229d52017-02-21 15:59:08 -07009087 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9088 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis15684a02016-07-21 14:55:26 -06009089 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009090 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9091 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009092 m_errorMonitor->VerifyFound();
9093 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009094
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009095 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009096 VkImageObj c_image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009097 c_image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009098 ASSERT_TRUE(c_image.initialized());
9099 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9100 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9101 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009102
9103 // COLOR bit must be set
9104 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9105 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009106 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009107 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9108 nullptr, 0, nullptr, 1, &img_barrier);
9109 m_errorMonitor->VerifyFound();
9110
9111 // No bits other than COLOR may be set
9112 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9113 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
9114 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009115 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9116 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009117 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009118
Mike Weiblene6e01172017-03-07 22:18:40 -07009119 // A barrier's new and old VkImageLayout must be compatible with an image's VkImageUsageFlags.
9120 {
9121 VkImageObj img_color(m_device);
9122 img_color.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
9123 ASSERT_TRUE(img_color.initialized());
9124
9125 VkImageObj img_ds(m_device);
9126 img_ds.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
9127 ASSERT_TRUE(img_ds.initialized());
9128
9129 VkImageObj img_xfer_src(m_device);
9130 img_xfer_src.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
9131 ASSERT_TRUE(img_xfer_src.initialized());
9132
9133 VkImageObj img_xfer_dst(m_device);
9134 img_xfer_dst.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
9135 ASSERT_TRUE(img_xfer_dst.initialized());
9136
9137 VkImageObj img_sampled(m_device);
9138 img_sampled.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL);
9139 ASSERT_TRUE(img_sampled.initialized());
9140
9141 VkImageObj img_input(m_device);
9142 img_input.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
9143 ASSERT_TRUE(img_input.initialized());
9144
9145 const struct {
9146 VkImageObj &image_obj;
9147 VkImageLayout bad_layout;
9148 UNIQUE_VALIDATION_ERROR_CODE msg_code;
9149 } bad_buffer_layouts[] = {
9150 // clang-format off
9151 // images _without_ VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT
9152 {img_ds, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9153 {img_xfer_src, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9154 {img_xfer_dst, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9155 {img_sampled, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9156 {img_input, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00303},
9157 // images _without_ VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT
9158 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9159 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9160 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9161 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9162 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VALIDATION_ERROR_00304},
9163 {img_color, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9164 {img_xfer_src, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9165 {img_xfer_dst, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9166 {img_sampled, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9167 {img_input, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00305},
9168 // images _without_ VK_IMAGE_USAGE_SAMPLED_BIT or VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT
9169 {img_color, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9170 {img_ds, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9171 {img_xfer_src, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9172 {img_xfer_dst, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VALIDATION_ERROR_00306},
9173 // images _without_ VK_IMAGE_USAGE_TRANSFER_SRC_BIT
9174 {img_color, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9175 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9176 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9177 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9178 {img_input, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VALIDATION_ERROR_00307},
9179 // images _without_ VK_IMAGE_USAGE_TRANSFER_DST_BIT
9180 {img_color, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9181 {img_ds, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9182 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9183 {img_sampled, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9184 {img_input, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VALIDATION_ERROR_00308},
9185 // clang-format on
9186 };
9187 const uint32_t layout_count = sizeof(bad_buffer_layouts) / sizeof(bad_buffer_layouts[0]);
9188
9189 for (uint32_t i = 0; i < layout_count; ++i) {
9190 img_barrier.image = bad_buffer_layouts[i].image_obj.handle();
9191 const VkImageUsageFlags usage = bad_buffer_layouts[i].image_obj.usage();
9192 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
9193 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
9194 : VK_IMAGE_ASPECT_COLOR_BIT;
9195
9196 img_barrier.oldLayout = bad_buffer_layouts[i].bad_layout;
9197 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9198 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9199 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9200 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9201 m_errorMonitor->VerifyFound();
9202
9203 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9204 img_barrier.newLayout = bad_buffer_layouts[i].bad_layout;
9205 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_buffer_layouts[i].msg_code);
9206 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
9207 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
9208 m_errorMonitor->VerifyFound();
9209 }
9210
9211 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
9212 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9213 }
9214
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009215 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
9216
9217 // Create command pool with incompatible queueflags
9218 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mike Schuchardt06304c22017-03-01 17:09:09 -07009219 uint32_t queue_family_index = m_device->QueueFamilyWithoutCapabilities(VK_QUEUE_COMPUTE_BIT);
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009220 if (queue_family_index == UINT32_MAX) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009221 printf(" No non-compute queue found; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009222 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009223 }
9224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
9225
9226 VkCommandPool command_pool;
9227 VkCommandPoolCreateInfo pool_create_info{};
9228 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
9229 pool_create_info.queueFamilyIndex = queue_family_index;
9230 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
9231 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
9232
9233 // Allocate a command buffer
9234 VkCommandBuffer bad_command_buffer;
9235 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
9236 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
9237 command_buffer_allocate_info.commandPool = command_pool;
9238 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
9239 command_buffer_allocate_info.commandBufferCount = 1;
9240 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
9241
9242 VkCommandBufferBeginInfo cbbi = {};
9243 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9244 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
9245 buf_barrier.offset = 0;
9246 buf_barrier.size = VK_WHOLE_SIZE;
9247 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9248 &buf_barrier, 0, nullptr);
9249 m_errorMonitor->VerifyFound();
9250
9251 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
9252 vkEndCommandBuffer(bad_command_buffer);
9253 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009254 printf(" The non-compute queue does not support graphics; skipped.\n");
Mike Weiblene6e01172017-03-07 22:18:40 -07009255 return; // NOTE: this exits the test function!
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009256 }
9257 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
9258 VkEvent event;
9259 VkEventCreateInfo event_create_info{};
9260 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
9261 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
9262 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
9263 nullptr, 0, nullptr);
9264 m_errorMonitor->VerifyFound();
9265
9266 vkEndCommandBuffer(bad_command_buffer);
9267 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009268}
9269
Tony Barbour18ba25c2016-09-29 13:42:40 -06009270TEST_F(VkLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
9271 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ in srcAccessMask
9272
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009273 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "must have required access bit");
Tony Barbour1fa09702017-03-16 12:09:08 -06009274 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour18ba25c2016-09-29 13:42:40 -06009275 VkImageObj image(m_device);
Mike Weiblen62d08a32017-03-07 22:18:27 -07009276 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
9277 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour18ba25c2016-09-29 13:42:40 -06009278 ASSERT_TRUE(image.initialized());
9279
9280 VkImageMemoryBarrier barrier = {};
9281 VkImageSubresourceRange range;
9282 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9283 barrier.srcAccessMask = 0;
9284 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
9285 barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
9286 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9287 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9288 barrier.image = image.handle();
9289 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9290 range.baseMipLevel = 0;
9291 range.levelCount = 1;
9292 range.baseArrayLayer = 0;
9293 range.layerCount = 1;
9294 barrier.subresourceRange = range;
9295 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
9296 cmdbuf.BeginCommandBuffer();
9297 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9298 &barrier);
9299 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9300 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
9301 barrier.srcAccessMask = 0;
9302 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
9303 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9304 &barrier);
9305
9306 m_errorMonitor->VerifyFound();
9307}
9308
Karl Schultz6addd812016-02-02 17:17:23 -07009309TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009310 // Bind a BeginRenderPass within an active RenderPass
Tony Barbour1fa09702017-03-16 12:09:08 -06009311 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009312 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009313
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009314 uint32_t const indices[] = {0};
9315 VkBufferCreateInfo buf_info = {};
9316 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9317 buf_info.size = 1024;
9318 buf_info.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9319 buf_info.queueFamilyIndexCount = 1;
9320 buf_info.pQueueFamilyIndices = indices;
9321
9322 VkBuffer buffer;
9323 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
9324 ASSERT_VK_SUCCESS(err);
9325
9326 VkMemoryRequirements requirements;
9327 vkGetBufferMemoryRequirements(m_device->device(), buffer, &requirements);
9328
9329 VkMemoryAllocateInfo alloc_info{};
9330 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9331 alloc_info.pNext = NULL;
9332 alloc_info.memoryTypeIndex = 0;
9333 alloc_info.allocationSize = requirements.size;
9334 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
9335 ASSERT_TRUE(pass);
9336
9337 VkDeviceMemory memory;
9338 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
9339 ASSERT_VK_SUCCESS(err);
9340
9341 err = vkBindBufferMemory(m_device->device(), buffer, memory, 0);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009342 ASSERT_VK_SUCCESS(err);
9343
Tony Barbour552f6c02016-12-21 14:34:07 -07009344 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009345 ASSERT_VK_SUCCESS(err);
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009346
Karl Schultz6addd812016-02-02 17:17:23 -07009347 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9348 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009349 // Should error before calling to driver so don't care about actual data
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009350 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
9351 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), buffer, 7, VK_INDEX_TYPE_UINT16);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009352 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009353
Jeremy Hayes483d95d2017-03-08 11:03:01 -07009354 vkFreeMemory(m_device->device(), memory, NULL);
9355 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009356}
9357
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009358TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
9359 // Create an out-of-range queueFamilyIndex
Tony Barbour1fa09702017-03-16 12:09:08 -06009360 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009361 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9362 VkBufferCreateInfo buffCI = {};
9363 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9364 buffCI.size = 1024;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009365 buffCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009366 buffCI.queueFamilyIndexCount = 2;
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009367 // Introduce failure by specifying invalid queue_family_index
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009368 uint32_t qfi[2];
9369 qfi[0] = 777;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009370 qfi[1] = 0;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009371
9372 buffCI.pQueueFamilyIndices = qfi;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009373 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009374
9375 VkBuffer ib;
Jeremy Hayes8a43a0d2017-03-09 11:27:52 -07009376 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9377 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one of the indices "
9378 "specified when the device was created, via the VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009379 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009380 m_errorMonitor->VerifyFound();
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009381
9382 if (m_device->queue_props.size() > 2) {
Tony Barbour75db7402017-03-09 14:51:36 -07009383 VkBuffer ib2;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009384 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which was not created allowing concurrent");
9385
9386 // Create buffer shared to queue families 1 and 2, but submitted on queue family 0
9387 buffCI.queueFamilyIndexCount = 2;
9388 qfi[0] = 1;
9389 qfi[1] = 2;
Tony Barbour75db7402017-03-09 14:51:36 -07009390 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib2);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009391 VkDeviceMemory mem;
9392 VkMemoryRequirements mem_reqs;
Tony Barbour75db7402017-03-09 14:51:36 -07009393 vkGetBufferMemoryRequirements(m_device->device(), ib2, &mem_reqs);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009394
9395 VkMemoryAllocateInfo alloc_info = {};
9396 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9397 alloc_info.allocationSize = 1024;
9398 bool pass = false;
9399 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
9400 if (!pass) {
Tony Barbour75db7402017-03-09 14:51:36 -07009401 vkDestroyBuffer(m_device->device(), ib2, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009402 return;
9403 }
9404 vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
Tony Barbour75db7402017-03-09 14:51:36 -07009405 vkBindBufferMemory(m_device->device(), ib2, mem, 0);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009406
9407 m_commandBuffer->begin();
Tony Barbour75db7402017-03-09 14:51:36 -07009408 vkCmdFillBuffer(m_commandBuffer->handle(), ib2, 0, 16, 5);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009409 m_commandBuffer->end();
9410 QueueCommandBuffer(false);
9411 m_errorMonitor->VerifyFound();
Tony Barbour75db7402017-03-09 14:51:36 -07009412 vkDestroyBuffer(m_device->device(), ib2, NULL);
9413 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009414 }
9415
Tony Barbourdf4c0042016-06-01 15:55:43 -06009416 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009417}
9418
Karl Schultz6addd812016-02-02 17:17:23 -07009419TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009420 TEST_DESCRIPTION(
9421 "Attempt vkCmdExecuteCommands with a primary command buffer"
9422 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009423
Tony Barbour1fa09702017-03-16 12:09:08 -06009424 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009425 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009426
Chris Forbesf29a84f2016-10-06 18:39:28 +13009427 // An empty primary command buffer
9428 VkCommandBufferObj cb(m_device, m_commandPool);
9429 cb.BeginCommandBuffer();
9430 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -06009431
Chris Forbesf29a84f2016-10-06 18:39:28 +13009432 m_commandBuffer->BeginCommandBuffer();
9433 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9434 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009435
Chris Forbesf29a84f2016-10-06 18:39:28 +13009436 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
9437 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009438 m_errorMonitor->VerifyFound();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07009439
9440 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be pending execution");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009441}
9442
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009443TEST_F(VkLayerTest, DSUsageBitsErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009444 TEST_DESCRIPTION(
9445 "Attempt to update descriptor sets for images and buffers "
9446 "that do not have correct usage bits sets.");
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009447 VkResult err;
9448
Tony Barbour1fa09702017-03-16 12:09:08 -06009449 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009450 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9451 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9452 ds_type_count[i].type = VkDescriptorType(i);
9453 ds_type_count[i].descriptorCount = 1;
9454 }
9455 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9456 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9457 ds_pool_ci.pNext = NULL;
9458 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9459 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9460 ds_pool_ci.pPoolSizes = ds_type_count;
9461
9462 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009463 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009464 ASSERT_VK_SUCCESS(err);
9465
9466 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009467 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009468 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9469 dsl_binding[i].binding = 0;
9470 dsl_binding[i].descriptorType = VkDescriptorType(i);
9471 dsl_binding[i].descriptorCount = 1;
9472 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
9473 dsl_binding[i].pImmutableSamplers = NULL;
9474 }
9475
9476 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9477 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9478 ds_layout_ci.pNext = NULL;
9479 ds_layout_ci.bindingCount = 1;
9480 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
9481 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9482 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009483 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009484 ASSERT_VK_SUCCESS(err);
9485 }
9486 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9487 VkDescriptorSetAllocateInfo alloc_info = {};
9488 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9489 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9490 alloc_info.descriptorPool = ds_pool;
9491 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009492 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009493 ASSERT_VK_SUCCESS(err);
9494
9495 // Create a buffer & bufferView to be used for invalid updates
9496 VkBufferCreateInfo buff_ci = {};
9497 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Tony Barbour415497c2017-01-24 10:06:09 -07009498 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009499 buff_ci.size = 256;
9500 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tony Barbour415497c2017-01-24 10:06:09 -07009501 VkBuffer buffer, storage_texel_buffer;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009502 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9503 ASSERT_VK_SUCCESS(err);
Tony Barbour415497c2017-01-24 10:06:09 -07009504
9505 // Create another buffer to use in testing the UNIFORM_TEXEL_BUFFER case
9506 buff_ci.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
9507 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &storage_texel_buffer);
9508 ASSERT_VK_SUCCESS(err);
9509
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009510 VkMemoryRequirements mem_reqs;
9511 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
9512 VkMemoryAllocateInfo mem_alloc_info = {};
9513 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9514 mem_alloc_info.pNext = NULL;
9515 mem_alloc_info.memoryTypeIndex = 0;
9516 mem_alloc_info.allocationSize = mem_reqs.size;
9517 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9518 if (!pass) {
9519 vkDestroyBuffer(m_device->device(), buffer, NULL);
9520 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9521 return;
9522 }
9523 VkDeviceMemory mem;
9524 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
9525 ASSERT_VK_SUCCESS(err);
9526 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9527 ASSERT_VK_SUCCESS(err);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009528
9529 VkBufferViewCreateInfo buff_view_ci = {};
9530 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9531 buff_view_ci.buffer = buffer;
9532 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9533 buff_view_ci.range = VK_WHOLE_SIZE;
9534 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009535 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009536 ASSERT_VK_SUCCESS(err);
9537
Tony Barbour415497c2017-01-24 10:06:09 -07009538 // Now get resources / view for storage_texel_buffer
9539 vkGetBufferMemoryRequirements(m_device->device(), storage_texel_buffer, &mem_reqs);
9540 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9541 if (!pass) {
9542 vkDestroyBuffer(m_device->device(), buffer, NULL);
9543 vkDestroyBufferView(m_device->device(), buff_view, NULL);
9544 vkFreeMemory(m_device->device(), mem, NULL);
9545 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
9546 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9547 return;
9548 }
9549 VkDeviceMemory storage_texel_buffer_mem;
9550 VkBufferView storage_texel_buffer_view;
9551 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &storage_texel_buffer_mem);
9552 ASSERT_VK_SUCCESS(err);
9553 err = vkBindBufferMemory(m_device->device(), storage_texel_buffer, storage_texel_buffer_mem, 0);
9554 ASSERT_VK_SUCCESS(err);
9555 buff_view_ci.buffer = storage_texel_buffer;
9556 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &storage_texel_buffer_view);
9557 ASSERT_VK_SUCCESS(err);
9558
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009559 // Create an image to be used for invalid updates
Tony Barbour4b4a4222017-01-24 11:46:34 -07009560 // Find a format / tiling for COLOR_ATTACHMENT
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009561 VkImageCreateInfo image_ci = {};
Tony Barbour4b4a4222017-01-24 11:46:34 -07009562 image_ci.format = VK_FORMAT_UNDEFINED;
9563 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
9564 VkFormat format = static_cast<VkFormat>(f);
9565 VkFormatProperties fProps = m_device->format_properties(format);
9566 if (fProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9567 image_ci.format = format;
9568 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9569 break;
9570 } else if (fProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9571 image_ci.format = format;
9572 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
9573 break;
9574 }
9575 }
9576 if (image_ci.format == VK_FORMAT_UNDEFINED) {
9577 return;
9578 }
9579
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009580 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9581 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009582 image_ci.extent.width = 64;
9583 image_ci.extent.height = 64;
9584 image_ci.extent.depth = 1;
9585 image_ci.mipLevels = 1;
9586 image_ci.arrayLayers = 1;
9587 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009588 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009589 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009590 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9591 VkImage image;
9592 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9593 ASSERT_VK_SUCCESS(err);
9594 // Bind memory to image
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009595 VkDeviceMemory image_mem;
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009596
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009597 VkMemoryAllocateInfo mem_alloc = {};
9598 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9599 mem_alloc.pNext = NULL;
9600 mem_alloc.allocationSize = 0;
9601 mem_alloc.memoryTypeIndex = 0;
9602 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9603 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009604 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009605 ASSERT_TRUE(pass);
9606 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9607 ASSERT_VK_SUCCESS(err);
9608 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9609 ASSERT_VK_SUCCESS(err);
9610 // Now create view for image
9611 VkImageViewCreateInfo image_view_ci = {};
9612 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9613 image_view_ci.image = image;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009614 image_view_ci.format = image_ci.format;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009615 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9616 image_view_ci.subresourceRange.layerCount = 1;
9617 image_view_ci.subresourceRange.baseArrayLayer = 0;
9618 image_view_ci.subresourceRange.levelCount = 1;
9619 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9620 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009621 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009622 ASSERT_VK_SUCCESS(err);
9623
9624 VkDescriptorBufferInfo buff_info = {};
9625 buff_info.buffer = buffer;
9626 VkDescriptorImageInfo img_info = {};
9627 img_info.imageView = image_view;
9628 VkWriteDescriptorSet descriptor_write = {};
9629 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9630 descriptor_write.dstBinding = 0;
9631 descriptor_write.descriptorCount = 1;
9632 descriptor_write.pTexelBufferView = &buff_view;
9633 descriptor_write.pBufferInfo = &buff_info;
9634 descriptor_write.pImageInfo = &img_info;
9635
9636 // These error messages align with VkDescriptorType struct
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009637 UNIQUE_VALIDATION_ERROR_CODE error_codes[] = {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009638 VALIDATION_ERROR_00943, // placeholder, no error for SAMPLER descriptor
9639 VALIDATION_ERROR_00943, // COMBINED_IMAGE_SAMPLER
9640 VALIDATION_ERROR_00943, // SAMPLED_IMAGE
9641 VALIDATION_ERROR_00943, // STORAGE_IMAGE
9642 VALIDATION_ERROR_00950, // UNIFORM_TEXEL_BUFFER
9643 VALIDATION_ERROR_00951, // STORAGE_TEXEL_BUFFER
9644 VALIDATION_ERROR_00946, // UNIFORM_BUFFER
9645 VALIDATION_ERROR_00947, // STORAGE_BUFFER
9646 VALIDATION_ERROR_00946, // UNIFORM_BUFFER_DYNAMIC
9647 VALIDATION_ERROR_00947, // STORAGE_BUFFER_DYNAMIC
9648 VALIDATION_ERROR_00943 // INPUT_ATTACHMENT
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009649 };
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009650 // Start loop at 1 as SAMPLER desc type has no usage bit error
9651 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
Tony Barbour415497c2017-01-24 10:06:09 -07009652 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9653 // Now check for UNIFORM_TEXEL_BUFFER using storage_texel_buffer_view
9654 descriptor_write.pTexelBufferView = &storage_texel_buffer_view;
9655 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009656 descriptor_write.descriptorType = VkDescriptorType(i);
9657 descriptor_write.dstSet = descriptor_sets[i];
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009658 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_codes[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009659
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009660 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009661
9662 m_errorMonitor->VerifyFound();
9663 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009664 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9665 descriptor_write.pTexelBufferView = &buff_view;
9666 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009667 }
Tony Barbour415497c2017-01-24 10:06:09 -07009668
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009669 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
9670 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009671 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009672 vkDestroyImageView(m_device->device(), image_view, NULL);
9673 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009674 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009675 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009676 vkDestroyBufferView(m_device->device(), storage_texel_buffer_view, NULL);
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009677 vkFreeMemory(m_device->device(), mem, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009678 vkFreeMemory(m_device->device(), storage_texel_buffer_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009679 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9680}
9681
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009682TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009683 TEST_DESCRIPTION(
9684 "Attempt to update buffer descriptor set that has incorrect "
9685 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009686 "1. offset value greater than or equal to buffer size\n"
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009687 "2. range value of 0\n"
9688 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009689 VkResult err;
9690
Tony Barbour1fa09702017-03-16 12:09:08 -06009691 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009692 VkDescriptorPoolSize ds_type_count = {};
9693 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9694 ds_type_count.descriptorCount = 1;
9695
9696 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9697 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9698 ds_pool_ci.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009699 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009700 ds_pool_ci.maxSets = 1;
9701 ds_pool_ci.poolSizeCount = 1;
9702 ds_pool_ci.pPoolSizes = &ds_type_count;
9703
9704 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009705 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009706 ASSERT_VK_SUCCESS(err);
9707
9708 // Create layout with single uniform buffer descriptor
9709 VkDescriptorSetLayoutBinding dsl_binding = {};
9710 dsl_binding.binding = 0;
9711 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9712 dsl_binding.descriptorCount = 1;
9713 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9714 dsl_binding.pImmutableSamplers = NULL;
9715
9716 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9717 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9718 ds_layout_ci.pNext = NULL;
9719 ds_layout_ci.bindingCount = 1;
9720 ds_layout_ci.pBindings = &dsl_binding;
9721 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009722 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009723 ASSERT_VK_SUCCESS(err);
9724
9725 VkDescriptorSet descriptor_set = {};
9726 VkDescriptorSetAllocateInfo alloc_info = {};
9727 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9728 alloc_info.descriptorSetCount = 1;
9729 alloc_info.descriptorPool = ds_pool;
9730 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009731 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009732 ASSERT_VK_SUCCESS(err);
9733
9734 // Create a buffer to be used for invalid updates
9735 VkBufferCreateInfo buff_ci = {};
9736 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9737 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009738 buff_ci.size = m_device->props.limits.minUniformBufferOffsetAlignment;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009739 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9740 VkBuffer buffer;
9741 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9742 ASSERT_VK_SUCCESS(err);
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009743
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009744 // Have to bind memory to buffer before descriptor update
9745 VkMemoryAllocateInfo mem_alloc = {};
9746 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9747 mem_alloc.pNext = NULL;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009748 mem_alloc.allocationSize = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009749 mem_alloc.memoryTypeIndex = 0;
9750
9751 VkMemoryRequirements mem_reqs;
9752 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009753 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009754 if (!pass) {
9755 vkDestroyBuffer(m_device->device(), buffer, NULL);
9756 return;
9757 }
9758
9759 VkDeviceMemory mem;
9760 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
9761 ASSERT_VK_SUCCESS(err);
9762 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9763 ASSERT_VK_SUCCESS(err);
9764
9765 VkDescriptorBufferInfo buff_info = {};
9766 buff_info.buffer = buffer;
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009767 // Cause error due to offset out of range
9768 buff_info.offset = buff_ci.size;
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009769 buff_info.range = VK_WHOLE_SIZE;
9770 VkWriteDescriptorSet descriptor_write = {};
9771 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9772 descriptor_write.dstBinding = 0;
9773 descriptor_write.descriptorCount = 1;
9774 descriptor_write.pTexelBufferView = nullptr;
9775 descriptor_write.pBufferInfo = &buff_info;
9776 descriptor_write.pImageInfo = nullptr;
9777
9778 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9779 descriptor_write.dstSet = descriptor_set;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009780 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00959);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009781
9782 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9783
9784 m_errorMonitor->VerifyFound();
9785 // Now cause error due to range of 0
9786 buff_info.offset = 0;
9787 buff_info.range = 0;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009788 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00960);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009789
9790 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9791
9792 m_errorMonitor->VerifyFound();
9793 // Now cause error due to range exceeding buffer size - offset
Jeremy Hayesd1a6a822017-03-09 14:39:45 -07009794 buff_info.offset = 0;
9795 buff_info.range = buff_ci.size + 1;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009796 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00961);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009797
9798 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9799
9800 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -06009801 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009802 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9803 vkDestroyBuffer(m_device->device(), buffer, NULL);
9804 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9805 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9806}
9807
Tobin Ehlis845887e2017-02-02 19:01:44 -07009808TEST_F(VkLayerTest, DSBufferLimitErrors) {
9809 TEST_DESCRIPTION(
9810 "Attempt to update buffer descriptor set that has VkDescriptorBufferInfo values that violate device limits.\n"
9811 "Test cases include:\n"
9812 "1. range of uniform buffer update exceeds maxUniformBufferRange\n"
9813 "2. offset of uniform buffer update is not multiple of minUniformBufferOffsetAlignment\n"
9814 "3. range of storage buffer update exceeds maxStorageBufferRange\n"
9815 "4. offset of storage buffer update is not multiple of minStorageBufferOffsetAlignment");
9816 VkResult err;
9817
Tony Barbour1fa09702017-03-16 12:09:08 -06009818 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis845887e2017-02-02 19:01:44 -07009819 VkDescriptorPoolSize ds_type_count[2] = {};
9820 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9821 ds_type_count[0].descriptorCount = 1;
9822 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9823 ds_type_count[1].descriptorCount = 1;
9824
9825 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9826 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9827 ds_pool_ci.pNext = NULL;
9828 ds_pool_ci.maxSets = 1;
9829 ds_pool_ci.poolSizeCount = 2;
9830 ds_pool_ci.pPoolSizes = ds_type_count;
9831
9832 VkDescriptorPool ds_pool;
9833 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9834 ASSERT_VK_SUCCESS(err);
9835
9836 // Create layout with single uniform buffer & single storage buffer descriptor
9837 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
9838 dsl_binding[0].binding = 0;
9839 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9840 dsl_binding[0].descriptorCount = 1;
9841 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
9842 dsl_binding[0].pImmutableSamplers = NULL;
9843 dsl_binding[1].binding = 1;
9844 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9845 dsl_binding[1].descriptorCount = 1;
9846 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
9847 dsl_binding[1].pImmutableSamplers = NULL;
9848
9849 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9850 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9851 ds_layout_ci.pNext = NULL;
9852 ds_layout_ci.bindingCount = 2;
9853 ds_layout_ci.pBindings = dsl_binding;
9854 VkDescriptorSetLayout ds_layout;
9855 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
9856 ASSERT_VK_SUCCESS(err);
9857
9858 VkDescriptorSet descriptor_set = {};
9859 VkDescriptorSetAllocateInfo alloc_info = {};
9860 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9861 alloc_info.descriptorSetCount = 1;
9862 alloc_info.descriptorPool = ds_pool;
9863 alloc_info.pSetLayouts = &ds_layout;
9864 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
9865 ASSERT_VK_SUCCESS(err);
9866
9867 // Create a buffer to be used for invalid updates
9868 auto max_ub_range = m_device->props.limits.maxUniformBufferRange;
9869 auto min_ub_align = m_device->props.limits.minUniformBufferOffsetAlignment;
9870 auto max_sb_range = m_device->props.limits.maxStorageBufferRange;
9871 auto min_sb_align = m_device->props.limits.minStorageBufferOffsetAlignment;
9872 VkBufferCreateInfo ub_ci = {};
9873 ub_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9874 ub_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
9875 ub_ci.size = max_ub_range + 128; // Make buffer bigger than range limit
9876 ub_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9877 VkBuffer uniform_buffer;
9878 err = vkCreateBuffer(m_device->device(), &ub_ci, NULL, &uniform_buffer);
9879 ASSERT_VK_SUCCESS(err);
9880 VkBufferCreateInfo sb_ci = {};
9881 sb_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9882 sb_ci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
9883 sb_ci.size = max_sb_range + 128; // Make buffer bigger than range limit
9884 sb_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9885 VkBuffer storage_buffer;
9886 err = vkCreateBuffer(m_device->device(), &sb_ci, NULL, &storage_buffer);
9887 ASSERT_VK_SUCCESS(err);
9888 // Have to bind memory to buffer before descriptor update
9889 VkMemoryAllocateInfo mem_alloc = {};
9890 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9891 mem_alloc.pNext = NULL;
9892 mem_alloc.allocationSize = ub_ci.size + sb_ci.size + 1024; // additional buffer for offset
9893 mem_alloc.memoryTypeIndex = 0;
9894
Cort Stratton77a0d592017-02-17 13:14:13 -08009895 VkMemoryRequirements ub_mem_reqs, sb_mem_reqs;
9896 vkGetBufferMemoryRequirements(m_device->device(), uniform_buffer, &ub_mem_reqs);
9897 bool pass = m_device->phy().set_memory_type(ub_mem_reqs.memoryTypeBits, &mem_alloc, 0);
9898 vkGetBufferMemoryRequirements(m_device->device(), storage_buffer, &sb_mem_reqs);
9899 pass &= m_device->phy().set_memory_type(sb_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009900 if (!pass) {
Tobin Ehlis15c83792017-02-07 10:09:33 -07009901 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009902 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009903 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9904 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009905 return;
9906 }
9907
9908 VkDeviceMemory mem;
9909 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009910 if (VK_SUCCESS != err) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009911 printf(" Failed to allocate memory in DSBufferLimitErrors; skipped.\n");
Tobin Ehlis15c83792017-02-07 10:09:33 -07009912 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9913 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9914 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9915 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9916 return;
9917 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009918 ASSERT_VK_SUCCESS(err);
9919 err = vkBindBufferMemory(m_device->device(), uniform_buffer, mem, 0);
9920 ASSERT_VK_SUCCESS(err);
Cort Stratton77a0d592017-02-17 13:14:13 -08009921 auto sb_offset = (ub_ci.size + sb_mem_reqs.alignment - 1) & ~(sb_mem_reqs.alignment - 1);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009922 err = vkBindBufferMemory(m_device->device(), storage_buffer, mem, sb_offset);
9923 ASSERT_VK_SUCCESS(err);
9924
9925 VkDescriptorBufferInfo buff_info = {};
9926 buff_info.buffer = uniform_buffer;
9927 buff_info.range = ub_ci.size; // This will exceed limit
9928 VkWriteDescriptorSet descriptor_write = {};
9929 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9930 descriptor_write.dstBinding = 0;
9931 descriptor_write.descriptorCount = 1;
9932 descriptor_write.pTexelBufferView = nullptr;
9933 descriptor_write.pBufferInfo = &buff_info;
9934 descriptor_write.pImageInfo = nullptr;
9935
9936 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9937 descriptor_write.dstSet = descriptor_set;
9938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
9939 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9940 m_errorMonitor->VerifyFound();
9941
9942 // Reduce size of range to acceptable limit & cause offset error
9943 buff_info.range = max_ub_range;
9944 buff_info.offset = min_ub_align - 1;
9945 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
9946 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9947 m_errorMonitor->VerifyFound();
9948
9949 // Now break storage updates
9950 buff_info.buffer = storage_buffer;
9951 buff_info.range = sb_ci.size; // This will exceed limit
9952 buff_info.offset = 0; // Reset offset for this update
9953
9954 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9955 descriptor_write.dstBinding = 1;
9956 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
9957 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9958 m_errorMonitor->VerifyFound();
9959
9960 // Reduce size of range to acceptable limit & cause offset error
9961 buff_info.range = max_sb_range;
9962 buff_info.offset = min_sb_align - 1;
9963 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
9964 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9965 m_errorMonitor->VerifyFound();
9966
9967 vkFreeMemory(m_device->device(), mem, NULL);
9968 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9969 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9970 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9971 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9972}
9973
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009974TEST_F(VkLayerTest, DSAspectBitsErrors) {
9975 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
9976 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009977 TEST_DESCRIPTION(
9978 "Attempt to update descriptor sets for images "
9979 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009980 VkResult err;
9981
Tony Barbour1fa09702017-03-16 12:09:08 -06009982 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -07009983 auto depth_format = find_depth_stencil_format(m_device);
9984 if (!depth_format) {
9985 printf(" No Depth + Stencil format found. Skipped.\n");
9986 return;
9987 }
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009988 VkDescriptorPoolSize ds_type_count = {};
9989 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9990 ds_type_count.descriptorCount = 1;
9991
9992 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9993 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9994 ds_pool_ci.pNext = NULL;
Jeremy Hayes293c7ed2017-03-09 14:47:07 -07009995 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009996 ds_pool_ci.maxSets = 5;
9997 ds_pool_ci.poolSizeCount = 1;
9998 ds_pool_ci.pPoolSizes = &ds_type_count;
9999
10000 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010001 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010002 ASSERT_VK_SUCCESS(err);
10003
10004 VkDescriptorSetLayoutBinding dsl_binding = {};
10005 dsl_binding.binding = 0;
10006 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10007 dsl_binding.descriptorCount = 1;
10008 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10009 dsl_binding.pImmutableSamplers = NULL;
10010
10011 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10012 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10013 ds_layout_ci.pNext = NULL;
10014 ds_layout_ci.bindingCount = 1;
10015 ds_layout_ci.pBindings = &dsl_binding;
10016 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010017 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010018 ASSERT_VK_SUCCESS(err);
10019
10020 VkDescriptorSet descriptor_set = {};
10021 VkDescriptorSetAllocateInfo alloc_info = {};
10022 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10023 alloc_info.descriptorSetCount = 1;
10024 alloc_info.descriptorPool = ds_pool;
10025 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010026 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010027 ASSERT_VK_SUCCESS(err);
10028
10029 // Create an image to be used for invalid updates
10030 VkImageCreateInfo image_ci = {};
10031 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
10032 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070010033 image_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010034 image_ci.extent.width = 64;
10035 image_ci.extent.height = 64;
10036 image_ci.extent.depth = 1;
10037 image_ci.mipLevels = 1;
10038 image_ci.arrayLayers = 1;
10039 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Young2d1fa302017-03-02 10:13:09 -070010040 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010041 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
10042 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
10043 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
10044 VkImage image;
10045 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
10046 ASSERT_VK_SUCCESS(err);
10047 // Bind memory to image
10048 VkMemoryRequirements mem_reqs;
10049 VkDeviceMemory image_mem;
10050 bool pass;
10051 VkMemoryAllocateInfo mem_alloc = {};
10052 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
10053 mem_alloc.pNext = NULL;
10054 mem_alloc.allocationSize = 0;
10055 mem_alloc.memoryTypeIndex = 0;
10056 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
10057 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010058 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010059 ASSERT_TRUE(pass);
10060 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
10061 ASSERT_VK_SUCCESS(err);
10062 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
10063 ASSERT_VK_SUCCESS(err);
10064 // Now create view for image
10065 VkImageViewCreateInfo image_view_ci = {};
10066 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
10067 image_view_ci.image = image;
Tony Barbourf887b162017-03-09 10:06:46 -070010068 image_view_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010069 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
10070 image_view_ci.subresourceRange.layerCount = 1;
10071 image_view_ci.subresourceRange.baseArrayLayer = 0;
10072 image_view_ci.subresourceRange.levelCount = 1;
10073 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010074 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010075
10076 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010077 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010078 ASSERT_VK_SUCCESS(err);
10079
10080 VkDescriptorImageInfo img_info = {};
10081 img_info.imageView = image_view;
10082 VkWriteDescriptorSet descriptor_write = {};
10083 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10084 descriptor_write.dstBinding = 0;
10085 descriptor_write.descriptorCount = 1;
10086 descriptor_write.pTexelBufferView = NULL;
10087 descriptor_write.pBufferInfo = NULL;
10088 descriptor_write.pImageInfo = &img_info;
10089 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
10090 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010091 const char *error_msg =
10092 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
10093 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010094 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010095
10096 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10097
10098 m_errorMonitor->VerifyFound();
10099 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10100 vkDestroyImage(m_device->device(), image, NULL);
10101 vkFreeMemory(m_device->device(), image_mem, NULL);
10102 vkDestroyImageView(m_device->device(), image_view, NULL);
10103 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10104 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10105}
10106
Karl Schultz6addd812016-02-02 17:17:23 -070010107TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010108 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010109 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010110
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010111 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10112 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10113 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010114
Tony Barbour1fa09702017-03-16 12:09:08 -060010115 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010116 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010117 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010118 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10119 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010120
10121 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010122 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10123 ds_pool_ci.pNext = NULL;
10124 ds_pool_ci.maxSets = 1;
10125 ds_pool_ci.poolSizeCount = 1;
10126 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010127
Tobin Ehlis3b780662015-05-28 12:11:26 -060010128 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010129 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010130 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010131 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010132 dsl_binding.binding = 0;
10133 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10134 dsl_binding.descriptorCount = 1;
10135 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10136 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010137
Tony Barboureb254902015-07-15 12:50:33 -060010138 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010139 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10140 ds_layout_ci.pNext = NULL;
10141 ds_layout_ci.bindingCount = 1;
10142 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010143
Tobin Ehlis3b780662015-05-28 12:11:26 -060010144 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010145 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010146 ASSERT_VK_SUCCESS(err);
10147
10148 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010149 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010150 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010151 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010152 alloc_info.descriptorPool = ds_pool;
10153 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010154 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010155 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010156
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010157 VkSamplerCreateInfo sampler_ci = {};
10158 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10159 sampler_ci.pNext = NULL;
10160 sampler_ci.magFilter = VK_FILTER_NEAREST;
10161 sampler_ci.minFilter = VK_FILTER_NEAREST;
10162 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10163 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10164 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10165 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10166 sampler_ci.mipLodBias = 1.0;
10167 sampler_ci.anisotropyEnable = VK_FALSE;
10168 sampler_ci.maxAnisotropy = 1;
10169 sampler_ci.compareEnable = VK_FALSE;
10170 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10171 sampler_ci.minLod = 1.0;
10172 sampler_ci.maxLod = 1.0;
10173 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10174 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10175 VkSampler sampler;
10176 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10177 ASSERT_VK_SUCCESS(err);
10178
10179 VkDescriptorImageInfo info = {};
10180 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010181
10182 VkWriteDescriptorSet descriptor_write;
10183 memset(&descriptor_write, 0, sizeof(descriptor_write));
10184 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010185 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010186 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010187 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010188 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010189 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010190
10191 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10192
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010193 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010194
Chia-I Wuf7458c52015-10-26 21:10:41 +080010195 vkDestroySampler(m_device->device(), sampler, NULL);
10196 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10197 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010198}
10199
Karl Schultz6addd812016-02-02 17:17:23 -070010200TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010201 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010202 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010203
Tobin Ehlisf922ef82016-11-30 10:19:14 -070010204 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010205
Tony Barbour1fa09702017-03-16 12:09:08 -060010206 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010207 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010208 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010209 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10210 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010211
10212 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010213 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10214 ds_pool_ci.pNext = NULL;
10215 ds_pool_ci.maxSets = 1;
10216 ds_pool_ci.poolSizeCount = 1;
10217 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010218
Tobin Ehlis3b780662015-05-28 12:11:26 -060010219 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010220 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010221 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010222
Tony Barboureb254902015-07-15 12:50:33 -060010223 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010224 dsl_binding.binding = 0;
10225 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10226 dsl_binding.descriptorCount = 1;
10227 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10228 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010229
10230 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010231 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10232 ds_layout_ci.pNext = NULL;
10233 ds_layout_ci.bindingCount = 1;
10234 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010235
Tobin Ehlis3b780662015-05-28 12:11:26 -060010236 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010237 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010238 ASSERT_VK_SUCCESS(err);
10239
10240 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010241 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010242 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010243 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010244 alloc_info.descriptorPool = ds_pool;
10245 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010246 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010247 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010248
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010249 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
10250
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010251 // Correctly update descriptor to avoid "NOT_UPDATED" error
10252 VkDescriptorBufferInfo buff_info = {};
Jeremy Hayesd5b95db2017-03-09 15:24:24 -070010253 buff_info.buffer = buffer_test.GetBuffer();
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010254 buff_info.offset = 0;
10255 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010256
10257 VkWriteDescriptorSet descriptor_write;
10258 memset(&descriptor_write, 0, sizeof(descriptor_write));
10259 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010260 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010261 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010262 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010263 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10264 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010265
10266 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10267
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010268 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010269
Chia-I Wuf7458c52015-10-26 21:10:41 +080010270 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10271 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010272}
10273
Karl Schultz6addd812016-02-02 17:17:23 -070010274TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010275 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -070010276 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010277
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010278 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010279
Tony Barbour1fa09702017-03-16 12:09:08 -060010280 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010281 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010282 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010283 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10284 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010285
10286 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010287 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10288 ds_pool_ci.pNext = NULL;
10289 ds_pool_ci.maxSets = 1;
10290 ds_pool_ci.poolSizeCount = 1;
10291 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010292
Tobin Ehlis3b780662015-05-28 12:11:26 -060010293 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010294 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010295 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010296
Tony Barboureb254902015-07-15 12:50:33 -060010297 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010298 dsl_binding.binding = 0;
10299 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10300 dsl_binding.descriptorCount = 1;
10301 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10302 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010303
10304 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010305 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10306 ds_layout_ci.pNext = NULL;
10307 ds_layout_ci.bindingCount = 1;
10308 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010309 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010310 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010311 ASSERT_VK_SUCCESS(err);
10312
10313 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010314 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010315 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010316 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010317 alloc_info.descriptorPool = ds_pool;
10318 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010319 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010320 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010321
Tony Barboureb254902015-07-15 12:50:33 -060010322 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010323 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10324 sampler_ci.pNext = NULL;
10325 sampler_ci.magFilter = VK_FILTER_NEAREST;
10326 sampler_ci.minFilter = VK_FILTER_NEAREST;
10327 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10328 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10329 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10330 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10331 sampler_ci.mipLodBias = 1.0;
10332 sampler_ci.anisotropyEnable = VK_FALSE;
10333 sampler_ci.maxAnisotropy = 1;
10334 sampler_ci.compareEnable = VK_FALSE;
10335 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10336 sampler_ci.minLod = 1.0;
10337 sampler_ci.maxLod = 1.0;
10338 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10339 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010340
Tobin Ehlis3b780662015-05-28 12:11:26 -060010341 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010342 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010343 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010344
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010345 VkDescriptorImageInfo info = {};
10346 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010347
10348 VkWriteDescriptorSet descriptor_write;
10349 memset(&descriptor_write, 0, sizeof(descriptor_write));
10350 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010351 descriptor_write.dstSet = descriptorSet;
10352 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010353 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010354 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010355 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010356 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010357
10358 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10359
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010360 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010361
Chia-I Wuf7458c52015-10-26 21:10:41 +080010362 vkDestroySampler(m_device->device(), sampler, NULL);
10363 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10364 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010365}
10366
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010367TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
10368 // Create layout w/ empty binding and attempt to update it
10369 VkResult err;
10370
Tony Barbour1fa09702017-03-16 12:09:08 -060010371 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010372
10373 VkDescriptorPoolSize ds_type_count = {};
10374 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10375 ds_type_count.descriptorCount = 1;
10376
10377 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10378 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10379 ds_pool_ci.pNext = NULL;
10380 ds_pool_ci.maxSets = 1;
10381 ds_pool_ci.poolSizeCount = 1;
10382 ds_pool_ci.pPoolSizes = &ds_type_count;
10383
10384 VkDescriptorPool ds_pool;
10385 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10386 ASSERT_VK_SUCCESS(err);
10387
10388 VkDescriptorSetLayoutBinding dsl_binding = {};
10389 dsl_binding.binding = 0;
10390 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10391 dsl_binding.descriptorCount = 0;
10392 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10393 dsl_binding.pImmutableSamplers = NULL;
10394
10395 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10396 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10397 ds_layout_ci.pNext = NULL;
10398 ds_layout_ci.bindingCount = 1;
10399 ds_layout_ci.pBindings = &dsl_binding;
10400 VkDescriptorSetLayout ds_layout;
10401 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10402 ASSERT_VK_SUCCESS(err);
10403
10404 VkDescriptorSet descriptor_set;
10405 VkDescriptorSetAllocateInfo alloc_info = {};
10406 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10407 alloc_info.descriptorSetCount = 1;
10408 alloc_info.descriptorPool = ds_pool;
10409 alloc_info.pSetLayouts = &ds_layout;
10410 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10411 ASSERT_VK_SUCCESS(err);
10412
10413 VkSamplerCreateInfo sampler_ci = {};
10414 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10415 sampler_ci.magFilter = VK_FILTER_NEAREST;
10416 sampler_ci.minFilter = VK_FILTER_NEAREST;
10417 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10418 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10419 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10420 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10421 sampler_ci.mipLodBias = 1.0;
10422 sampler_ci.maxAnisotropy = 1;
10423 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10424 sampler_ci.minLod = 1.0;
10425 sampler_ci.maxLod = 1.0;
10426 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10427
10428 VkSampler sampler;
10429 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10430 ASSERT_VK_SUCCESS(err);
10431
10432 VkDescriptorImageInfo info = {};
10433 info.sampler = sampler;
10434
10435 VkWriteDescriptorSet descriptor_write;
10436 memset(&descriptor_write, 0, sizeof(descriptor_write));
10437 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10438 descriptor_write.dstSet = descriptor_set;
10439 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010440 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010441 // This is the wrong type, but empty binding error will be flagged first
10442 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10443 descriptor_write.pImageInfo = &info;
10444
10445 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
10446 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10447 m_errorMonitor->VerifyFound();
10448
10449 vkDestroySampler(m_device->device(), sampler, NULL);
10450 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10451 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10452}
10453
Karl Schultz6addd812016-02-02 17:17:23 -070010454TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10455 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10456 // types
10457 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010458
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010459 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 -060010460
Tony Barbour1fa09702017-03-16 12:09:08 -060010461 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010462
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010463 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010464 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10465 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010466
10467 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010468 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10469 ds_pool_ci.pNext = NULL;
10470 ds_pool_ci.maxSets = 1;
10471 ds_pool_ci.poolSizeCount = 1;
10472 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010473
Tobin Ehlis3b780662015-05-28 12:11:26 -060010474 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010475 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010476 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010477 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010478 dsl_binding.binding = 0;
10479 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10480 dsl_binding.descriptorCount = 1;
10481 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10482 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010483
Tony Barboureb254902015-07-15 12:50:33 -060010484 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010485 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10486 ds_layout_ci.pNext = NULL;
10487 ds_layout_ci.bindingCount = 1;
10488 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010489
Tobin Ehlis3b780662015-05-28 12:11:26 -060010490 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010491 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010492 ASSERT_VK_SUCCESS(err);
10493
10494 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010495 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010496 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010497 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010498 alloc_info.descriptorPool = ds_pool;
10499 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010500 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010501 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010502
Tony Barboureb254902015-07-15 12:50:33 -060010503 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010504 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10505 sampler_ci.pNext = NULL;
10506 sampler_ci.magFilter = VK_FILTER_NEAREST;
10507 sampler_ci.minFilter = VK_FILTER_NEAREST;
10508 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10509 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10510 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10511 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10512 sampler_ci.mipLodBias = 1.0;
10513 sampler_ci.anisotropyEnable = VK_FALSE;
10514 sampler_ci.maxAnisotropy = 1;
10515 sampler_ci.compareEnable = VK_FALSE;
10516 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10517 sampler_ci.minLod = 1.0;
10518 sampler_ci.maxLod = 1.0;
10519 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10520 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010521 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010522 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010523 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010524
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010525 VkDescriptorImageInfo info = {};
10526 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010527
10528 VkWriteDescriptorSet descriptor_write;
10529 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010530 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010531 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010532 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010533 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010534 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010535 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010536
10537 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10538
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010539 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010540
Chia-I Wuf7458c52015-10-26 21:10:41 +080010541 vkDestroySampler(m_device->device(), sampler, NULL);
10542 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10543 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010544}
10545
Karl Schultz6addd812016-02-02 17:17:23 -070010546TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010547 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010548 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010549
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010550 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010551
Tony Barbour1fa09702017-03-16 12:09:08 -060010552 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010553 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10554 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010555 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010556 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10557 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010558
10559 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010560 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10561 ds_pool_ci.pNext = NULL;
10562 ds_pool_ci.maxSets = 1;
10563 ds_pool_ci.poolSizeCount = 1;
10564 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010565
10566 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010567 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010568 ASSERT_VK_SUCCESS(err);
10569
10570 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010571 dsl_binding.binding = 0;
10572 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10573 dsl_binding.descriptorCount = 1;
10574 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10575 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010576
10577 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010578 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10579 ds_layout_ci.pNext = NULL;
10580 ds_layout_ci.bindingCount = 1;
10581 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010582 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010583 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010584 ASSERT_VK_SUCCESS(err);
10585
10586 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010587 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010588 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010589 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010590 alloc_info.descriptorPool = ds_pool;
10591 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010592 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010593 ASSERT_VK_SUCCESS(err);
10594
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010595 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010596
10597 VkDescriptorImageInfo descriptor_info;
10598 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10599 descriptor_info.sampler = sampler;
10600
10601 VkWriteDescriptorSet descriptor_write;
10602 memset(&descriptor_write, 0, sizeof(descriptor_write));
10603 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010604 descriptor_write.dstSet = descriptorSet;
10605 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010606 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010607 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10608 descriptor_write.pImageInfo = &descriptor_info;
10609
10610 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10611
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010612 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010613
Chia-I Wuf7458c52015-10-26 21:10:41 +080010614 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10615 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010616}
10617
Karl Schultz6addd812016-02-02 17:17:23 -070010618TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10619 // Create a single combined Image/Sampler descriptor and send it an invalid
10620 // imageView
10621 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010622
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010623 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010624
Tony Barbour1fa09702017-03-16 12:09:08 -060010625 ASSERT_NO_FATAL_FAILURE(Init());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010626 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010627 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10628 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010629
10630 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010631 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10632 ds_pool_ci.pNext = NULL;
10633 ds_pool_ci.maxSets = 1;
10634 ds_pool_ci.poolSizeCount = 1;
10635 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010636
10637 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010638 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010639 ASSERT_VK_SUCCESS(err);
10640
10641 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010642 dsl_binding.binding = 0;
10643 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10644 dsl_binding.descriptorCount = 1;
10645 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10646 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010647
10648 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010649 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10650 ds_layout_ci.pNext = NULL;
10651 ds_layout_ci.bindingCount = 1;
10652 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010653 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010654 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010655 ASSERT_VK_SUCCESS(err);
10656
10657 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010658 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010659 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010660 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010661 alloc_info.descriptorPool = ds_pool;
10662 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010663 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010664 ASSERT_VK_SUCCESS(err);
10665
10666 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010667 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10668 sampler_ci.pNext = NULL;
10669 sampler_ci.magFilter = VK_FILTER_NEAREST;
10670 sampler_ci.minFilter = VK_FILTER_NEAREST;
10671 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10672 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10673 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10674 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10675 sampler_ci.mipLodBias = 1.0;
10676 sampler_ci.anisotropyEnable = VK_FALSE;
10677 sampler_ci.maxAnisotropy = 1;
10678 sampler_ci.compareEnable = VK_FALSE;
10679 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10680 sampler_ci.minLod = 1.0;
10681 sampler_ci.maxLod = 1.0;
10682 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10683 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010684
10685 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010686 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010687 ASSERT_VK_SUCCESS(err);
10688
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010689 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010690
10691 VkDescriptorImageInfo descriptor_info;
10692 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10693 descriptor_info.sampler = sampler;
10694 descriptor_info.imageView = view;
10695
10696 VkWriteDescriptorSet descriptor_write;
10697 memset(&descriptor_write, 0, sizeof(descriptor_write));
10698 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010699 descriptor_write.dstSet = descriptorSet;
10700 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010701 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010702 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10703 descriptor_write.pImageInfo = &descriptor_info;
10704
10705 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10706
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010707 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010708
Chia-I Wuf7458c52015-10-26 21:10:41 +080010709 vkDestroySampler(m_device->device(), sampler, NULL);
10710 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10711 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010712}
10713
Karl Schultz6addd812016-02-02 17:17:23 -070010714TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10715 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10716 // into the other
10717 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010718
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010719 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10720 " binding #1 with type "
10721 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10722 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010723
Tony Barbour1fa09702017-03-16 12:09:08 -060010724 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultz6addd812016-02-02 17:17:23 -070010725 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010726 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010727 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10728 ds_type_count[0].descriptorCount = 1;
10729 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10730 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010731
10732 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010733 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10734 ds_pool_ci.pNext = NULL;
10735 ds_pool_ci.maxSets = 1;
10736 ds_pool_ci.poolSizeCount = 2;
10737 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010738
10739 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010740 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010741 ASSERT_VK_SUCCESS(err);
10742 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010743 dsl_binding[0].binding = 0;
10744 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10745 dsl_binding[0].descriptorCount = 1;
10746 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10747 dsl_binding[0].pImmutableSamplers = NULL;
10748 dsl_binding[1].binding = 1;
10749 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10750 dsl_binding[1].descriptorCount = 1;
10751 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10752 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010753
10754 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010755 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10756 ds_layout_ci.pNext = NULL;
10757 ds_layout_ci.bindingCount = 2;
10758 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010759
10760 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010761 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010762 ASSERT_VK_SUCCESS(err);
10763
10764 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010765 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010766 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010767 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010768 alloc_info.descriptorPool = ds_pool;
10769 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010770 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010771 ASSERT_VK_SUCCESS(err);
10772
10773 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010774 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10775 sampler_ci.pNext = NULL;
10776 sampler_ci.magFilter = VK_FILTER_NEAREST;
10777 sampler_ci.minFilter = VK_FILTER_NEAREST;
10778 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10779 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10780 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10781 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10782 sampler_ci.mipLodBias = 1.0;
10783 sampler_ci.anisotropyEnable = VK_FALSE;
10784 sampler_ci.maxAnisotropy = 1;
10785 sampler_ci.compareEnable = VK_FALSE;
10786 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10787 sampler_ci.minLod = 1.0;
10788 sampler_ci.maxLod = 1.0;
10789 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10790 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010791
10792 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010793 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010794 ASSERT_VK_SUCCESS(err);
10795
10796 VkDescriptorImageInfo info = {};
10797 info.sampler = sampler;
10798
10799 VkWriteDescriptorSet descriptor_write;
10800 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
10801 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010802 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010803 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080010804 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010805 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10806 descriptor_write.pImageInfo = &info;
10807 // This write update should succeed
10808 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10809 // Now perform a copy update that fails due to type mismatch
10810 VkCopyDescriptorSet copy_ds_update;
10811 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10812 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10813 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010814 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010815 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010816 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
10817 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010818 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10819
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010820 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010821 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010822 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 -060010823 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10824 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10825 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010826 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010827 copy_ds_update.dstSet = descriptorSet;
10828 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010829 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010830 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10831
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010832 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010833
Tobin Ehlis04356f92015-10-27 16:35:27 -060010834 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010835 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10836 " binding#1 with offset index of 1 plus "
10837 "update array offset of 0 and update of "
10838 "5 descriptors oversteps total number "
10839 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010840
Tobin Ehlis04356f92015-10-27 16:35:27 -060010841 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10842 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10843 copy_ds_update.srcSet = descriptorSet;
10844 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010845 copy_ds_update.dstSet = descriptorSet;
10846 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010847 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060010848 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10849
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010850 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010851
Chia-I Wuf7458c52015-10-26 21:10:41 +080010852 vkDestroySampler(m_device->device(), sampler, NULL);
10853 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10854 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010855}
10856
Karl Schultz6addd812016-02-02 17:17:23 -070010857TEST_F(VkLayerTest, NumSamplesMismatch) {
10858 // Create CommandBuffer where MSAA samples doesn't match RenderPass
10859 // sampleCount
10860 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010861
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010862 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010863
Tony Barbour1fa09702017-03-16 12:09:08 -060010864 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010865 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010866 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060010867 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010868 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010869
10870 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010871 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10872 ds_pool_ci.pNext = NULL;
10873 ds_pool_ci.maxSets = 1;
10874 ds_pool_ci.poolSizeCount = 1;
10875 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010876
Tobin Ehlis3b780662015-05-28 12:11:26 -060010877 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010878 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010879 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010880
Tony Barboureb254902015-07-15 12:50:33 -060010881 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080010882 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060010883 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080010884 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010885 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10886 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010887
Tony Barboureb254902015-07-15 12:50:33 -060010888 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10889 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10890 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010891 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070010892 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010893
Tobin Ehlis3b780662015-05-28 12:11:26 -060010894 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010895 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010896 ASSERT_VK_SUCCESS(err);
10897
10898 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010899 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010900 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010901 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010902 alloc_info.descriptorPool = ds_pool;
10903 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010904 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010905 ASSERT_VK_SUCCESS(err);
10906
Tony Barboureb254902015-07-15 12:50:33 -060010907 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010908 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010909 pipe_ms_state_ci.pNext = NULL;
10910 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10911 pipe_ms_state_ci.sampleShadingEnable = 0;
10912 pipe_ms_state_ci.minSampleShading = 1.0;
10913 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010914
Tony Barboureb254902015-07-15 12:50:33 -060010915 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010916 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10917 pipeline_layout_ci.pNext = NULL;
10918 pipeline_layout_ci.setLayoutCount = 1;
10919 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010920
10921 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010922 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010923 ASSERT_VK_SUCCESS(err);
10924
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010925 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010926 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 -060010927 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010928 VkPipelineObj pipe(m_device);
10929 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010930 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010931 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010932 pipe.SetMSAA(&pipe_ms_state_ci);
10933 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010934
Tony Barbour552f6c02016-12-21 14:34:07 -070010935 m_commandBuffer->BeginCommandBuffer();
10936 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010937 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010938
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070010939 VkViewport viewport = {0, 0, 16, 16, 0, 1};
10940 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
10941 VkRect2D scissor = {{0, 0}, {16, 16}};
10942 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
10943
Mark Young29927482016-05-04 14:38:51 -060010944 // Render triangle (the error should trigger on the attempt to draw).
10945 Draw(3, 1, 0, 0);
10946
10947 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070010948 m_commandBuffer->EndRenderPass();
10949 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060010950
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010951 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010952
Chia-I Wuf7458c52015-10-26 21:10:41 +080010953 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10954 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10955 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010956}
Mark Young29927482016-05-04 14:38:51 -060010957
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010958TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010959 TEST_DESCRIPTION(
10960 "Hit RenderPass incompatible cases. "
10961 "Initial case is drawing with an active renderpass that's "
10962 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010963 VkResult err;
10964
Tony Barbour1fa09702017-03-16 12:09:08 -060010965 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010966 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10967
10968 VkDescriptorSetLayoutBinding dsl_binding = {};
10969 dsl_binding.binding = 0;
10970 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10971 dsl_binding.descriptorCount = 1;
10972 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10973 dsl_binding.pImmutableSamplers = NULL;
10974
10975 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10976 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10977 ds_layout_ci.pNext = NULL;
10978 ds_layout_ci.bindingCount = 1;
10979 ds_layout_ci.pBindings = &dsl_binding;
10980
10981 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010982 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010983 ASSERT_VK_SUCCESS(err);
10984
10985 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10986 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10987 pipeline_layout_ci.pNext = NULL;
10988 pipeline_layout_ci.setLayoutCount = 1;
10989 pipeline_layout_ci.pSetLayouts = &ds_layout;
10990
10991 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010992 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010993 ASSERT_VK_SUCCESS(err);
10994
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010995 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010996 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 -060010997 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010998 // Create a renderpass that will be incompatible with default renderpass
10999 VkAttachmentReference attach = {};
11000 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11001 VkAttachmentReference color_att = {};
11002 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11003 VkSubpassDescription subpass = {};
11004 subpass.inputAttachmentCount = 1;
11005 subpass.pInputAttachments = &attach;
11006 subpass.colorAttachmentCount = 1;
11007 subpass.pColorAttachments = &color_att;
11008 VkRenderPassCreateInfo rpci = {};
11009 rpci.subpassCount = 1;
11010 rpci.pSubpasses = &subpass;
11011 rpci.attachmentCount = 1;
11012 VkAttachmentDescription attach_desc = {};
11013 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060011014 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
11015 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011016 rpci.pAttachments = &attach_desc;
11017 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
11018 VkRenderPass rp;
11019 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11020 VkPipelineObj pipe(m_device);
11021 pipe.AddShader(&vs);
11022 pipe.AddShader(&fs);
11023 pipe.AddColorAttachment();
11024 VkViewport view_port = {};
11025 m_viewports.push_back(view_port);
11026 pipe.SetViewport(m_viewports);
11027 VkRect2D rect = {};
11028 m_scissors.push_back(rect);
11029 pipe.SetScissor(m_scissors);
11030 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11031
11032 VkCommandBufferInheritanceInfo cbii = {};
11033 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
11034 cbii.renderPass = rp;
11035 cbii.subpass = 0;
11036 VkCommandBufferBeginInfo cbbi = {};
11037 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
11038 cbbi.pInheritanceInfo = &cbii;
11039 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
11040 VkRenderPassBeginInfo rpbi = {};
11041 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
11042 rpbi.framebuffer = m_framebuffer;
11043 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011044 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
11045 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011046
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011047 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011048 // Render triangle (the error should trigger on the attempt to draw).
11049 Draw(3, 1, 0, 0);
11050
11051 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070011052 m_commandBuffer->EndRenderPass();
11053 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060011054
11055 m_errorMonitor->VerifyFound();
11056
11057 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11058 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11059 vkDestroyRenderPass(m_device->device(), rp, NULL);
11060}
11061
Mark Youngc89c6312016-03-31 16:03:20 -060011062TEST_F(VkLayerTest, NumBlendAttachMismatch) {
11063 // Create Pipeline where the number of blend attachments doesn't match the
11064 // number of color attachments. In this case, we don't add any color
11065 // blend attachments even though we have a color attachment.
11066 VkResult err;
11067
Tobin Ehlis974c0d92017-02-01 13:31:22 -070011068 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060011069
Tony Barbour1fa09702017-03-16 12:09:08 -060011070 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc89c6312016-03-31 16:03:20 -060011071 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11072 VkDescriptorPoolSize ds_type_count = {};
11073 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11074 ds_type_count.descriptorCount = 1;
11075
11076 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11077 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11078 ds_pool_ci.pNext = NULL;
11079 ds_pool_ci.maxSets = 1;
11080 ds_pool_ci.poolSizeCount = 1;
11081 ds_pool_ci.pPoolSizes = &ds_type_count;
11082
11083 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011084 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060011085 ASSERT_VK_SUCCESS(err);
11086
11087 VkDescriptorSetLayoutBinding dsl_binding = {};
11088 dsl_binding.binding = 0;
11089 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11090 dsl_binding.descriptorCount = 1;
11091 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11092 dsl_binding.pImmutableSamplers = NULL;
11093
11094 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11095 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11096 ds_layout_ci.pNext = NULL;
11097 ds_layout_ci.bindingCount = 1;
11098 ds_layout_ci.pBindings = &dsl_binding;
11099
11100 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011101 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011102 ASSERT_VK_SUCCESS(err);
11103
11104 VkDescriptorSet descriptorSet;
11105 VkDescriptorSetAllocateInfo alloc_info = {};
11106 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11107 alloc_info.descriptorSetCount = 1;
11108 alloc_info.descriptorPool = ds_pool;
11109 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011110 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060011111 ASSERT_VK_SUCCESS(err);
11112
11113 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011114 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060011115 pipe_ms_state_ci.pNext = NULL;
11116 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11117 pipe_ms_state_ci.sampleShadingEnable = 0;
11118 pipe_ms_state_ci.minSampleShading = 1.0;
11119 pipe_ms_state_ci.pSampleMask = NULL;
11120
11121 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11122 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11123 pipeline_layout_ci.pNext = NULL;
11124 pipeline_layout_ci.setLayoutCount = 1;
11125 pipeline_layout_ci.pSetLayouts = &ds_layout;
11126
11127 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011128 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011129 ASSERT_VK_SUCCESS(err);
11130
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011131 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011132 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 -060011133 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060011134 VkPipelineObj pipe(m_device);
11135 pipe.AddShader(&vs);
11136 pipe.AddShader(&fs);
11137 pipe.SetMSAA(&pipe_ms_state_ci);
11138 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011139 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011140
11141 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11142 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11143 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11144}
Mark Young29927482016-05-04 14:38:51 -060011145
Mark Muellerd4914412016-06-13 17:52:06 -060011146TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011147 TEST_DESCRIPTION(
11148 "Points to a wrong colorAttachment index in a VkClearAttachment "
11149 "structure passed to vkCmdClearAttachments");
Tony Barbour1fa09702017-03-16 12:09:08 -060011150 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011151 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060011152
11153 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11154 m_errorMonitor->VerifyFound();
11155}
11156
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011157TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011158 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
11159 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011160
Tony Barbour1fa09702017-03-16 12:09:08 -060011161 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011162 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011163
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011164 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011165 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11166 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011167
11168 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011169 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11170 ds_pool_ci.pNext = NULL;
11171 ds_pool_ci.maxSets = 1;
11172 ds_pool_ci.poolSizeCount = 1;
11173 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011174
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011175 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011176 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011177 ASSERT_VK_SUCCESS(err);
11178
Tony Barboureb254902015-07-15 12:50:33 -060011179 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011180 dsl_binding.binding = 0;
11181 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11182 dsl_binding.descriptorCount = 1;
11183 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11184 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011185
Tony Barboureb254902015-07-15 12:50:33 -060011186 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011187 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11188 ds_layout_ci.pNext = NULL;
11189 ds_layout_ci.bindingCount = 1;
11190 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011191
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011192 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011193 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011194 ASSERT_VK_SUCCESS(err);
11195
11196 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011197 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011198 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011199 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011200 alloc_info.descriptorPool = ds_pool;
11201 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011202 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011203 ASSERT_VK_SUCCESS(err);
11204
Tony Barboureb254902015-07-15 12:50:33 -060011205 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011206 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011207 pipe_ms_state_ci.pNext = NULL;
11208 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11209 pipe_ms_state_ci.sampleShadingEnable = 0;
11210 pipe_ms_state_ci.minSampleShading = 1.0;
11211 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011212
Tony Barboureb254902015-07-15 12:50:33 -060011213 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011214 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11215 pipeline_layout_ci.pNext = NULL;
11216 pipeline_layout_ci.setLayoutCount = 1;
11217 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011218
11219 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011220 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011221 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011222
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011223 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011224 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011225 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011226 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011227
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011228 VkPipelineObj pipe(m_device);
11229 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011230 pipe.AddShader(&fs);
Jeremy Hayes7332f342017-03-09 15:54:12 -070011231 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011232 pipe.SetMSAA(&pipe_ms_state_ci);
11233 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011234
Tony Barbour552f6c02016-12-21 14:34:07 -070011235 m_commandBuffer->BeginCommandBuffer();
11236 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011237
Karl Schultz6addd812016-02-02 17:17:23 -070011238 // Main thing we care about for this test is that the VkImage obj we're
11239 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011240 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011241 VkClearAttachment color_attachment;
11242 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11243 color_attachment.clearValue.color.float32[0] = 1.0;
11244 color_attachment.clearValue.color.float32[1] = 1.0;
11245 color_attachment.clearValue.color.float32[2] = 1.0;
11246 color_attachment.clearValue.color.float32[3] = 1.0;
11247 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011248 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011249
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011250 // Call for full-sized FB Color attachment prior to issuing a Draw
11251 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070011252 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011253 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011254 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011255
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011256 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
11257 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
11258 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
11259 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
11260 m_errorMonitor->VerifyFound();
11261
11262 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
11263 clear_rect.layerCount = 2;
11264 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
11265 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011266 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011267
Chia-I Wuf7458c52015-10-26 21:10:41 +080011268 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11269 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11270 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011271}
11272
Karl Schultz6addd812016-02-02 17:17:23 -070011273TEST_F(VkLayerTest, VtxBufferBadIndex) {
11274 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011275
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011276 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11277 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011278
Tony Barbour1fa09702017-03-16 12:09:08 -060011279 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011280 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011281 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011282
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011283 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011284 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11285 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011286
11287 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011288 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11289 ds_pool_ci.pNext = NULL;
11290 ds_pool_ci.maxSets = 1;
11291 ds_pool_ci.poolSizeCount = 1;
11292 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011293
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011294 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011295 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011296 ASSERT_VK_SUCCESS(err);
11297
Tony Barboureb254902015-07-15 12:50:33 -060011298 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011299 dsl_binding.binding = 0;
11300 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11301 dsl_binding.descriptorCount = 1;
11302 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11303 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011304
Tony Barboureb254902015-07-15 12:50:33 -060011305 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011306 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11307 ds_layout_ci.pNext = NULL;
11308 ds_layout_ci.bindingCount = 1;
11309 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011310
Tobin Ehlis502480b2015-06-24 15:53:07 -060011311 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011312 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011313 ASSERT_VK_SUCCESS(err);
11314
11315 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011316 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011317 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011318 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011319 alloc_info.descriptorPool = ds_pool;
11320 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011321 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011322 ASSERT_VK_SUCCESS(err);
11323
Tony Barboureb254902015-07-15 12:50:33 -060011324 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011325 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011326 pipe_ms_state_ci.pNext = NULL;
11327 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11328 pipe_ms_state_ci.sampleShadingEnable = 0;
11329 pipe_ms_state_ci.minSampleShading = 1.0;
11330 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011331
Tony Barboureb254902015-07-15 12:50:33 -060011332 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011333 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11334 pipeline_layout_ci.pNext = NULL;
11335 pipeline_layout_ci.setLayoutCount = 1;
11336 pipeline_layout_ci.pSetLayouts = &ds_layout;
11337 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011338
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011339 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011340 ASSERT_VK_SUCCESS(err);
11341
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011342 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011343 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 -060011344 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011345 VkPipelineObj pipe(m_device);
11346 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011347 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011348 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011349 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011350 pipe.SetViewport(m_viewports);
11351 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011352 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011353
Tony Barbour552f6c02016-12-21 14:34:07 -070011354 m_commandBuffer->BeginCommandBuffer();
11355 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011356 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011357 // Don't care about actual data, just need to get to draw to flag error
11358 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011359 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011360 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011361 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011362
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011363 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011364
Chia-I Wuf7458c52015-10-26 21:10:41 +080011365 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11366 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11367 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011368}
Mark Muellerdfe37552016-07-07 14:47:42 -060011369
Mark Mueller2ee294f2016-08-04 12:59:48 -060011370TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011371 TEST_DESCRIPTION(
11372 "Use an invalid count in a vkEnumeratePhysicalDevices call."
11373 "Use invalid Queue Family Index in vkCreateDevice");
Tony Barbour1fa09702017-03-16 12:09:08 -060011374 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011375
Mark Mueller880fce52016-08-17 15:23:23 -060011376 // The following test fails with recent NVidia drivers.
11377 // By the time core_validation is reached, the NVidia
11378 // driver has sanitized the invalid condition and core_validation
11379 // is not introduced to the failure condition. This is not the case
11380 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011381 // uint32_t count = static_cast<uint32_t>(~0);
11382 // VkPhysicalDevice physical_device;
11383 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
11384 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011385
Mark Mueller2ee294f2016-08-04 12:59:48 -060011386 float queue_priority = 0.0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011387 VkDeviceQueueCreateInfo queue_create_info = {};
11388 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11389 queue_create_info.queueCount = 1;
11390 queue_create_info.pQueuePriorities = &queue_priority;
11391 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
11392
11393 VkPhysicalDeviceFeatures features = m_device->phy().features();
11394 VkDevice testDevice;
11395 VkDeviceCreateInfo device_create_info = {};
11396 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11397 device_create_info.queueCreateInfoCount = 1;
11398 device_create_info.pQueueCreateInfos = &queue_create_info;
11399 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011400
11401 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11402 "Invalid queue create request in vkCreateDevice(). Invalid queueFamilyIndex ");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011403 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms that do
11404 // not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11405 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011406 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11407 m_errorMonitor->VerifyFound();
11408
11409 queue_create_info.queueFamilyIndex = 1;
11410
11411 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
11412 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
11413 for (unsigned i = 0; i < feature_count; i++) {
11414 if (VK_FALSE == feature_array[i]) {
11415 feature_array[i] = VK_TRUE;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011416 device_create_info.pEnabledFeatures = &features;
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011417 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11418 "While calling vkCreateDevice(), requesting feature #");
Jeremy Hayes17fd3662017-03-17 11:51:11 -060011419 // The following unexpected error is coming from the LunarG loader. Do not make it a desired message because platforms
11420 // that do not use the LunarG loader (e.g. Android) will not see the message and the test will fail.
11421 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Jeremy Hayesb26fd042017-03-10 09:13:22 -070011422 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11423 "You requested features that are unavailable on this device. You should first "
11424 "query feature availability by calling vkGetPhysicalDeviceFeatures().");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011425 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11426 m_errorMonitor->VerifyFound();
11427 break;
11428 }
11429 }
11430}
11431
Tobin Ehlis16edf082016-11-21 12:33:49 -070011432TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
11433 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
11434
Tony Barbour1fa09702017-03-16 12:09:08 -060011435 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis16edf082016-11-21 12:33:49 -070011436
11437 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
11438 std::vector<VkDeviceQueueCreateInfo> queue_info;
11439 queue_info.reserve(queue_props.size());
11440 std::vector<std::vector<float>> queue_priorities;
11441 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
11442 VkDeviceQueueCreateInfo qi{};
11443 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11444 qi.queueFamilyIndex = i;
11445 qi.queueCount = queue_props[i].queueCount;
11446 queue_priorities.emplace_back(qi.queueCount, 0.0f);
11447 qi.pQueuePriorities = queue_priorities[i].data();
11448 queue_info.push_back(qi);
11449 }
11450
11451 std::vector<const char *> device_extension_names;
11452
11453 VkDevice local_device;
11454 VkDeviceCreateInfo device_create_info = {};
11455 auto features = m_device->phy().features();
11456 // Intentionally disable pipeline stats
11457 features.pipelineStatisticsQuery = VK_FALSE;
11458 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11459 device_create_info.pNext = NULL;
11460 device_create_info.queueCreateInfoCount = queue_info.size();
11461 device_create_info.pQueueCreateInfos = queue_info.data();
11462 device_create_info.enabledLayerCount = 0;
11463 device_create_info.ppEnabledLayerNames = NULL;
11464 device_create_info.pEnabledFeatures = &features;
11465 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
11466 ASSERT_VK_SUCCESS(err);
11467
11468 VkQueryPoolCreateInfo qpci{};
11469 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11470 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
11471 qpci.queryCount = 1;
11472 VkQueryPool query_pool;
11473
11474 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
11475 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
11476 m_errorMonitor->VerifyFound();
11477
11478 vkDestroyDevice(local_device, nullptr);
11479}
11480
Mark Mueller2ee294f2016-08-04 12:59:48 -060011481TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011482 TEST_DESCRIPTION(
11483 "Use an invalid queue index in a vkCmdWaitEvents call."
11484 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011485
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011486 const char *invalid_queue_index =
11487 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
11488 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
11489 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011490
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011491 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011492
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011493 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011494
Tony Barbour1fa09702017-03-16 12:09:08 -060011495 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011496
11497 VkEvent event;
11498 VkEventCreateInfo event_create_info{};
11499 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11500 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11501
Mark Mueller2ee294f2016-08-04 12:59:48 -060011502 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011503 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011504
Tony Barbour552f6c02016-12-21 14:34:07 -070011505 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011506
11507 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011508 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 -060011509 ASSERT_TRUE(image.initialized());
11510 VkImageMemoryBarrier img_barrier = {};
11511 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11512 img_barrier.pNext = NULL;
11513 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
11514 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
11515 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11516 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11517 img_barrier.image = image.handle();
11518 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060011519
11520 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
11521 // that layer validation catches the case when it is not.
11522 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011523 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11524 img_barrier.subresourceRange.baseArrayLayer = 0;
11525 img_barrier.subresourceRange.baseMipLevel = 0;
11526 img_barrier.subresourceRange.layerCount = 1;
11527 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011528 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
11529 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011530 m_errorMonitor->VerifyFound();
11531
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011532 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011533
11534 VkQueryPool query_pool;
11535 VkQueryPoolCreateInfo query_pool_create_info = {};
11536 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11537 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
11538 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011539 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011540
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011541 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011542 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
11543
11544 vkEndCommandBuffer(m_commandBuffer->handle());
11545 m_errorMonitor->VerifyFound();
11546
11547 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
11548 vkDestroyEvent(m_device->device(), event, nullptr);
11549}
11550
Mark Muellerdfe37552016-07-07 14:47:42 -060011551TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011552 TEST_DESCRIPTION(
11553 "Submit a command buffer using deleted vertex buffer, "
11554 "delete a buffer twice, use an invalid offset for each "
11555 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060011556
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011557 const char *deleted_buffer_in_command_buffer =
11558 "Cannot submit cmd buffer "
11559 "using deleted buffer ";
11560 const char *invalid_offset_message =
11561 "vkBindBufferMemory(): "
11562 "memoryOffset is 0x";
11563 const char *invalid_storage_buffer_offset_message =
11564 "vkBindBufferMemory(): "
11565 "storage memoryOffset "
11566 "is 0x";
11567 const char *invalid_texel_buffer_offset_message =
11568 "vkBindBufferMemory(): "
11569 "texel memoryOffset "
11570 "is 0x";
11571 const char *invalid_uniform_buffer_offset_message =
11572 "vkBindBufferMemory(): "
11573 "uniform memoryOffset "
11574 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060011575
Tony Barbour1fa09702017-03-16 12:09:08 -060011576 ASSERT_NO_FATAL_FAILURE(Init());
Mark Muellerdfe37552016-07-07 14:47:42 -060011577 ASSERT_NO_FATAL_FAILURE(InitViewport());
11578 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11579
11580 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011581 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060011582 pipe_ms_state_ci.pNext = NULL;
11583 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11584 pipe_ms_state_ci.sampleShadingEnable = 0;
11585 pipe_ms_state_ci.minSampleShading = 1.0;
11586 pipe_ms_state_ci.pSampleMask = nullptr;
11587
11588 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11589 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11590 VkPipelineLayout pipeline_layout;
11591
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011592 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060011593 ASSERT_VK_SUCCESS(err);
11594
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011595 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11596 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060011597 VkPipelineObj pipe(m_device);
11598 pipe.AddShader(&vs);
11599 pipe.AddShader(&fs);
11600 pipe.AddColorAttachment();
11601 pipe.SetMSAA(&pipe_ms_state_ci);
11602 pipe.SetViewport(m_viewports);
11603 pipe.SetScissor(m_scissors);
11604 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11605
Tony Barbour552f6c02016-12-21 14:34:07 -070011606 m_commandBuffer->BeginCommandBuffer();
11607 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011608 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060011609
11610 {
11611 // Create and bind a vertex buffer in a reduced scope, which will cause
11612 // it to be deleted upon leaving this scope
11613 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011614 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060011615 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11616 draw_verticies.AddVertexInputToPipe(pipe);
11617 }
11618
11619 Draw(1, 0, 0, 0);
11620
Tony Barbour552f6c02016-12-21 14:34:07 -070011621 m_commandBuffer->EndRenderPass();
11622 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060011623
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011624 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060011625 QueueCommandBuffer(false);
11626 m_errorMonitor->VerifyFound();
11627
11628 {
11629 // Create and bind a vertex buffer in a reduced scope, and delete it
11630 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011631 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011632 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060011633 buffer_test.TestDoubleDestroy();
11634 }
11635 m_errorMonitor->VerifyFound();
11636
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011637 m_errorMonitor->SetUnexpectedError("value of pCreateInfo->usage must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011638 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011639 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011640 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011641 m_errorMonitor->SetUnexpectedError(
11642 "If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, "
11643 "memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011644 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
11645 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011646 m_errorMonitor->VerifyFound();
11647 }
11648
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011649 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
11650 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011651 // Create and bind a memory buffer with an invalid offset again,
11652 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011653 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011654 m_errorMonitor->SetUnexpectedError(
11655 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11656 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011657 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11658 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011659 m_errorMonitor->VerifyFound();
11660 }
11661
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011662 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011663 // Create and bind a memory buffer with an invalid offset again, but
11664 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011665 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011666 m_errorMonitor->SetUnexpectedError(
11667 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11668 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011669 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11670 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011671 m_errorMonitor->VerifyFound();
11672 }
11673
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011674 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011675 // Create and bind a memory buffer with an invalid offset again, but
11676 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011677 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011678 m_errorMonitor->SetUnexpectedError(
11679 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11680 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011681 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11682 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011683 m_errorMonitor->VerifyFound();
11684 }
11685
11686 {
11687 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011689 m_errorMonitor->SetUnexpectedError("required parameter memory specified as VK_NULL_HANDLE");
11690 m_errorMonitor->SetUnexpectedError("memory must be a valid VkDeviceMemory handle");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011691 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
11692 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011693 m_errorMonitor->VerifyFound();
11694 }
11695
11696 {
11697 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011698 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011699 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
11700 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011701 }
11702 m_errorMonitor->VerifyFound();
11703
11704 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11705}
11706
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011707// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11708TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011709 TEST_DESCRIPTION(
11710 "Hit all possible validation checks associated with the "
11711 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11712 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011713 // 3 in ValidateCmdBufImageLayouts
11714 // * -1 Attempt to submit cmd buf w/ deleted image
11715 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11716 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011717
Tony Barbour1fa09702017-03-16 12:09:08 -060011718 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070011719 auto depth_format = find_depth_stencil_format(m_device);
11720 if (!depth_format) {
11721 printf(" No Depth + Stencil format found. Skipped.\n");
11722 return;
11723 }
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011724 // Create src & dst images to use for copy operations
11725 VkImage src_image;
11726 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080011727 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011728
11729 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11730 const int32_t tex_width = 32;
11731 const int32_t tex_height = 32;
11732
11733 VkImageCreateInfo image_create_info = {};
11734 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11735 image_create_info.pNext = NULL;
11736 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11737 image_create_info.format = tex_format;
11738 image_create_info.extent.width = tex_width;
11739 image_create_info.extent.height = tex_height;
11740 image_create_info.extent.depth = 1;
11741 image_create_info.mipLevels = 1;
11742 image_create_info.arrayLayers = 4;
11743 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11744 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11745 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080011746 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011747 image_create_info.flags = 0;
11748
11749 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11750 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011751 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011752 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11753 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011754 image_create_info.format = VK_FORMAT_D32_SFLOAT;
11755 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
11756 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
11757 ASSERT_VK_SUCCESS(err);
11758
11759 // Allocate memory
11760 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080011761 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080011762 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080011763 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11764 mem_alloc.pNext = NULL;
11765 mem_alloc.allocationSize = 0;
11766 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080011767
11768 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011769 mem_alloc.allocationSize = img_mem_reqs.size;
11770 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011771 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080011772 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080011773 ASSERT_VK_SUCCESS(err);
11774
11775 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011776 mem_alloc.allocationSize = img_mem_reqs.size;
11777 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011778 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011779 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080011780 ASSERT_VK_SUCCESS(err);
11781
11782 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011783 mem_alloc.allocationSize = img_mem_reqs.size;
11784 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011785 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011786 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080011787 ASSERT_VK_SUCCESS(err);
11788
11789 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
11790 ASSERT_VK_SUCCESS(err);
11791 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
11792 ASSERT_VK_SUCCESS(err);
11793 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
11794 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011795
Tony Barbour552f6c02016-12-21 14:34:07 -070011796 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080011797 VkImageCopy copy_region;
11798 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11799 copy_region.srcSubresource.mipLevel = 0;
11800 copy_region.srcSubresource.baseArrayLayer = 0;
11801 copy_region.srcSubresource.layerCount = 1;
11802 copy_region.srcOffset.x = 0;
11803 copy_region.srcOffset.y = 0;
11804 copy_region.srcOffset.z = 0;
11805 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11806 copy_region.dstSubresource.mipLevel = 0;
11807 copy_region.dstSubresource.baseArrayLayer = 0;
11808 copy_region.dstSubresource.layerCount = 1;
11809 copy_region.dstOffset.x = 0;
11810 copy_region.dstOffset.y = 0;
11811 copy_region.dstOffset.z = 0;
11812 copy_region.extent.width = 1;
11813 copy_region.extent.height = 1;
11814 copy_region.extent.depth = 1;
11815
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011816 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11817 "layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11818 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011819
Cort530cf382016-12-08 09:59:47 -080011820 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 -060011821 m_errorMonitor->VerifyFound();
Tobin Ehlise35b66a2017-03-15 12:18:31 -060011822 // The first call hits the expected WARNING and skips the call down the chain, so call a second time to call down chain and
11823 // update layer state
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011824 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
11825 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
Tobin Ehlise35b66a2017-03-15 12:18:31 -060011826 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 -060011827 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011828 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011829 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that "
11830 "doesn't match the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011831 m_errorMonitor->SetUnexpectedError(
11832 "srcImageLayout must be either of VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL");
Cort530cf382016-12-08 09:59:47 -080011833 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 -060011834 m_errorMonitor->VerifyFound();
11835 // Final src error is due to bad layout type
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011836 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011837 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011838 "VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011839 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011840 "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 -080011841 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 -060011842 m_errorMonitor->VerifyFound();
11843 // Now verify same checks for dst
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011844 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11845 "layout should be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL instead of GENERAL.");
11846 m_errorMonitor->SetUnexpectedError("layout should be VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011847 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 -060011848 m_errorMonitor->VerifyFound();
11849 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011850 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011851 "with specific layout VK_IMAGE_LAYOUT_UNDEFINED that doesn't match "
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011852 "the actual current layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011853 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011854 "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 -080011855 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 -060011856 m_errorMonitor->VerifyFound();
Tobin Ehlis74cc6822017-03-14 16:16:51 -060011857 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011858 "is VK_IMAGE_LAYOUT_UNDEFINED but can only be VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL "
11859 "or VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011860 m_errorMonitor->SetUnexpectedError(
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011861 "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 -080011862 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 -060011863 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011864
Cort3b021012016-12-07 12:00:57 -080011865 // Convert dst and depth images to TRANSFER_DST for subsequent tests
11866 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
11867 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11868 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
11869 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
11870 transfer_dst_image_barrier[0].srcAccessMask = 0;
11871 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
11872 transfer_dst_image_barrier[0].image = dst_image;
11873 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11874 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
11875 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11876 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11877 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11878 transfer_dst_image_barrier[0].image = depth_image;
11879 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
11880 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11881 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11882
11883 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080011884 VkClearColorValue color_clear_value = {};
11885 VkImageSubresourceRange clear_range;
11886 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11887 clear_range.baseMipLevel = 0;
11888 clear_range.baseArrayLayer = 0;
11889 clear_range.layerCount = 1;
11890 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011891
Cort3b021012016-12-07 12:00:57 -080011892 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
11893 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11894 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
11895 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011896 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011897 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011898 // Fail due to provided layout not matching actual current layout for color clear.
11899 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011900 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011901 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011902
Cort530cf382016-12-08 09:59:47 -080011903 VkClearDepthStencilValue depth_clear_value = {};
11904 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080011905
11906 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
11907 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11908 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
11909 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011910 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011911 m_errorMonitor->VerifyFound();
11912 // Fail due to provided layout not matching actual current layout for depth clear.
11913 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011914 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011915 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011916
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011917 // Now cause error due to bad image layout transition in PipelineBarrier
11918 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080011919 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011920 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080011921 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011922 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080011923 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11924 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011925 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011926 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060011927 "you cannot transition the layout of aspect 1 from "
11928 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when current layout is "
11929 "VK_IMAGE_LAYOUT_GENERAL.");
Mike Weiblen62d08a32017-03-07 22:18:27 -070011930 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00305);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011931 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11932 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011933 m_errorMonitor->VerifyFound();
11934
11935 // Finally some layout errors at RenderPass create time
11936 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
11937 VkAttachmentReference attach = {};
11938 // perf warning for GENERAL layout w/ non-DS input attachment
11939 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11940 VkSubpassDescription subpass = {};
11941 subpass.inputAttachmentCount = 1;
11942 subpass.pInputAttachments = &attach;
11943 VkRenderPassCreateInfo rpci = {};
11944 rpci.subpassCount = 1;
11945 rpci.pSubpasses = &subpass;
11946 rpci.attachmentCount = 1;
11947 VkAttachmentDescription attach_desc = {};
11948 attach_desc.format = VK_FORMAT_UNDEFINED;
11949 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060011950 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011951 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011952 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11953 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011954 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11955 m_errorMonitor->VerifyFound();
11956 // error w/ non-general layout
11957 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11958
11959 m_errorMonitor->SetDesiredFailureMsg(
11960 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11961 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
11962 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11963 m_errorMonitor->VerifyFound();
11964 subpass.inputAttachmentCount = 0;
11965 subpass.colorAttachmentCount = 1;
11966 subpass.pColorAttachments = &attach;
11967 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11968 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011969 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11970 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011971 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11972 m_errorMonitor->VerifyFound();
11973 // error w/ non-color opt or GENERAL layout for color attachment
11974 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11975 m_errorMonitor->SetDesiredFailureMsg(
11976 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11977 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
11978 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11979 m_errorMonitor->VerifyFound();
11980 subpass.colorAttachmentCount = 0;
11981 subpass.pDepthStencilAttachment = &attach;
11982 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11983 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011984 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11985 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011986 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11987 m_errorMonitor->VerifyFound();
11988 // error w/ non-ds opt or GENERAL layout for color attachment
11989 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011990 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11991 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
11992 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011993 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11994 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060011995 // For this error we need a valid renderpass so create default one
11996 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11997 attach.attachment = 0;
Tony Barbourf887b162017-03-09 10:06:46 -070011998 attach_desc.format = depth_format;
Tobin Ehlis1efce022016-05-11 10:40:34 -060011999 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
12000 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
12001 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
12002 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
12003 // Can't do a CLEAR load on READ_ONLY initialLayout
12004 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
12005 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
12006 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012007 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinski91c28262017-03-22 13:06:12 -060012008 "with invalid first layout VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060012009 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
12010 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012011
Cort3b021012016-12-07 12:00:57 -080012012 vkFreeMemory(m_device->device(), src_image_mem, NULL);
12013 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
12014 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012015 vkDestroyImage(m_device->device(), src_image, NULL);
12016 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080012017 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060012018}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060012019
Tobin Ehlise0936662016-10-11 08:10:51 -060012020TEST_F(VkLayerTest, InvalidStorageImageLayout) {
12021 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
12022 VkResult err;
12023
Tony Barbour1fa09702017-03-16 12:09:08 -060012024 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlise0936662016-10-11 08:10:51 -060012025
12026 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
12027 VkImageTiling tiling;
12028 VkFormatProperties format_properties;
12029 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
12030 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12031 tiling = VK_IMAGE_TILING_LINEAR;
12032 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
12033 tiling = VK_IMAGE_TILING_OPTIMAL;
12034 } else {
Dave Houlton584d51e2017-02-16 12:52:54 -070012035 printf(" Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060012036 return;
12037 }
12038
12039 VkDescriptorPoolSize ds_type = {};
12040 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12041 ds_type.descriptorCount = 1;
12042
12043 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12044 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12045 ds_pool_ci.maxSets = 1;
12046 ds_pool_ci.poolSizeCount = 1;
12047 ds_pool_ci.pPoolSizes = &ds_type;
12048 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
12049
12050 VkDescriptorPool ds_pool;
12051 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12052 ASSERT_VK_SUCCESS(err);
12053
12054 VkDescriptorSetLayoutBinding dsl_binding = {};
12055 dsl_binding.binding = 0;
12056 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12057 dsl_binding.descriptorCount = 1;
12058 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12059 dsl_binding.pImmutableSamplers = NULL;
12060
12061 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12062 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12063 ds_layout_ci.pNext = NULL;
12064 ds_layout_ci.bindingCount = 1;
12065 ds_layout_ci.pBindings = &dsl_binding;
12066
12067 VkDescriptorSetLayout ds_layout;
12068 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12069 ASSERT_VK_SUCCESS(err);
12070
12071 VkDescriptorSetAllocateInfo alloc_info = {};
12072 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12073 alloc_info.descriptorSetCount = 1;
12074 alloc_info.descriptorPool = ds_pool;
12075 alloc_info.pSetLayouts = &ds_layout;
12076 VkDescriptorSet descriptor_set;
12077 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12078 ASSERT_VK_SUCCESS(err);
12079
12080 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12081 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12082 pipeline_layout_ci.pNext = NULL;
12083 pipeline_layout_ci.setLayoutCount = 1;
12084 pipeline_layout_ci.pSetLayouts = &ds_layout;
12085 VkPipelineLayout pipeline_layout;
12086 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12087 ASSERT_VK_SUCCESS(err);
12088
12089 VkImageObj image(m_device);
12090 image.init(32, 32, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
12091 ASSERT_TRUE(image.initialized());
12092 VkImageView view = image.targetView(tex_format);
12093
12094 VkDescriptorImageInfo image_info = {};
12095 image_info.imageView = view;
12096 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12097
12098 VkWriteDescriptorSet descriptor_write = {};
12099 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12100 descriptor_write.dstSet = descriptor_set;
12101 descriptor_write.dstBinding = 0;
12102 descriptor_write.descriptorCount = 1;
12103 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12104 descriptor_write.pImageInfo = &image_info;
12105
12106 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12107 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
12108 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
12109 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12110 m_errorMonitor->VerifyFound();
12111
12112 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12113 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12114 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
12115 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12116}
12117
Mark Mueller93b938f2016-08-18 10:27:40 -060012118TEST_F(VkLayerTest, SimultaneousUse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012119 TEST_DESCRIPTION(
12120 "Use vkCmdExecuteCommands with invalid state "
12121 "in primary and secondary command buffers.");
Mark Mueller93b938f2016-08-18 10:27:40 -060012122
Tony Barbour1fa09702017-03-16 12:09:08 -060012123 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller93b938f2016-08-18 10:27:40 -060012124 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12125
Mike Weiblen95dd0f92016-10-19 12:28:27 -060012126 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012127 const char *simultaneous_use_message2 =
12128 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
12129 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060012130
12131 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012132 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012133 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012134 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12135 command_buffer_allocate_info.commandBufferCount = 1;
12136
12137 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012138 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060012139 VkCommandBufferBeginInfo command_buffer_begin_info = {};
12140 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012141 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060012142 command_buffer_inheritance_info.renderPass = m_renderPass;
12143 command_buffer_inheritance_info.framebuffer = m_framebuffer;
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012144
Mark Mueller93b938f2016-08-18 10:27:40 -060012145 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012146 command_buffer_begin_info.flags =
12147 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060012148 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
12149
12150 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
12151 vkEndCommandBuffer(secondary_command_buffer);
12152
Mark Mueller93b938f2016-08-18 10:27:40 -060012153 VkSubmitInfo submit_info = {};
12154 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12155 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012156 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012157
Mark Mueller4042b652016-09-05 22:52:21 -060012158 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012159 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
12160 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
12161 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012162 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012163 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012164 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12165 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060012166
Dave Houltonfbf52152017-01-06 12:55:29 -070012167 m_errorMonitor->ExpectSuccess(0);
Mark Mueller93b938f2016-08-18 10:27:40 -060012168 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070012169 m_errorMonitor->VerifyNotFound();
Mark Mueller93b938f2016-08-18 10:27:40 -060012170
Mark Mueller4042b652016-09-05 22:52:21 -060012171 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012172 m_errorMonitor->SetUnexpectedError("commandBuffer must not currently be pending execution");
12173 m_errorMonitor->SetUnexpectedError(
12174 "If commandBuffer was allocated from a VkCommandPool which did not have the "
12175 "VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT flag set, commandBuffer must be in the initial state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012176 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012177 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060012178
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012179 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
12180 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012181 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012182 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12183 vkEndCommandBuffer(m_commandBuffer->handle());
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012184
12185 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012186
12187 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be pending execution");
Mark Mueller93b938f2016-08-18 10:27:40 -060012188}
12189
Tony Barbour626994c2017-02-08 15:29:37 -070012190TEST_F(VkLayerTest, SimultaneousUseOneShot) {
12191 TEST_DESCRIPTION(
12192 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
12193 "errors");
12194 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
12195 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 -060012196 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070012197
12198 VkCommandBuffer cmd_bufs[2];
12199 VkCommandBufferAllocateInfo alloc_info;
12200 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12201 alloc_info.pNext = NULL;
12202 alloc_info.commandBufferCount = 2;
Mike Schuchardt06304c22017-03-01 17:09:09 -070012203 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070012204 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12205 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
12206
12207 VkCommandBufferBeginInfo cb_binfo;
12208 cb_binfo.pNext = NULL;
12209 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12210 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
12211 cb_binfo.flags = 0;
12212 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
12213 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12214 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
12215 vkEndCommandBuffer(cmd_bufs[0]);
12216 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
12217
12218 VkSubmitInfo submit_info = {};
12219 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12220 submit_info.commandBufferCount = 2;
12221 submit_info.pCommandBuffers = duplicates;
12222 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
12223 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12224 m_errorMonitor->VerifyFound();
12225 vkQueueWaitIdle(m_device->m_queue);
12226
12227 // Set one time use and now look for one time submit
12228 duplicates[0] = duplicates[1] = cmd_bufs[1];
12229 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
12230 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
12231 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
12232 vkEndCommandBuffer(cmd_bufs[1]);
12233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
12234 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12235 m_errorMonitor->VerifyFound();
12236 vkQueueWaitIdle(m_device->m_queue);
12237}
12238
Tobin Ehlisb093da82017-01-19 12:05:27 -070012239TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012240 TEST_DESCRIPTION(
12241 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
12242 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070012243
Tony Barbour1fa09702017-03-16 12:09:08 -060012244 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisb093da82017-01-19 12:05:27 -070012245 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12246
12247 std::vector<const char *> device_extension_names;
12248 auto features = m_device->phy().features();
12249 // Make sure gs & ts are disabled
12250 features.geometryShader = false;
12251 features.tessellationShader = false;
12252 // The sacrificial device object
12253 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
12254
12255 VkCommandPoolCreateInfo pool_create_info{};
12256 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
12257 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
12258
12259 VkCommandPool command_pool;
12260 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
12261
12262 VkCommandBufferAllocateInfo cmd = {};
12263 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12264 cmd.pNext = NULL;
12265 cmd.commandPool = command_pool;
12266 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12267 cmd.commandBufferCount = 1;
12268
12269 VkCommandBuffer cmd_buffer;
12270 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
12271 ASSERT_VK_SUCCESS(err);
12272
12273 VkEvent event;
12274 VkEventCreateInfo evci = {};
12275 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12276 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
12277 ASSERT_VK_SUCCESS(result);
12278
12279 VkCommandBufferBeginInfo cbbi = {};
12280 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12281 vkBeginCommandBuffer(cmd_buffer, &cbbi);
12282 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
12283 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
12284 m_errorMonitor->VerifyFound();
12285
12286 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
12287 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
12288 m_errorMonitor->VerifyFound();
12289
12290 vkDestroyEvent(test_device.handle(), event, NULL);
12291 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
12292}
12293
Mark Mueller917f6bc2016-08-30 10:57:19 -060012294TEST_F(VkLayerTest, InUseDestroyedSignaled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012295 TEST_DESCRIPTION(
12296 "Use vkCmdExecuteCommands with invalid state "
12297 "in primary and secondary command buffers. "
12298 "Delete objects that are inuse. Call VkQueueSubmit "
12299 "with an event that has been deleted.");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012300
Tony Barbour1fa09702017-03-16 12:09:08 -060012301 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller917f6bc2016-08-30 10:57:19 -060012302 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12303
Tony Barbour552f6c02016-12-21 14:34:07 -070012304 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012305
12306 VkEvent event;
12307 VkEventCreateInfo event_create_info = {};
12308 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12309 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012310 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012311
Tony Barbour552f6c02016-12-21 14:34:07 -070012312 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060012313 vkDestroyEvent(m_device->device(), event, nullptr);
12314
12315 VkSubmitInfo submit_info = {};
12316 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12317 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012318 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskife4be302017-02-14 13:08:15 -070012319 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound");
Mark Muellerc8d441e2016-08-23 17:36:00 -060012320 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12321 m_errorMonitor->VerifyFound();
12322
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012323 m_errorMonitor->ExpectSuccess(0); // disable all log message processing with flags==0
Mark Muellerc8d441e2016-08-23 17:36:00 -060012324 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
12325
12326 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12327
Mark Mueller917f6bc2016-08-30 10:57:19 -060012328 VkSemaphoreCreateInfo semaphore_create_info = {};
12329 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
12330 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012331 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012332 VkFenceCreateInfo fence_create_info = {};
12333 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
12334 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012335 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012336
12337 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012338 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012339 descriptor_pool_type_count.descriptorCount = 1;
12340
12341 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12342 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12343 descriptor_pool_create_info.maxSets = 1;
12344 descriptor_pool_create_info.poolSizeCount = 1;
12345 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012346 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012347
12348 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012349 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012350
12351 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012352 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012353 descriptorset_layout_binding.descriptorCount = 1;
12354 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
12355
12356 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012357 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012358 descriptorset_layout_create_info.bindingCount = 1;
12359 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12360
12361 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012362 ASSERT_VK_SUCCESS(
12363 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012364
12365 VkDescriptorSet descriptorset;
12366 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012367 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012368 descriptorset_allocate_info.descriptorSetCount = 1;
12369 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12370 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012371 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012372
Mark Mueller4042b652016-09-05 22:52:21 -060012373 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
12374
12375 VkDescriptorBufferInfo buffer_info = {};
12376 buffer_info.buffer = buffer_test.GetBuffer();
12377 buffer_info.offset = 0;
12378 buffer_info.range = 1024;
12379
12380 VkWriteDescriptorSet write_descriptor_set = {};
12381 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12382 write_descriptor_set.dstSet = descriptorset;
12383 write_descriptor_set.descriptorCount = 1;
12384 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12385 write_descriptor_set.pBufferInfo = &buffer_info;
12386
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012387 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060012388
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012389 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12390 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012391
12392 VkPipelineObj pipe(m_device);
12393 pipe.AddColorAttachment();
12394 pipe.AddShader(&vs);
12395 pipe.AddShader(&fs);
12396
12397 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012398 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012399 pipeline_layout_create_info.setLayoutCount = 1;
12400 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12401
12402 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012403 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012404
12405 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
12406
Tony Barbour552f6c02016-12-21 14:34:07 -070012407 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012408 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060012409
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012410 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12411 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12412 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012413
Tony Barbour552f6c02016-12-21 14:34:07 -070012414 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012415
Mark Mueller917f6bc2016-08-30 10:57:19 -060012416 submit_info.signalSemaphoreCount = 1;
12417 submit_info.pSignalSemaphores = &semaphore;
12418 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012419 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060012420
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012421 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012422 vkDestroyEvent(m_device->device(), event, nullptr);
12423 m_errorMonitor->VerifyFound();
12424
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012425 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012426 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
12427 m_errorMonitor->VerifyFound();
12428
Jeremy Hayes08369882017-02-02 10:31:06 -070012429 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012430 vkDestroyFence(m_device->device(), fence, nullptr);
12431 m_errorMonitor->VerifyFound();
12432
Tobin Ehlis122207b2016-09-01 08:50:06 -070012433 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012434 m_errorMonitor->SetUnexpectedError("If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle");
12435 m_errorMonitor->SetUnexpectedError("Unable to remove Semaphore obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012436 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012437 m_errorMonitor->SetUnexpectedError("If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle");
12438 m_errorMonitor->SetUnexpectedError("Unable to remove Fence obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012439 vkDestroyFence(m_device->device(), fence, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012440 m_errorMonitor->SetUnexpectedError("If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle");
12441 m_errorMonitor->SetUnexpectedError("Unable to remove Event obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012442 vkDestroyEvent(m_device->device(), event, nullptr);
12443 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012444 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012445 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12446}
12447
Tobin Ehlis2adda372016-09-01 08:51:06 -070012448TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
12449 TEST_DESCRIPTION("Delete in-use query pool.");
12450
Tony Barbour1fa09702017-03-16 12:09:08 -060012451 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis2adda372016-09-01 08:51:06 -070012452 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12453
12454 VkQueryPool query_pool;
12455 VkQueryPoolCreateInfo query_pool_ci{};
12456 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12457 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
12458 query_pool_ci.queryCount = 1;
12459 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070012460 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012461 // Reset query pool to create binding with cmd buffer
12462 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
12463
Tony Barbour552f6c02016-12-21 14:34:07 -070012464 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012465
12466 VkSubmitInfo submit_info = {};
12467 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12468 submit_info.commandBufferCount = 1;
12469 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12470 // Submit cmd buffer and then destroy query pool while in-flight
12471 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12472
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012473 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070012474 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12475 m_errorMonitor->VerifyFound();
12476
12477 vkQueueWaitIdle(m_device->m_queue);
12478 // Now that cmd buffer done we can safely destroy query_pool
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012479 m_errorMonitor->SetUnexpectedError("If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle");
12480 m_errorMonitor->SetUnexpectedError("Unable to remove Query Pool obj");
Tobin Ehlis2adda372016-09-01 08:51:06 -070012481 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12482}
12483
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012484TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
12485 TEST_DESCRIPTION("Delete in-use pipeline.");
12486
Tony Barbour1fa09702017-03-16 12:09:08 -060012487 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012488 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12489
12490 // Empty pipeline layout used for binding PSO
12491 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12492 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12493 pipeline_layout_ci.setLayoutCount = 0;
12494 pipeline_layout_ci.pSetLayouts = NULL;
12495
12496 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012497 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012498 ASSERT_VK_SUCCESS(err);
12499
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012500 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012501 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012502 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12503 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012504 // Store pipeline handle so we can actually delete it before test finishes
12505 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012506 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012507 VkPipelineObj pipe(m_device);
12508 pipe.AddShader(&vs);
12509 pipe.AddShader(&fs);
12510 pipe.AddColorAttachment();
12511 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12512 delete_this_pipeline = pipe.handle();
12513
Tony Barbour552f6c02016-12-21 14:34:07 -070012514 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012515 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012516 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012517
Tony Barbour552f6c02016-12-21 14:34:07 -070012518 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012519
12520 VkSubmitInfo submit_info = {};
12521 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12522 submit_info.commandBufferCount = 1;
12523 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12524 // Submit cmd buffer and then pipeline destroyed while in-flight
12525 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012526 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012527 m_errorMonitor->VerifyFound();
12528 // Make sure queue finished and then actually delete pipeline
12529 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012530 m_errorMonitor->SetUnexpectedError("If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle");
12531 m_errorMonitor->SetUnexpectedError("Unable to remove Pipeline obj");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012532 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
12533 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
12534}
12535
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012536TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
12537 TEST_DESCRIPTION("Delete in-use imageView.");
12538
Tony Barbour1fa09702017-03-16 12:09:08 -060012539 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012540 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12541
12542 VkDescriptorPoolSize ds_type_count;
12543 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12544 ds_type_count.descriptorCount = 1;
12545
12546 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12547 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12548 ds_pool_ci.maxSets = 1;
12549 ds_pool_ci.poolSizeCount = 1;
12550 ds_pool_ci.pPoolSizes = &ds_type_count;
12551
12552 VkDescriptorPool ds_pool;
12553 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12554 ASSERT_VK_SUCCESS(err);
12555
12556 VkSamplerCreateInfo sampler_ci = {};
12557 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12558 sampler_ci.pNext = NULL;
12559 sampler_ci.magFilter = VK_FILTER_NEAREST;
12560 sampler_ci.minFilter = VK_FILTER_NEAREST;
12561 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12562 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12563 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12564 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12565 sampler_ci.mipLodBias = 1.0;
12566 sampler_ci.anisotropyEnable = VK_FALSE;
12567 sampler_ci.maxAnisotropy = 1;
12568 sampler_ci.compareEnable = VK_FALSE;
12569 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12570 sampler_ci.minLod = 1.0;
12571 sampler_ci.maxLod = 1.0;
12572 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12573 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12574 VkSampler sampler;
12575
12576 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12577 ASSERT_VK_SUCCESS(err);
12578
12579 VkDescriptorSetLayoutBinding layout_binding;
12580 layout_binding.binding = 0;
12581 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12582 layout_binding.descriptorCount = 1;
12583 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12584 layout_binding.pImmutableSamplers = NULL;
12585
12586 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12587 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12588 ds_layout_ci.bindingCount = 1;
12589 ds_layout_ci.pBindings = &layout_binding;
12590 VkDescriptorSetLayout ds_layout;
12591 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12592 ASSERT_VK_SUCCESS(err);
12593
12594 VkDescriptorSetAllocateInfo alloc_info = {};
12595 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12596 alloc_info.descriptorSetCount = 1;
12597 alloc_info.descriptorPool = ds_pool;
12598 alloc_info.pSetLayouts = &ds_layout;
12599 VkDescriptorSet descriptor_set;
12600 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12601 ASSERT_VK_SUCCESS(err);
12602
12603 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12604 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12605 pipeline_layout_ci.pNext = NULL;
12606 pipeline_layout_ci.setLayoutCount = 1;
12607 pipeline_layout_ci.pSetLayouts = &ds_layout;
12608
12609 VkPipelineLayout pipeline_layout;
12610 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12611 ASSERT_VK_SUCCESS(err);
12612
12613 VkImageObj image(m_device);
12614 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
12615 ASSERT_TRUE(image.initialized());
12616
12617 VkImageView view;
12618 VkImageViewCreateInfo ivci = {};
12619 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12620 ivci.image = image.handle();
12621 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12622 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12623 ivci.subresourceRange.layerCount = 1;
12624 ivci.subresourceRange.baseMipLevel = 0;
12625 ivci.subresourceRange.levelCount = 1;
12626 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12627
12628 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12629 ASSERT_VK_SUCCESS(err);
12630
12631 VkDescriptorImageInfo image_info{};
12632 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12633 image_info.imageView = view;
12634 image_info.sampler = sampler;
12635
12636 VkWriteDescriptorSet descriptor_write = {};
12637 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12638 descriptor_write.dstSet = descriptor_set;
12639 descriptor_write.dstBinding = 0;
12640 descriptor_write.descriptorCount = 1;
12641 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12642 descriptor_write.pImageInfo = &image_info;
12643
12644 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12645
12646 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012647 char const *vsSource =
12648 "#version 450\n"
12649 "\n"
12650 "out gl_PerVertex { \n"
12651 " vec4 gl_Position;\n"
12652 "};\n"
12653 "void main(){\n"
12654 " gl_Position = vec4(1);\n"
12655 "}\n";
12656 char const *fsSource =
12657 "#version 450\n"
12658 "\n"
12659 "layout(set=0, binding=0) uniform sampler2D s;\n"
12660 "layout(location=0) out vec4 x;\n"
12661 "void main(){\n"
12662 " x = texture(s, vec2(1));\n"
12663 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012664 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12665 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12666 VkPipelineObj pipe(m_device);
12667 pipe.AddShader(&vs);
12668 pipe.AddShader(&fs);
12669 pipe.AddColorAttachment();
12670 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12671
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012672 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012673
Tony Barbour552f6c02016-12-21 14:34:07 -070012674 m_commandBuffer->BeginCommandBuffer();
12675 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012676 // Bind pipeline to cmd buffer
12677 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12678 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12679 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070012680
12681 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12682 VkRect2D scissor = {{0, 0}, {16, 16}};
12683 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12684 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12685
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012686 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012687 m_commandBuffer->EndRenderPass();
12688 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012689 // Submit cmd buffer then destroy sampler
12690 VkSubmitInfo submit_info = {};
12691 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12692 submit_info.commandBufferCount = 1;
12693 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12694 // Submit cmd buffer and then destroy imageView while in-flight
12695 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12696
12697 vkDestroyImageView(m_device->device(), view, nullptr);
12698 m_errorMonitor->VerifyFound();
12699 vkQueueWaitIdle(m_device->m_queue);
12700 // Now we can actually destroy imageView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012701 m_errorMonitor->SetUnexpectedError("If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle");
12702 m_errorMonitor->SetUnexpectedError("Unable to remove Image View obj");
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012703 vkDestroyImageView(m_device->device(), view, NULL);
12704 vkDestroySampler(m_device->device(), sampler, nullptr);
12705 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12706 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12707 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12708}
12709
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012710TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
12711 TEST_DESCRIPTION("Delete in-use bufferView.");
12712
Tony Barbour1fa09702017-03-16 12:09:08 -060012713 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012714 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12715
12716 VkDescriptorPoolSize ds_type_count;
12717 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12718 ds_type_count.descriptorCount = 1;
12719
12720 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12721 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12722 ds_pool_ci.maxSets = 1;
12723 ds_pool_ci.poolSizeCount = 1;
12724 ds_pool_ci.pPoolSizes = &ds_type_count;
12725
12726 VkDescriptorPool ds_pool;
12727 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12728 ASSERT_VK_SUCCESS(err);
12729
12730 VkDescriptorSetLayoutBinding layout_binding;
12731 layout_binding.binding = 0;
12732 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12733 layout_binding.descriptorCount = 1;
12734 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12735 layout_binding.pImmutableSamplers = NULL;
12736
12737 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12738 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12739 ds_layout_ci.bindingCount = 1;
12740 ds_layout_ci.pBindings = &layout_binding;
12741 VkDescriptorSetLayout ds_layout;
12742 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12743 ASSERT_VK_SUCCESS(err);
12744
12745 VkDescriptorSetAllocateInfo alloc_info = {};
12746 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12747 alloc_info.descriptorSetCount = 1;
12748 alloc_info.descriptorPool = ds_pool;
12749 alloc_info.pSetLayouts = &ds_layout;
12750 VkDescriptorSet descriptor_set;
12751 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12752 ASSERT_VK_SUCCESS(err);
12753
12754 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12755 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12756 pipeline_layout_ci.pNext = NULL;
12757 pipeline_layout_ci.setLayoutCount = 1;
12758 pipeline_layout_ci.pSetLayouts = &ds_layout;
12759
12760 VkPipelineLayout pipeline_layout;
12761 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12762 ASSERT_VK_SUCCESS(err);
12763
12764 VkBuffer buffer;
12765 uint32_t queue_family_index = 0;
12766 VkBufferCreateInfo buffer_create_info = {};
12767 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
12768 buffer_create_info.size = 1024;
12769 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
12770 buffer_create_info.queueFamilyIndexCount = 1;
12771 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
12772
12773 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
12774 ASSERT_VK_SUCCESS(err);
12775
12776 VkMemoryRequirements memory_reqs;
12777 VkDeviceMemory buffer_memory;
12778
12779 VkMemoryAllocateInfo memory_info = {};
12780 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
12781 memory_info.allocationSize = 0;
12782 memory_info.memoryTypeIndex = 0;
12783
12784 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
12785 memory_info.allocationSize = memory_reqs.size;
12786 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
12787 ASSERT_TRUE(pass);
12788
12789 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
12790 ASSERT_VK_SUCCESS(err);
12791 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
12792 ASSERT_VK_SUCCESS(err);
12793
12794 VkBufferView view;
12795 VkBufferViewCreateInfo bvci = {};
12796 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
12797 bvci.buffer = buffer;
12798 bvci.format = VK_FORMAT_R8_UNORM;
12799 bvci.range = VK_WHOLE_SIZE;
12800
12801 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
12802 ASSERT_VK_SUCCESS(err);
12803
12804 VkWriteDescriptorSet descriptor_write = {};
12805 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12806 descriptor_write.dstSet = descriptor_set;
12807 descriptor_write.dstBinding = 0;
12808 descriptor_write.descriptorCount = 1;
12809 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12810 descriptor_write.pTexelBufferView = &view;
12811
12812 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12813
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012814 char const *vsSource =
12815 "#version 450\n"
12816 "\n"
12817 "out gl_PerVertex { \n"
12818 " vec4 gl_Position;\n"
12819 "};\n"
12820 "void main(){\n"
12821 " gl_Position = vec4(1);\n"
12822 "}\n";
12823 char const *fsSource =
12824 "#version 450\n"
12825 "\n"
12826 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
12827 "layout(location=0) out vec4 x;\n"
12828 "void main(){\n"
12829 " x = imageLoad(s, 0);\n"
12830 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012831 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12832 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12833 VkPipelineObj pipe(m_device);
12834 pipe.AddShader(&vs);
12835 pipe.AddShader(&fs);
12836 pipe.AddColorAttachment();
12837 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12838
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012839 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012840
Tony Barbour552f6c02016-12-21 14:34:07 -070012841 m_commandBuffer->BeginCommandBuffer();
12842 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012843 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12844 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12845 VkRect2D scissor = {{0, 0}, {16, 16}};
12846 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12847 // Bind pipeline to cmd buffer
12848 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12849 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12850 &descriptor_set, 0, nullptr);
12851 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012852 m_commandBuffer->EndRenderPass();
12853 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012854
12855 VkSubmitInfo submit_info = {};
12856 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12857 submit_info.commandBufferCount = 1;
12858 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12859 // Submit cmd buffer and then destroy bufferView while in-flight
12860 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12861
12862 vkDestroyBufferView(m_device->device(), view, nullptr);
12863 m_errorMonitor->VerifyFound();
12864 vkQueueWaitIdle(m_device->m_queue);
12865 // Now we can actually destroy bufferView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012866 m_errorMonitor->SetUnexpectedError("If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle");
12867 m_errorMonitor->SetUnexpectedError("Unable to remove Buffer View obj");
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012868 vkDestroyBufferView(m_device->device(), view, NULL);
12869 vkDestroyBuffer(m_device->device(), buffer, NULL);
12870 vkFreeMemory(m_device->device(), buffer_memory, NULL);
12871 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12872 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12873 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12874}
12875
Tobin Ehlis209532e2016-09-07 13:52:18 -060012876TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
12877 TEST_DESCRIPTION("Delete in-use sampler.");
12878
Tony Barbour1fa09702017-03-16 12:09:08 -060012879 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis209532e2016-09-07 13:52:18 -060012880 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12881
12882 VkDescriptorPoolSize ds_type_count;
12883 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12884 ds_type_count.descriptorCount = 1;
12885
12886 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12887 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12888 ds_pool_ci.maxSets = 1;
12889 ds_pool_ci.poolSizeCount = 1;
12890 ds_pool_ci.pPoolSizes = &ds_type_count;
12891
12892 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012893 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012894 ASSERT_VK_SUCCESS(err);
12895
12896 VkSamplerCreateInfo sampler_ci = {};
12897 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12898 sampler_ci.pNext = NULL;
12899 sampler_ci.magFilter = VK_FILTER_NEAREST;
12900 sampler_ci.minFilter = VK_FILTER_NEAREST;
12901 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12902 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12903 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12904 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12905 sampler_ci.mipLodBias = 1.0;
12906 sampler_ci.anisotropyEnable = VK_FALSE;
12907 sampler_ci.maxAnisotropy = 1;
12908 sampler_ci.compareEnable = VK_FALSE;
12909 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12910 sampler_ci.minLod = 1.0;
12911 sampler_ci.maxLod = 1.0;
12912 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12913 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12914 VkSampler sampler;
12915
12916 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12917 ASSERT_VK_SUCCESS(err);
12918
12919 VkDescriptorSetLayoutBinding layout_binding;
12920 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060012921 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060012922 layout_binding.descriptorCount = 1;
12923 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12924 layout_binding.pImmutableSamplers = NULL;
12925
12926 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12927 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12928 ds_layout_ci.bindingCount = 1;
12929 ds_layout_ci.pBindings = &layout_binding;
12930 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012931 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012932 ASSERT_VK_SUCCESS(err);
12933
12934 VkDescriptorSetAllocateInfo alloc_info = {};
12935 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12936 alloc_info.descriptorSetCount = 1;
12937 alloc_info.descriptorPool = ds_pool;
12938 alloc_info.pSetLayouts = &ds_layout;
12939 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012940 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012941 ASSERT_VK_SUCCESS(err);
12942
12943 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12944 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12945 pipeline_layout_ci.pNext = NULL;
12946 pipeline_layout_ci.setLayoutCount = 1;
12947 pipeline_layout_ci.pSetLayouts = &ds_layout;
12948
12949 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012950 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012951 ASSERT_VK_SUCCESS(err);
12952
12953 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012954 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 -060012955 ASSERT_TRUE(image.initialized());
12956
12957 VkImageView view;
12958 VkImageViewCreateInfo ivci = {};
12959 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12960 ivci.image = image.handle();
12961 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12962 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12963 ivci.subresourceRange.layerCount = 1;
12964 ivci.subresourceRange.baseMipLevel = 0;
12965 ivci.subresourceRange.levelCount = 1;
12966 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12967
12968 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12969 ASSERT_VK_SUCCESS(err);
12970
12971 VkDescriptorImageInfo image_info{};
12972 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12973 image_info.imageView = view;
12974 image_info.sampler = sampler;
12975
12976 VkWriteDescriptorSet descriptor_write = {};
12977 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12978 descriptor_write.dstSet = descriptor_set;
12979 descriptor_write.dstBinding = 0;
12980 descriptor_write.descriptorCount = 1;
12981 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12982 descriptor_write.pImageInfo = &image_info;
12983
12984 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12985
12986 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012987 char const *vsSource =
12988 "#version 450\n"
12989 "\n"
12990 "out gl_PerVertex { \n"
12991 " vec4 gl_Position;\n"
12992 "};\n"
12993 "void main(){\n"
12994 " gl_Position = vec4(1);\n"
12995 "}\n";
12996 char const *fsSource =
12997 "#version 450\n"
12998 "\n"
12999 "layout(set=0, binding=0) uniform sampler2D s;\n"
13000 "layout(location=0) out vec4 x;\n"
13001 "void main(){\n"
13002 " x = texture(s, vec2(1));\n"
13003 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060013004 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13005 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13006 VkPipelineObj pipe(m_device);
13007 pipe.AddShader(&vs);
13008 pipe.AddShader(&fs);
13009 pipe.AddColorAttachment();
13010 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13011
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070013012 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013013
Tony Barbour552f6c02016-12-21 14:34:07 -070013014 m_commandBuffer->BeginCommandBuffer();
13015 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060013016 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013017 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
13018 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
13019 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070013020
13021 VkViewport viewport = {0, 0, 16, 16, 0, 1};
13022 VkRect2D scissor = {{0, 0}, {16, 16}};
13023 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
13024 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
13025
Tobin Ehlis209532e2016-09-07 13:52:18 -060013026 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070013027 m_commandBuffer->EndRenderPass();
13028 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060013029 // Submit cmd buffer then destroy sampler
13030 VkSubmitInfo submit_info = {};
13031 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13032 submit_info.commandBufferCount = 1;
13033 submit_info.pCommandBuffers = &m_commandBuffer->handle();
13034 // Submit cmd buffer and then destroy sampler while in-flight
13035 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13036
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013037 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060013038 m_errorMonitor->VerifyFound();
13039 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070013040
Tobin Ehlis209532e2016-09-07 13:52:18 -060013041 // Now we can actually destroy sampler
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070013042 m_errorMonitor->SetUnexpectedError("If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle");
13043 m_errorMonitor->SetUnexpectedError("Unable to remove Sampler obj");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013044 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060013045 vkDestroyImageView(m_device->device(), view, NULL);
13046 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13047 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
13048 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
13049}
13050
Mark Mueller1cd9f412016-08-25 13:23:52 -060013051TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013052 TEST_DESCRIPTION(
13053 "Call VkQueueSubmit with a semaphore that is already "
13054 "signaled but not waited on by the queue. Wait on a "
13055 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060013056
Tony Barbour1fa09702017-03-16 12:09:08 -060013057 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller96a56d52016-08-24 10:28:05 -060013058 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13059
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013060 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 -070013061 const char *invalid_fence_wait_message =
13062 " which has not been submitted on a Queue or during "
13063 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060013064
Tony Barbour552f6c02016-12-21 14:34:07 -070013065 m_commandBuffer->BeginCommandBuffer();
13066 m_commandBuffer->EndCommandBuffer();
Mark Mueller96a56d52016-08-24 10:28:05 -060013067
13068 VkSemaphoreCreateInfo semaphore_create_info = {};
13069 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
13070 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013071 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060013072 VkSubmitInfo submit_info = {};
13073 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
13074 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013075 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060013076 submit_info.signalSemaphoreCount = 1;
13077 submit_info.pSignalSemaphores = &semaphore;
13078 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070013079 m_errorMonitor->ExpectSuccess(0);
Mark Mueller96a56d52016-08-24 10:28:05 -060013080 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Dave Houltonfbf52152017-01-06 12:55:29 -070013081 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070013082 m_commandBuffer->BeginCommandBuffer();
13083 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013084 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060013085 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
13086 m_errorMonitor->VerifyFound();
13087
Mark Mueller1cd9f412016-08-25 13:23:52 -060013088 VkFenceCreateInfo fence_create_info = {};
13089 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
13090 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013091 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060013092
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013093 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060013094 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
13095 m_errorMonitor->VerifyFound();
13096
Mark Mueller4042b652016-09-05 22:52:21 -060013097 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060013098 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060013099 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13100}
13101
Tobin Ehlis4af23302016-07-19 10:50:30 -060013102TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013103 TEST_DESCRIPTION(
13104 "Bind a secondary command buffer with with a framebuffer "
13105 "that does not match the framebuffer for the active "
13106 "renderpass.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013107 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis4af23302016-07-19 10:50:30 -060013108 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13109
13110 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013111 VkAttachmentDescription attachment = {0,
13112 VK_FORMAT_B8G8R8A8_UNORM,
13113 VK_SAMPLE_COUNT_1_BIT,
13114 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13115 VK_ATTACHMENT_STORE_OP_STORE,
13116 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13117 VK_ATTACHMENT_STORE_OP_DONT_CARE,
13118 VK_IMAGE_LAYOUT_UNDEFINED,
13119 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013120
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013121 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013122
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013123 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013124
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013125 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013126
13127 VkRenderPass rp;
13128 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13129 ASSERT_VK_SUCCESS(err);
13130
13131 // A compatible framebuffer.
13132 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013133 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 -060013134 ASSERT_TRUE(image.initialized());
13135
13136 VkImageViewCreateInfo ivci = {
13137 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
13138 nullptr,
13139 0,
13140 image.handle(),
13141 VK_IMAGE_VIEW_TYPE_2D,
13142 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013143 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
13144 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060013145 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
13146 };
13147 VkImageView view;
13148 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
13149 ASSERT_VK_SUCCESS(err);
13150
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013151 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013152 VkFramebuffer fb;
13153 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
13154 ASSERT_VK_SUCCESS(err);
13155
13156 VkCommandBufferAllocateInfo cbai = {};
13157 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070013158 cbai.commandPool = m_commandPool->handle();
Tobin Ehlis4af23302016-07-19 10:50:30 -060013159 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
13160 cbai.commandBufferCount = 1;
13161
13162 VkCommandBuffer sec_cb;
13163 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
13164 ASSERT_VK_SUCCESS(err);
13165 VkCommandBufferBeginInfo cbbi = {};
13166 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130013167 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013168 cbii.renderPass = renderPass();
13169 cbii.framebuffer = fb;
13170 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13171 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013172 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 -060013173 cbbi.pInheritanceInfo = &cbii;
13174 vkBeginCommandBuffer(sec_cb, &cbbi);
13175 vkEndCommandBuffer(sec_cb);
13176
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013177 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120013178 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
13179 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013180
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013181 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013182 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060013183 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
13184 m_errorMonitor->VerifyFound();
13185 // Cleanup
13186 vkDestroyImageView(m_device->device(), view, NULL);
13187 vkDestroyRenderPass(m_device->device(), rp, NULL);
13188 vkDestroyFramebuffer(m_device->device(), fb, NULL);
13189}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013190
13191TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013192 TEST_DESCRIPTION(
13193 "If logicOp is available on the device, set it to an "
13194 "invalid value. If logicOp is not available, attempt to "
13195 "use it and verify that we see the correct error.");
Tony Barbour1fa09702017-03-16 12:09:08 -060013196 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013197 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13198
13199 auto features = m_device->phy().features();
13200 // Set the expected error depending on whether or not logicOp available
13201 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013202 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13203 "If logic operations feature not "
13204 "enabled, logicOpEnable must be "
13205 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013206 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130013207 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013208 }
13209 // Create a pipeline using logicOp
13210 VkResult err;
13211
13212 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13213 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13214
13215 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013216 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013217 ASSERT_VK_SUCCESS(err);
13218
13219 VkPipelineViewportStateCreateInfo vp_state_ci = {};
13220 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13221 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013222 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013223 vp_state_ci.pViewports = &vp;
13224 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013225 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013226 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013227
13228 VkPipelineShaderStageCreateInfo shaderStages[2];
13229 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
13230
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013231 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13232 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013233 shaderStages[0] = vs.GetStageCreateInfo();
13234 shaderStages[1] = fs.GetStageCreateInfo();
13235
13236 VkPipelineVertexInputStateCreateInfo vi_ci = {};
13237 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13238
13239 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
13240 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13241 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13242
13243 VkPipelineRasterizationStateCreateInfo rs_ci = {};
13244 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130013245 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013246
13247 VkPipelineColorBlendAttachmentState att = {};
13248 att.blendEnable = VK_FALSE;
13249 att.colorWriteMask = 0xf;
13250
13251 VkPipelineColorBlendStateCreateInfo cb_ci = {};
13252 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13253 // Enable logicOp & set logicOp to value 1 beyond allowed entries
13254 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013255 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013256 cb_ci.attachmentCount = 1;
13257 cb_ci.pAttachments = &att;
13258
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013259 VkPipelineMultisampleStateCreateInfo ms_ci = {};
13260 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
13261 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
13262
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013263 VkGraphicsPipelineCreateInfo gp_ci = {};
13264 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13265 gp_ci.stageCount = 2;
13266 gp_ci.pStages = shaderStages;
13267 gp_ci.pVertexInputState = &vi_ci;
13268 gp_ci.pInputAssemblyState = &ia_ci;
13269 gp_ci.pViewportState = &vp_state_ci;
13270 gp_ci.pRasterizationState = &rs_ci;
13271 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013272 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013273 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13274 gp_ci.layout = pipeline_layout;
13275 gp_ci.renderPass = renderPass();
13276
13277 VkPipelineCacheCreateInfo pc_ci = {};
13278 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13279
13280 VkPipeline pipeline;
13281 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013282 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013283 ASSERT_VK_SUCCESS(err);
13284
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013285 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013286 m_errorMonitor->VerifyFound();
13287 if (VK_SUCCESS == err) {
13288 vkDestroyPipeline(m_device->device(), pipeline, NULL);
13289 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013290 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
13291 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13292}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013293
Mike Stroyanaccf7692015-05-12 16:00:45 -060013294#if GTEST_IS_THREADSAFE
13295struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013296 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013297 VkEvent event;
13298 bool bailout;
13299};
13300
Karl Schultz6addd812016-02-02 17:17:23 -070013301extern "C" void *AddToCommandBuffer(void *arg) {
13302 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013303
Mike Stroyana6d14942016-07-13 15:10:05 -060013304 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013305 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013306 if (data->bailout) {
13307 break;
13308 }
13309 }
13310 return NULL;
13311}
13312
Karl Schultz6addd812016-02-02 17:17:23 -070013313TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013314 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013315
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013316 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013317
Tony Barbour1fa09702017-03-16 12:09:08 -060013318 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyanaccf7692015-05-12 16:00:45 -060013319 ASSERT_NO_FATAL_FAILURE(InitViewport());
13320 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13321
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013322 // Calls AllocateCommandBuffers
13323 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013324
13325 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013326 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013327
13328 VkEventCreateInfo event_info;
13329 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013330 VkResult err;
13331
13332 memset(&event_info, 0, sizeof(event_info));
13333 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13334
Chia-I Wuf7458c52015-10-26 21:10:41 +080013335 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013336 ASSERT_VK_SUCCESS(err);
13337
Mike Stroyanaccf7692015-05-12 16:00:45 -060013338 err = vkResetEvent(device(), event);
13339 ASSERT_VK_SUCCESS(err);
13340
13341 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013342 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013343 data.event = event;
13344 data.bailout = false;
13345 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060013346
13347 // First do some correct operations using multiple threads.
13348 // Add many entries to command buffer from another thread.
13349 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
13350 // Make non-conflicting calls from this thread at the same time.
13351 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060013352 uint32_t count;
13353 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060013354 }
13355 test_platform_thread_join(thread, NULL);
13356
13357 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060013358 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013359 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013360 // Add many entries to command buffer from this thread at the same time.
13361 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013362
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013363 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013364 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013365
Mike Stroyan10b8cb72016-01-22 15:22:03 -070013366 m_errorMonitor->SetBailout(NULL);
13367
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013368 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013369
Chia-I Wuf7458c52015-10-26 21:10:41 +080013370 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013371}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013372#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013373
Karl Schultz6addd812016-02-02 17:17:23 -070013374TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013375 TEST_DESCRIPTION(
13376 "Test that an error is produced for a spirv module "
13377 "with an impossible code size");
Chris Forbes1cc79542016-07-20 11:13:44 +120013378
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013379 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013380
Tony Barbour1fa09702017-03-16 12:09:08 -060013381 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013382 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13383
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013384 VkShaderModule module;
13385 VkShaderModuleCreateInfo moduleCreateInfo;
13386 struct icd_spv_header spv;
13387
13388 spv.magic = ICD_SPV_MAGIC;
13389 spv.version = ICD_SPV_VERSION;
13390 spv.gen_magic = 0;
13391
13392 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13393 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013394 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013395 moduleCreateInfo.codeSize = 4;
13396 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013397 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013398
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013399 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013400}
13401
Karl Schultz6addd812016-02-02 17:17:23 -070013402TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013403 TEST_DESCRIPTION(
13404 "Test that an error is produced for a spirv module "
13405 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120013406
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013407 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013408
Tony Barbour1fa09702017-03-16 12:09:08 -060013409 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013410 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13411
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013412 VkShaderModule module;
13413 VkShaderModuleCreateInfo moduleCreateInfo;
13414 struct icd_spv_header spv;
13415
13416 spv.magic = ~ICD_SPV_MAGIC;
13417 spv.version = ICD_SPV_VERSION;
13418 spv.gen_magic = 0;
13419
13420 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13421 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013422 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013423 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13424 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013425 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013426
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013427 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013428}
13429
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013430#if 0
13431// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070013432TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013433 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013434 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013435
Tony Barbour1fa09702017-03-16 12:09:08 -060013436 ASSERT_NO_FATAL_FAILURE(Init());
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013437 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13438
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013439 VkShaderModule module;
13440 VkShaderModuleCreateInfo moduleCreateInfo;
13441 struct icd_spv_header spv;
13442
13443 spv.magic = ICD_SPV_MAGIC;
13444 spv.version = ~ICD_SPV_VERSION;
13445 spv.gen_magic = 0;
13446
13447 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13448 moduleCreateInfo.pNext = NULL;
13449
Karl Schultz6addd812016-02-02 17:17:23 -070013450 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013451 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13452 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013453 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013454
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013455 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013456}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013457#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013458
Karl Schultz6addd812016-02-02 17:17:23 -070013459TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013460 TEST_DESCRIPTION(
13461 "Test that a warning is produced for a vertex output that "
13462 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013463 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013464
Tony Barbour1fa09702017-03-16 12:09:08 -060013465 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013466 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013467
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013468 char const *vsSource =
13469 "#version 450\n"
13470 "\n"
13471 "layout(location=0) out float x;\n"
13472 "out gl_PerVertex {\n"
13473 " vec4 gl_Position;\n"
13474 "};\n"
13475 "void main(){\n"
13476 " gl_Position = vec4(1);\n"
13477 " x = 0;\n"
13478 "}\n";
13479 char const *fsSource =
13480 "#version 450\n"
13481 "\n"
13482 "layout(location=0) out vec4 color;\n"
13483 "void main(){\n"
13484 " color = vec4(1);\n"
13485 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120013486
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013487 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13488 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013489
13490 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013491 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013492 pipe.AddShader(&vs);
13493 pipe.AddShader(&fs);
13494
Chris Forbes9f7ff632015-05-25 11:13:08 +120013495 VkDescriptorSetObj descriptorSet(m_device);
13496 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013497 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013498
Tony Barbour5781e8f2015-08-04 16:23:11 -060013499 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013500
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013501 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013502}
Chris Forbes9f7ff632015-05-25 11:13:08 +120013503
Mark Mueller098c9cb2016-09-08 09:01:57 -060013504TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
13505 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13506
Tony Barbour1fa09702017-03-16 12:09:08 -060013507 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013508 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13509
13510 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013511 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013512
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013513 char const *vsSource =
13514 "#version 450\n"
13515 "\n"
13516 "out gl_PerVertex {\n"
13517 " vec4 gl_Position;\n"
13518 "};\n"
13519 "void main(){\n"
13520 " gl_Position = vec4(1);\n"
13521 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013522
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013523 char const *fsSource =
13524 "#version 450\n"
13525 "\n"
13526 "layout (constant_id = 0) const float r = 0.0f;\n"
13527 "layout(location = 0) out vec4 uFragColor;\n"
13528 "void main(){\n"
13529 " uFragColor = vec4(r,1,0,1);\n"
13530 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013531
13532 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13533 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13534
13535 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13536 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13537
13538 VkPipelineLayout pipeline_layout;
13539 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13540
13541 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
13542 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13543 vp_state_create_info.viewportCount = 1;
13544 VkViewport viewport = {};
13545 vp_state_create_info.pViewports = &viewport;
13546 vp_state_create_info.scissorCount = 1;
13547 VkRect2D scissors = {};
13548 vp_state_create_info.pScissors = &scissors;
13549
13550 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
13551
13552 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
13553 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
13554 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
13555 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
13556
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013557 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060013558
13559 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
13560 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13561
13562 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
13563 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13564 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13565
13566 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
13567 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
13568 rasterization_state_create_info.pNext = nullptr;
13569 rasterization_state_create_info.lineWidth = 1.0f;
13570 rasterization_state_create_info.rasterizerDiscardEnable = true;
13571
13572 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
13573 color_blend_attachment_state.blendEnable = VK_FALSE;
13574 color_blend_attachment_state.colorWriteMask = 0xf;
13575
13576 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
13577 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13578 color_blend_state_create_info.attachmentCount = 1;
13579 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
13580
13581 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
13582 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13583 graphicspipe_create_info.stageCount = 2;
13584 graphicspipe_create_info.pStages = shader_stage_create_info;
13585 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
13586 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
13587 graphicspipe_create_info.pViewportState = &vp_state_create_info;
13588 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
13589 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
13590 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
13591 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13592 graphicspipe_create_info.layout = pipeline_layout;
13593 graphicspipe_create_info.renderPass = renderPass();
13594
13595 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
13596 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13597
13598 VkPipelineCache pipelineCache;
13599 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
13600
13601 // This structure maps constant ids to data locations.
13602 const VkSpecializationMapEntry entry =
13603 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013604 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013605
13606 uint32_t data = 1;
13607
13608 // Set up the info describing spec map and data
13609 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013610 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060013611 };
13612 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
13613
13614 VkPipeline pipeline;
13615 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
13616 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
13617 m_errorMonitor->VerifyFound();
13618
13619 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
13620 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13621}
13622
13623TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
13624 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13625
Tony Barbour1fa09702017-03-16 12:09:08 -060013626 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013627 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13628
13629 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
13630
13631 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
13632 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13633 descriptor_pool_type_count[0].descriptorCount = 1;
13634 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13635 descriptor_pool_type_count[1].descriptorCount = 1;
13636
13637 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13638 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13639 descriptor_pool_create_info.maxSets = 1;
13640 descriptor_pool_create_info.poolSizeCount = 2;
13641 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
13642 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13643
13644 VkDescriptorPool descriptorset_pool;
13645 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13646
13647 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13648 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13649 descriptorset_layout_binding.descriptorCount = 1;
13650 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
Cody Northropa6484fd2017-03-10 14:13:49 -070013651 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013652
13653 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13654 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13655 descriptorset_layout_create_info.bindingCount = 1;
13656 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13657
13658 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013659 ASSERT_VK_SUCCESS(
13660 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013661
13662 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13663 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13664 descriptorset_allocate_info.descriptorSetCount = 1;
13665 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13666 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13667 VkDescriptorSet descriptorset;
13668 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13669
13670 // Challenge core_validation with a non uniform buffer type.
13671 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
13672
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013673 char const *vsSource =
13674 "#version 450\n"
13675 "\n"
13676 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13677 " mat4 mvp;\n"
13678 "} ubuf;\n"
13679 "out gl_PerVertex {\n"
13680 " vec4 gl_Position;\n"
13681 "};\n"
13682 "void main(){\n"
13683 " gl_Position = ubuf.mvp * vec4(1);\n"
13684 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013685
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013686 char const *fsSource =
13687 "#version 450\n"
13688 "\n"
13689 "layout(location = 0) out vec4 uFragColor;\n"
13690 "void main(){\n"
13691 " uFragColor = vec4(0,1,0,1);\n"
13692 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013693
13694 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13695 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13696
13697 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13698 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13699 pipeline_layout_create_info.setLayoutCount = 1;
13700 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13701
13702 VkPipelineLayout pipeline_layout;
13703 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13704
13705 VkPipelineObj pipe(m_device);
13706 pipe.AddColorAttachment();
13707 pipe.AddShader(&vs);
13708 pipe.AddShader(&fs);
13709
13710 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
13711 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13712 m_errorMonitor->VerifyFound();
13713
13714 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13715 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13716 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13717}
13718
13719TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
13720 TEST_DESCRIPTION(
13721 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
13722
Tony Barbour1fa09702017-03-16 12:09:08 -060013723 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013724 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13725
13726 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
13727
13728 VkDescriptorPoolSize descriptor_pool_type_count = {};
13729 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13730 descriptor_pool_type_count.descriptorCount = 1;
13731
13732 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13733 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13734 descriptor_pool_create_info.maxSets = 1;
13735 descriptor_pool_create_info.poolSizeCount = 1;
13736 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
13737 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13738
13739 VkDescriptorPool descriptorset_pool;
13740 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13741
13742 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13743 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13744 descriptorset_layout_binding.descriptorCount = 1;
13745 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
13746 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
Cody Northropa6484fd2017-03-10 14:13:49 -070013747 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013748
13749 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13750 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13751 descriptorset_layout_create_info.bindingCount = 1;
13752 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13753
13754 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013755 ASSERT_VK_SUCCESS(
13756 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013757
13758 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13759 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13760 descriptorset_allocate_info.descriptorSetCount = 1;
13761 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13762 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13763 VkDescriptorSet descriptorset;
13764 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13765
13766 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
13767
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013768 char const *vsSource =
13769 "#version 450\n"
13770 "\n"
13771 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13772 " mat4 mvp;\n"
13773 "} ubuf;\n"
13774 "out gl_PerVertex {\n"
13775 " vec4 gl_Position;\n"
13776 "};\n"
13777 "void main(){\n"
13778 " gl_Position = ubuf.mvp * vec4(1);\n"
13779 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013780
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013781 char const *fsSource =
13782 "#version 450\n"
13783 "\n"
13784 "layout(location = 0) out vec4 uFragColor;\n"
13785 "void main(){\n"
13786 " uFragColor = vec4(0,1,0,1);\n"
13787 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013788
13789 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13790 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13791
13792 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13793 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13794 pipeline_layout_create_info.setLayoutCount = 1;
13795 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13796
13797 VkPipelineLayout pipeline_layout;
13798 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13799
13800 VkPipelineObj pipe(m_device);
13801 pipe.AddColorAttachment();
13802 pipe.AddShader(&vs);
13803 pipe.AddShader(&fs);
13804
13805 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
13806 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13807 m_errorMonitor->VerifyFound();
13808
13809 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13810 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13811 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13812}
13813
13814TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013815 TEST_DESCRIPTION(
13816 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
13817 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060013818
Tony Barbour1fa09702017-03-16 12:09:08 -060013819 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013820 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13821
13822 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013823 "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 -060013824
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013825 char const *vsSource =
13826 "#version 450\n"
13827 "\n"
13828 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13829 "out gl_PerVertex {\n"
13830 " vec4 gl_Position;\n"
13831 "};\n"
13832 "void main(){\n"
13833 " gl_Position = vec4(consts.x);\n"
13834 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013835
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013836 char const *fsSource =
13837 "#version 450\n"
13838 "\n"
13839 "layout(location = 0) out vec4 uFragColor;\n"
13840 "void main(){\n"
13841 " uFragColor = vec4(0,1,0,1);\n"
13842 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013843
13844 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13845 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13846
13847 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13848 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13849
13850 // Set up a push constant range
13851 VkPushConstantRange push_constant_ranges = {};
13852 // Set to the wrong stage to challenge core_validation
13853 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13854 push_constant_ranges.size = 4;
13855
13856 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
13857 pipeline_layout_create_info.pushConstantRangeCount = 1;
13858
13859 VkPipelineLayout pipeline_layout;
13860 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13861
13862 VkPipelineObj pipe(m_device);
13863 pipe.AddColorAttachment();
13864 pipe.AddShader(&vs);
13865 pipe.AddShader(&fs);
13866
13867 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
13868 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13869 m_errorMonitor->VerifyFound();
13870
13871 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13872}
13873
13874TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
13875 TEST_DESCRIPTION(
13876 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
13877
Tony Barbour1fa09702017-03-16 12:09:08 -060013878 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013879 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13880
13881 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013882 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013883
13884 // Some awkward steps are required to test with custom device features.
13885 std::vector<const char *> device_extension_names;
13886 auto features = m_device->phy().features();
13887 // Disable support for 64 bit floats
13888 features.shaderFloat64 = false;
13889 // The sacrificial device object
13890 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
13891
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013892 char const *vsSource =
13893 "#version 450\n"
13894 "\n"
13895 "out gl_PerVertex {\n"
13896 " vec4 gl_Position;\n"
13897 "};\n"
13898 "void main(){\n"
13899 " gl_Position = vec4(1);\n"
13900 "}\n";
13901 char const *fsSource =
13902 "#version 450\n"
13903 "\n"
13904 "layout(location=0) out vec4 color;\n"
13905 "void main(){\n"
13906 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
13907 " color = vec4(green);\n"
13908 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013909
13910 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13911 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13912
13913 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060013914
13915 VkPipelineObj pipe(&test_device);
13916 pipe.AddColorAttachment();
13917 pipe.AddShader(&vs);
13918 pipe.AddShader(&fs);
13919
13920 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13921 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13922 VkPipelineLayout pipeline_layout;
13923 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13924
13925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
13926 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
13927 m_errorMonitor->VerifyFound();
13928
13929 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
13930}
13931
13932TEST_F(VkLayerTest, CreatePipelineCheckShaderBadCapability) {
13933 TEST_DESCRIPTION("Create a graphics pipeline in which a capability declared by the shader is not supported by Vulkan shaders.");
13934
Tony Barbour1fa09702017-03-16 12:09:08 -060013935 ASSERT_NO_FATAL_FAILURE(Init());
Mark Mueller098c9cb2016-09-08 09:01:57 -060013936 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13937
13938 const char *bad_capability_message = "Shader declares capability 53, not supported in Vulkan.";
13939
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013940 char const *vsSource =
13941 "#version 450\n"
13942 "\n"
13943 "out gl_PerVertex {\n"
13944 " vec4 gl_Position;\n"
13945 "};\n"
13946 "layout(xfb_buffer = 1) out;"
13947 "void main(){\n"
13948 " gl_Position = vec4(1);\n"
13949 "}\n";
13950 char const *fsSource =
13951 "#version 450\n"
13952 "\n"
13953 "layout(location=0) out vec4 color;\n"
13954 "void main(){\n"
13955 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
13956 " color = vec4(green);\n"
13957 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013958
13959 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13960 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13961
13962 VkPipelineObj pipe(m_device);
13963 pipe.AddColorAttachment();
13964 pipe.AddShader(&vs);
13965 pipe.AddShader(&fs);
13966
13967 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13968 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13969 VkPipelineLayout pipeline_layout;
13970 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13971
13972 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_capability_message);
13973 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13974 m_errorMonitor->VerifyFound();
13975
13976 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13977}
13978
Karl Schultz6addd812016-02-02 17:17:23 -070013979TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013980 TEST_DESCRIPTION(
13981 "Test that an error is produced for a fragment shader input "
13982 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120013983
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013984 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013985
Tony Barbour1fa09702017-03-16 12:09:08 -060013986 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013987 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120013988
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013989 char const *vsSource =
13990 "#version 450\n"
13991 "\n"
13992 "out gl_PerVertex {\n"
13993 " vec4 gl_Position;\n"
13994 "};\n"
13995 "void main(){\n"
13996 " gl_Position = vec4(1);\n"
13997 "}\n";
13998 char const *fsSource =
13999 "#version 450\n"
14000 "\n"
14001 "layout(location=0) in float x;\n"
14002 "layout(location=0) out vec4 color;\n"
14003 "void main(){\n"
14004 " color = vec4(x);\n"
14005 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120014006
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014007 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14008 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014009
14010 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014011 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014012 pipe.AddShader(&vs);
14013 pipe.AddShader(&fs);
14014
Chris Forbes59cb88d2015-05-25 11:13:13 +120014015 VkDescriptorSetObj descriptorSet(m_device);
14016 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014017 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120014018
Tony Barbour5781e8f2015-08-04 16:23:11 -060014019 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120014020
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014021 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120014022}
14023
Karl Schultz6addd812016-02-02 17:17:23 -070014024TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014025 TEST_DESCRIPTION(
14026 "Test that an error is produced for a fragment shader input "
14027 "within an interace block, which is not present in the outputs "
14028 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014029 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014030
Tony Barbour1fa09702017-03-16 12:09:08 -060014031 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014032 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14033
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014034 char const *vsSource =
14035 "#version 450\n"
14036 "\n"
14037 "out gl_PerVertex {\n"
14038 " vec4 gl_Position;\n"
14039 "};\n"
14040 "void main(){\n"
14041 " gl_Position = vec4(1);\n"
14042 "}\n";
14043 char const *fsSource =
14044 "#version 450\n"
14045 "\n"
14046 "in block { layout(location=0) float x; } ins;\n"
14047 "layout(location=0) out vec4 color;\n"
14048 "void main(){\n"
14049 " color = vec4(ins.x);\n"
14050 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014051
14052 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14053 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14054
14055 VkPipelineObj pipe(m_device);
14056 pipe.AddColorAttachment();
14057 pipe.AddShader(&vs);
14058 pipe.AddShader(&fs);
14059
14060 VkDescriptorSetObj descriptorSet(m_device);
14061 descriptorSet.AppendDummy();
14062 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14063
14064 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14065
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014066 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014067}
14068
Karl Schultz6addd812016-02-02 17:17:23 -070014069TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014070 TEST_DESCRIPTION(
14071 "Test that an error is produced for mismatched array sizes "
14072 "across the vertex->fragment shader interface");
14073 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14074 "Type mismatch on location 0.0: 'ptr to "
14075 "output arr[2] of float32' vs 'ptr to "
14076 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130014077
Tony Barbour1fa09702017-03-16 12:09:08 -060014078 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes0036fd12016-01-26 14:19:49 +130014079 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14080
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014081 char const *vsSource =
14082 "#version 450\n"
14083 "\n"
14084 "layout(location=0) out float x[2];\n"
14085 "out gl_PerVertex {\n"
14086 " vec4 gl_Position;\n"
14087 "};\n"
14088 "void main(){\n"
14089 " x[0] = 0; x[1] = 0;\n"
14090 " gl_Position = vec4(1);\n"
14091 "}\n";
14092 char const *fsSource =
14093 "#version 450\n"
14094 "\n"
14095 "layout(location=0) in float x[1];\n"
14096 "layout(location=0) out vec4 color;\n"
14097 "void main(){\n"
14098 " color = vec4(x[0]);\n"
14099 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130014100
14101 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14102 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14103
14104 VkPipelineObj pipe(m_device);
14105 pipe.AddColorAttachment();
14106 pipe.AddShader(&vs);
14107 pipe.AddShader(&fs);
14108
14109 VkDescriptorSetObj descriptorSet(m_device);
14110 descriptorSet.AppendDummy();
14111 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14112
14113 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14114
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014115 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130014116}
14117
Karl Schultz6addd812016-02-02 17:17:23 -070014118TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014119 TEST_DESCRIPTION(
14120 "Test that an error is produced for mismatched types across "
14121 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014122 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014123
Tony Barbour1fa09702017-03-16 12:09:08 -060014124 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014125 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120014126
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014127 char const *vsSource =
14128 "#version 450\n"
14129 "\n"
14130 "layout(location=0) out int x;\n"
14131 "out gl_PerVertex {\n"
14132 " vec4 gl_Position;\n"
14133 "};\n"
14134 "void main(){\n"
14135 " x = 0;\n"
14136 " gl_Position = vec4(1);\n"
14137 "}\n";
14138 char const *fsSource =
14139 "#version 450\n"
14140 "\n"
14141 "layout(location=0) in float x;\n" /* VS writes int */
14142 "layout(location=0) out vec4 color;\n"
14143 "void main(){\n"
14144 " color = vec4(x);\n"
14145 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120014146
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014147 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14148 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120014149
14150 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014151 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120014152 pipe.AddShader(&vs);
14153 pipe.AddShader(&fs);
14154
Chris Forbesb56af562015-05-25 11:13:17 +120014155 VkDescriptorSetObj descriptorSet(m_device);
14156 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014157 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120014158
Tony Barbour5781e8f2015-08-04 16:23:11 -060014159 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120014160
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014161 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120014162}
14163
Karl Schultz6addd812016-02-02 17:17:23 -070014164TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014165 TEST_DESCRIPTION(
14166 "Test that an error is produced for mismatched types across "
14167 "the vertex->fragment shader interface, when the variable is contained within "
14168 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014169 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014170
Tony Barbour1fa09702017-03-16 12:09:08 -060014171 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa3e85f62016-01-15 14:53:11 +130014172 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14173
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014174 char const *vsSource =
14175 "#version 450\n"
14176 "\n"
14177 "out block { layout(location=0) int x; } outs;\n"
14178 "out gl_PerVertex {\n"
14179 " vec4 gl_Position;\n"
14180 "};\n"
14181 "void main(){\n"
14182 " outs.x = 0;\n"
14183 " gl_Position = vec4(1);\n"
14184 "}\n";
14185 char const *fsSource =
14186 "#version 450\n"
14187 "\n"
14188 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
14189 "layout(location=0) out vec4 color;\n"
14190 "void main(){\n"
14191 " color = vec4(ins.x);\n"
14192 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014193
14194 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14195 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14196
14197 VkPipelineObj pipe(m_device);
14198 pipe.AddColorAttachment();
14199 pipe.AddShader(&vs);
14200 pipe.AddShader(&fs);
14201
14202 VkDescriptorSetObj descriptorSet(m_device);
14203 descriptorSet.AppendDummy();
14204 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14205
14206 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14207
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014208 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014209}
14210
14211TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014212 TEST_DESCRIPTION(
14213 "Test that an error is produced for location mismatches across "
14214 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
14215 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014216 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 +130014217
Tony Barbour1fa09702017-03-16 12:09:08 -060014218 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014219 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14220
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014221 char const *vsSource =
14222 "#version 450\n"
14223 "\n"
14224 "out block { layout(location=1) float x; } outs;\n"
14225 "out gl_PerVertex {\n"
14226 " vec4 gl_Position;\n"
14227 "};\n"
14228 "void main(){\n"
14229 " outs.x = 0;\n"
14230 " gl_Position = vec4(1);\n"
14231 "}\n";
14232 char const *fsSource =
14233 "#version 450\n"
14234 "\n"
14235 "in block { layout(location=0) float x; } ins;\n"
14236 "layout(location=0) out vec4 color;\n"
14237 "void main(){\n"
14238 " color = vec4(ins.x);\n"
14239 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014240
14241 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14242 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14243
14244 VkPipelineObj pipe(m_device);
14245 pipe.AddColorAttachment();
14246 pipe.AddShader(&vs);
14247 pipe.AddShader(&fs);
14248
14249 VkDescriptorSetObj descriptorSet(m_device);
14250 descriptorSet.AppendDummy();
14251 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14252
14253 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14254
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014255 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014256}
14257
14258TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014259 TEST_DESCRIPTION(
14260 "Test that an error is produced for component mismatches across the "
14261 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
14262 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014263 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 +130014264
Tony Barbour1fa09702017-03-16 12:09:08 -060014265 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbese9928822016-02-17 14:44:52 +130014266 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14267
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014268 char const *vsSource =
14269 "#version 450\n"
14270 "\n"
14271 "out block { layout(location=0, component=0) float x; } outs;\n"
14272 "out gl_PerVertex {\n"
14273 " vec4 gl_Position;\n"
14274 "};\n"
14275 "void main(){\n"
14276 " outs.x = 0;\n"
14277 " gl_Position = vec4(1);\n"
14278 "}\n";
14279 char const *fsSource =
14280 "#version 450\n"
14281 "\n"
14282 "in block { layout(location=0, component=1) float x; } ins;\n"
14283 "layout(location=0) out vec4 color;\n"
14284 "void main(){\n"
14285 " color = vec4(ins.x);\n"
14286 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014287
14288 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14289 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14290
14291 VkPipelineObj pipe(m_device);
14292 pipe.AddColorAttachment();
14293 pipe.AddShader(&vs);
14294 pipe.AddShader(&fs);
14295
14296 VkDescriptorSetObj descriptorSet(m_device);
14297 descriptorSet.AppendDummy();
14298 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14299
14300 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14301
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014302 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014303}
14304
Chris Forbes1f3b0152016-11-30 12:48:40 +130014305TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
14306 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14307
Tony Barbour1fa09702017-03-16 12:09:08 -060014308 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes1f3b0152016-11-30 12:48:40 +130014309 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14310
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014311 char const *vsSource =
14312 "#version 450\n"
14313 "layout(location=0) out mediump float x;\n"
14314 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14315 char const *fsSource =
14316 "#version 450\n"
14317 "layout(location=0) in highp float x;\n"
14318 "layout(location=0) out vec4 color;\n"
14319 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130014320
14321 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14322 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14323
14324 VkPipelineObj pipe(m_device);
14325 pipe.AddColorAttachment();
14326 pipe.AddShader(&vs);
14327 pipe.AddShader(&fs);
14328
14329 VkDescriptorSetObj descriptorSet(m_device);
14330 descriptorSet.AppendDummy();
14331 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14332
14333 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14334
14335 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14336
14337 m_errorMonitor->VerifyFound();
14338}
14339
Chris Forbes870a39e2016-11-30 12:55:56 +130014340TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
14341 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14342
Tony Barbour1fa09702017-03-16 12:09:08 -060014343 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes870a39e2016-11-30 12:55:56 +130014344 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14345
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014346 char const *vsSource =
14347 "#version 450\n"
14348 "out block { layout(location=0) mediump float x; };\n"
14349 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14350 char const *fsSource =
14351 "#version 450\n"
14352 "in block { layout(location=0) highp float x; };\n"
14353 "layout(location=0) out vec4 color;\n"
14354 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130014355
14356 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14357 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14358
14359 VkPipelineObj pipe(m_device);
14360 pipe.AddColorAttachment();
14361 pipe.AddShader(&vs);
14362 pipe.AddShader(&fs);
14363
14364 VkDescriptorSetObj descriptorSet(m_device);
14365 descriptorSet.AppendDummy();
14366 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14367
14368 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14369
14370 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14371
14372 m_errorMonitor->VerifyFound();
14373}
14374
Karl Schultz6addd812016-02-02 17:17:23 -070014375TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014376 TEST_DESCRIPTION(
14377 "Test that a warning is produced for a vertex attribute which is "
14378 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014379 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014380
Tony Barbour1fa09702017-03-16 12:09:08 -060014381 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014382 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120014383
14384 VkVertexInputBindingDescription input_binding;
14385 memset(&input_binding, 0, sizeof(input_binding));
14386
14387 VkVertexInputAttributeDescription input_attrib;
14388 memset(&input_attrib, 0, sizeof(input_attrib));
14389 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14390
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014391 char const *vsSource =
14392 "#version 450\n"
14393 "\n"
14394 "out gl_PerVertex {\n"
14395 " vec4 gl_Position;\n"
14396 "};\n"
14397 "void main(){\n"
14398 " gl_Position = vec4(1);\n"
14399 "}\n";
14400 char const *fsSource =
14401 "#version 450\n"
14402 "\n"
14403 "layout(location=0) out vec4 color;\n"
14404 "void main(){\n"
14405 " color = vec4(1);\n"
14406 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120014407
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014408 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14409 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120014410
14411 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014412 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120014413 pipe.AddShader(&vs);
14414 pipe.AddShader(&fs);
14415
14416 pipe.AddVertexInputBindings(&input_binding, 1);
14417 pipe.AddVertexInputAttribs(&input_attrib, 1);
14418
Chris Forbesde136e02015-05-25 11:13:28 +120014419 VkDescriptorSetObj descriptorSet(m_device);
14420 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014421 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120014422
Tony Barbour5781e8f2015-08-04 16:23:11 -060014423 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120014424
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014425 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120014426}
14427
Karl Schultz6addd812016-02-02 17:17:23 -070014428TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014429 TEST_DESCRIPTION(
14430 "Test that a warning is produced for a location mismatch on "
14431 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014432 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014433
Tony Barbour1fa09702017-03-16 12:09:08 -060014434 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes7d83cd52016-01-15 11:32:03 +130014435 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14436
14437 VkVertexInputBindingDescription input_binding;
14438 memset(&input_binding, 0, sizeof(input_binding));
14439
14440 VkVertexInputAttributeDescription input_attrib;
14441 memset(&input_attrib, 0, sizeof(input_attrib));
14442 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14443
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014444 char const *vsSource =
14445 "#version 450\n"
14446 "\n"
14447 "layout(location=1) in float x;\n"
14448 "out gl_PerVertex {\n"
14449 " vec4 gl_Position;\n"
14450 "};\n"
14451 "void main(){\n"
14452 " gl_Position = vec4(x);\n"
14453 "}\n";
14454 char const *fsSource =
14455 "#version 450\n"
14456 "\n"
14457 "layout(location=0) out vec4 color;\n"
14458 "void main(){\n"
14459 " color = vec4(1);\n"
14460 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130014461
14462 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14463 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14464
14465 VkPipelineObj pipe(m_device);
14466 pipe.AddColorAttachment();
14467 pipe.AddShader(&vs);
14468 pipe.AddShader(&fs);
14469
14470 pipe.AddVertexInputBindings(&input_binding, 1);
14471 pipe.AddVertexInputAttribs(&input_attrib, 1);
14472
14473 VkDescriptorSetObj descriptorSet(m_device);
14474 descriptorSet.AppendDummy();
14475 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14476
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070014477 m_errorMonitor->SetUnexpectedError("Vertex shader consumes input at location 1 but not provided");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014478 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14479
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014480 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130014481}
14482
Karl Schultz6addd812016-02-02 17:17:23 -070014483TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014484 TEST_DESCRIPTION(
14485 "Test that an error is produced for a vertex shader input which is not "
14486 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014487 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14488 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014489
Tony Barbour1fa09702017-03-16 12:09:08 -060014490 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014491 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120014492
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014493 char const *vsSource =
14494 "#version 450\n"
14495 "\n"
14496 "layout(location=0) in vec4 x;\n" /* not provided */
14497 "out gl_PerVertex {\n"
14498 " vec4 gl_Position;\n"
14499 "};\n"
14500 "void main(){\n"
14501 " gl_Position = x;\n"
14502 "}\n";
14503 char const *fsSource =
14504 "#version 450\n"
14505 "\n"
14506 "layout(location=0) out vec4 color;\n"
14507 "void main(){\n"
14508 " color = vec4(1);\n"
14509 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120014510
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014511 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14512 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120014513
14514 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014515 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120014516 pipe.AddShader(&vs);
14517 pipe.AddShader(&fs);
14518
Chris Forbes62e8e502015-05-25 11:13:29 +120014519 VkDescriptorSetObj descriptorSet(m_device);
14520 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014521 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120014522
Tony Barbour5781e8f2015-08-04 16:23:11 -060014523 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120014524
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014525 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120014526}
14527
Karl Schultz6addd812016-02-02 17:17:23 -070014528TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014529 TEST_DESCRIPTION(
14530 "Test that an error is produced for a mismatch between the "
14531 "fundamental type (float/int/uint) of an attribute and the "
14532 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060014533 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 -060014534
Tony Barbour1fa09702017-03-16 12:09:08 -060014535 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014536 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014537
14538 VkVertexInputBindingDescription input_binding;
14539 memset(&input_binding, 0, sizeof(input_binding));
14540
14541 VkVertexInputAttributeDescription input_attrib;
14542 memset(&input_attrib, 0, sizeof(input_attrib));
14543 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14544
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014545 char const *vsSource =
14546 "#version 450\n"
14547 "\n"
14548 "layout(location=0) in int x;\n" /* attrib provided float */
14549 "out gl_PerVertex {\n"
14550 " vec4 gl_Position;\n"
14551 "};\n"
14552 "void main(){\n"
14553 " gl_Position = vec4(x);\n"
14554 "}\n";
14555 char const *fsSource =
14556 "#version 450\n"
14557 "\n"
14558 "layout(location=0) out vec4 color;\n"
14559 "void main(){\n"
14560 " color = vec4(1);\n"
14561 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120014562
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014563 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14564 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014565
14566 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014567 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014568 pipe.AddShader(&vs);
14569 pipe.AddShader(&fs);
14570
14571 pipe.AddVertexInputBindings(&input_binding, 1);
14572 pipe.AddVertexInputAttribs(&input_attrib, 1);
14573
Chris Forbesc97d98e2015-05-25 11:13:31 +120014574 VkDescriptorSetObj descriptorSet(m_device);
14575 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014576 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014577
Tony Barbour5781e8f2015-08-04 16:23:11 -060014578 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014579
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014580 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014581}
14582
Chris Forbesc68b43c2016-04-06 11:18:47 +120014583TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014584 TEST_DESCRIPTION(
14585 "Test that an error is produced for a pipeline containing multiple "
14586 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014587 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14588 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120014589
Tony Barbour1fa09702017-03-16 12:09:08 -060014590 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesc68b43c2016-04-06 11:18:47 +120014591 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14592
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014593 char const *vsSource =
14594 "#version 450\n"
14595 "\n"
14596 "out gl_PerVertex {\n"
14597 " vec4 gl_Position;\n"
14598 "};\n"
14599 "void main(){\n"
14600 " gl_Position = vec4(1);\n"
14601 "}\n";
14602 char const *fsSource =
14603 "#version 450\n"
14604 "\n"
14605 "layout(location=0) out vec4 color;\n"
14606 "void main(){\n"
14607 " color = vec4(1);\n"
14608 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120014609
14610 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14611 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14612
14613 VkPipelineObj pipe(m_device);
14614 pipe.AddColorAttachment();
14615 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014616 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120014617 pipe.AddShader(&fs);
14618
14619 VkDescriptorSetObj descriptorSet(m_device);
14620 descriptorSet.AppendDummy();
14621 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14622
14623 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14624
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014625 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120014626}
14627
Chris Forbes82ff92a2016-09-09 10:50:24 +120014628TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014629 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120014630
Tony Barbour1fa09702017-03-16 12:09:08 -060014631 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes82ff92a2016-09-09 10:50:24 +120014632 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14633
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014634 char const *vsSource =
14635 "#version 450\n"
14636 "out gl_PerVertex {\n"
14637 " vec4 gl_Position;\n"
14638 "};\n"
14639 "void main(){\n"
14640 " gl_Position = vec4(0);\n"
14641 "}\n";
14642 char const *fsSource =
14643 "#version 450\n"
14644 "\n"
14645 "layout(location=0) out vec4 color;\n"
14646 "void main(){\n"
14647 " color = vec4(1);\n"
14648 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120014649
14650 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14651 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
14652
14653 VkPipelineObj pipe(m_device);
14654 pipe.AddColorAttachment();
14655 pipe.AddShader(&vs);
14656 pipe.AddShader(&fs);
14657
14658 VkDescriptorSetObj descriptorSet(m_device);
14659 descriptorSet.AppendDummy();
14660 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14661
14662 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14663
14664 m_errorMonitor->VerifyFound();
14665}
14666
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014667TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014668 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14669 "pDepthStencilState is NULL when rasterization is enabled and subpass "
14670 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014671
Tony Barbour1fa09702017-03-16 12:09:08 -060014672 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014673 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14674
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014675 char const *vsSource =
14676 "#version 450\n"
14677 "void main(){ gl_Position = vec4(0); }\n";
14678 char const *fsSource =
14679 "#version 450\n"
14680 "\n"
14681 "layout(location=0) out vec4 color;\n"
14682 "void main(){\n"
14683 " color = vec4(1);\n"
14684 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014685
14686 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14687 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14688
14689 VkPipelineObj pipe(m_device);
14690 pipe.AddColorAttachment();
14691 pipe.AddShader(&vs);
14692 pipe.AddShader(&fs);
14693
14694 VkDescriptorSetObj descriptorSet(m_device);
14695 descriptorSet.AppendDummy();
14696 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14697
14698 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014699 {
14700 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14701 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14702 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014703 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014704 {
14705 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14706 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14707 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014708 },
14709 };
14710 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014711 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014712 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014713 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
14714 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014715 VkRenderPass rp;
14716 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14717 ASSERT_VK_SUCCESS(err);
14718
14719 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
14720
14721 m_errorMonitor->VerifyFound();
14722
14723 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14724}
14725
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014726TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014727 TEST_DESCRIPTION(
14728 "Test that an error is produced for a variable output from "
14729 "the TCS without the patch decoration, but consumed in the TES "
14730 "with the decoration.");
14731 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14732 "is per-vertex in tessellation control shader stage "
14733 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120014734
Tony Barbour1fa09702017-03-16 12:09:08 -060014735 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa0193bc2016-04-04 19:19:47 +120014736 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14737
Chris Forbesc1e852d2016-04-04 19:26:42 +120014738 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070014739 printf(" Device does not support tessellation shaders; skipped.\n");
Chris Forbesc1e852d2016-04-04 19:26:42 +120014740 return;
14741 }
14742
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014743 char const *vsSource =
14744 "#version 450\n"
14745 "void main(){}\n";
14746 char const *tcsSource =
14747 "#version 450\n"
14748 "layout(location=0) out int x[];\n"
14749 "layout(vertices=3) out;\n"
14750 "void main(){\n"
14751 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14752 " gl_TessLevelInner[0] = 1;\n"
14753 " x[gl_InvocationID] = gl_InvocationID;\n"
14754 "}\n";
14755 char const *tesSource =
14756 "#version 450\n"
14757 "layout(triangles, equal_spacing, cw) in;\n"
14758 "layout(location=0) patch in int x;\n"
14759 "out gl_PerVertex { vec4 gl_Position; };\n"
14760 "void main(){\n"
14761 " gl_Position.xyz = gl_TessCoord;\n"
14762 " gl_Position.w = x;\n"
14763 "}\n";
14764 char const *fsSource =
14765 "#version 450\n"
14766 "layout(location=0) out vec4 color;\n"
14767 "void main(){\n"
14768 " color = vec4(1);\n"
14769 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120014770
14771 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14772 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
14773 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
14774 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14775
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014776 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
14777 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014778
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014779 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014780
14781 VkPipelineObj pipe(m_device);
14782 pipe.SetInputAssembly(&iasci);
14783 pipe.SetTessellation(&tsci);
14784 pipe.AddColorAttachment();
14785 pipe.AddShader(&vs);
14786 pipe.AddShader(&tcs);
14787 pipe.AddShader(&tes);
14788 pipe.AddShader(&fs);
14789
14790 VkDescriptorSetObj descriptorSet(m_device);
14791 descriptorSet.AppendDummy();
14792 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14793
14794 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14795
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014796 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120014797}
14798
Karl Schultz6addd812016-02-02 17:17:23 -070014799TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014800 TEST_DESCRIPTION(
14801 "Test that an error is produced for a vertex attribute setup where multiple "
14802 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014803 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14804 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014805
Tony Barbour1fa09702017-03-16 12:09:08 -060014806 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014807 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014808
14809 /* Two binding descriptions for binding 0 */
14810 VkVertexInputBindingDescription input_bindings[2];
14811 memset(input_bindings, 0, sizeof(input_bindings));
14812
14813 VkVertexInputAttributeDescription input_attrib;
14814 memset(&input_attrib, 0, sizeof(input_attrib));
14815 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14816
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014817 char const *vsSource =
14818 "#version 450\n"
14819 "\n"
14820 "layout(location=0) in float x;\n" /* attrib provided float */
14821 "out gl_PerVertex {\n"
14822 " vec4 gl_Position;\n"
14823 "};\n"
14824 "void main(){\n"
14825 " gl_Position = vec4(x);\n"
14826 "}\n";
14827 char const *fsSource =
14828 "#version 450\n"
14829 "\n"
14830 "layout(location=0) out vec4 color;\n"
14831 "void main(){\n"
14832 " color = vec4(1);\n"
14833 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120014834
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014835 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14836 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014837
14838 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014839 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014840 pipe.AddShader(&vs);
14841 pipe.AddShader(&fs);
14842
14843 pipe.AddVertexInputBindings(input_bindings, 2);
14844 pipe.AddVertexInputAttribs(&input_attrib, 1);
14845
Chris Forbes280ba2c2015-06-12 11:16:41 +120014846 VkDescriptorSetObj descriptorSet(m_device);
14847 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014848 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014849
Tony Barbour5781e8f2015-08-04 16:23:11 -060014850 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014851
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014852 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014853}
Chris Forbes8f68b562015-05-25 11:13:32 +120014854
Karl Schultz6addd812016-02-02 17:17:23 -070014855TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014856 TEST_DESCRIPTION(
14857 "Test that an error is produced for a fragment shader which does not "
14858 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014859 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014860
Tony Barbour1fa09702017-03-16 12:09:08 -060014861 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014862
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014863 char const *vsSource =
14864 "#version 450\n"
14865 "\n"
14866 "out gl_PerVertex {\n"
14867 " vec4 gl_Position;\n"
14868 "};\n"
14869 "void main(){\n"
14870 " gl_Position = vec4(1);\n"
14871 "}\n";
14872 char const *fsSource =
14873 "#version 450\n"
14874 "\n"
14875 "void main(){\n"
14876 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014877
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014878 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14879 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014880
14881 VkPipelineObj pipe(m_device);
14882 pipe.AddShader(&vs);
14883 pipe.AddShader(&fs);
14884
Chia-I Wu08accc62015-07-07 11:50:03 +080014885 /* set up CB 0, not written */
14886 pipe.AddColorAttachment();
14887 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014888
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014889 VkDescriptorSetObj descriptorSet(m_device);
14890 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014891 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014892
Tony Barbour5781e8f2015-08-04 16:23:11 -060014893 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014894
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014895 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014896}
14897
Karl Schultz6addd812016-02-02 17:17:23 -070014898TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014899 TEST_DESCRIPTION(
14900 "Test that a warning is produced for a fragment shader which provides a spurious "
14901 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014902 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060014903 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014904
Tony Barbour1fa09702017-03-16 12:09:08 -060014905 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014906
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014907 char const *vsSource =
14908 "#version 450\n"
14909 "\n"
14910 "out gl_PerVertex {\n"
14911 " vec4 gl_Position;\n"
14912 "};\n"
14913 "void main(){\n"
14914 " gl_Position = vec4(1);\n"
14915 "}\n";
14916 char const *fsSource =
14917 "#version 450\n"
14918 "\n"
14919 "layout(location=0) out vec4 x;\n"
14920 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
14921 "void main(){\n"
14922 " x = vec4(1);\n"
14923 " y = vec4(1);\n"
14924 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014925
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014926 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14927 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014928
14929 VkPipelineObj pipe(m_device);
14930 pipe.AddShader(&vs);
14931 pipe.AddShader(&fs);
14932
Chia-I Wu08accc62015-07-07 11:50:03 +080014933 /* set up CB 0, not written */
14934 pipe.AddColorAttachment();
14935 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014936 /* FS writes CB 1, but we don't configure it */
14937
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014938 VkDescriptorSetObj descriptorSet(m_device);
14939 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014940 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014941
Tony Barbour5781e8f2015-08-04 16:23:11 -060014942 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014943
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014944 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014945}
14946
Karl Schultz6addd812016-02-02 17:17:23 -070014947TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014948 TEST_DESCRIPTION(
14949 "Test that an error is produced for a mismatch between the fundamental "
14950 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014951 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014952
Tony Barbour1fa09702017-03-16 12:09:08 -060014953 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014954
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014955 char const *vsSource =
14956 "#version 450\n"
14957 "\n"
14958 "out gl_PerVertex {\n"
14959 " vec4 gl_Position;\n"
14960 "};\n"
14961 "void main(){\n"
14962 " gl_Position = vec4(1);\n"
14963 "}\n";
14964 char const *fsSource =
14965 "#version 450\n"
14966 "\n"
14967 "layout(location=0) out ivec4 x;\n" /* not UNORM */
14968 "void main(){\n"
14969 " x = ivec4(1);\n"
14970 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120014971
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014972 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14973 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014974
14975 VkPipelineObj pipe(m_device);
14976 pipe.AddShader(&vs);
14977 pipe.AddShader(&fs);
14978
Chia-I Wu08accc62015-07-07 11:50:03 +080014979 /* set up CB 0; type is UNORM by default */
14980 pipe.AddColorAttachment();
14981 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014982
Chris Forbesa36d69e2015-05-25 11:13:44 +120014983 VkDescriptorSetObj descriptorSet(m_device);
14984 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014985 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014986
Tony Barbour5781e8f2015-08-04 16:23:11 -060014987 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014988
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014989 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120014990}
Chris Forbes7b1b8932015-06-05 14:43:36 +120014991
Karl Schultz6addd812016-02-02 17:17:23 -070014992TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014993 TEST_DESCRIPTION(
14994 "Test that an error is produced for a shader consuming a uniform "
14995 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014996 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014997
Tony Barbour1fa09702017-03-16 12:09:08 -060014998 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes556c76c2015-08-14 12:04:59 +120014999
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015000 char const *vsSource =
15001 "#version 450\n"
15002 "\n"
15003 "out gl_PerVertex {\n"
15004 " vec4 gl_Position;\n"
15005 "};\n"
15006 "void main(){\n"
15007 " gl_Position = vec4(1);\n"
15008 "}\n";
15009 char const *fsSource =
15010 "#version 450\n"
15011 "\n"
15012 "layout(location=0) out vec4 x;\n"
15013 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
15014 "void main(){\n"
15015 " x = vec4(bar.y);\n"
15016 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120015017
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060015018 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15019 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120015020
Chris Forbes556c76c2015-08-14 12:04:59 +120015021 VkPipelineObj pipe(m_device);
15022 pipe.AddShader(&vs);
15023 pipe.AddShader(&fs);
15024
15025 /* set up CB 0; type is UNORM by default */
15026 pipe.AddColorAttachment();
15027 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15028
15029 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015030 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120015031
15032 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15033
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015034 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120015035}
15036
Chris Forbes5c59e902016-02-26 16:56:09 +130015037TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015038 TEST_DESCRIPTION(
15039 "Test that an error is produced for a shader consuming push constants "
15040 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015041 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130015042
Tony Barbour1fa09702017-03-16 12:09:08 -060015043 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5c59e902016-02-26 16:56:09 +130015044
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015045 char const *vsSource =
15046 "#version 450\n"
15047 "\n"
15048 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
15049 "out gl_PerVertex {\n"
15050 " vec4 gl_Position;\n"
15051 "};\n"
15052 "void main(){\n"
15053 " gl_Position = vec4(consts.x);\n"
15054 "}\n";
15055 char const *fsSource =
15056 "#version 450\n"
15057 "\n"
15058 "layout(location=0) out vec4 x;\n"
15059 "void main(){\n"
15060 " x = vec4(1);\n"
15061 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130015062
15063 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15064 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15065
15066 VkPipelineObj pipe(m_device);
15067 pipe.AddShader(&vs);
15068 pipe.AddShader(&fs);
15069
15070 /* set up CB 0; type is UNORM by default */
15071 pipe.AddColorAttachment();
15072 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15073
15074 VkDescriptorSetObj descriptorSet(m_device);
15075 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15076
15077 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15078
15079 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015080 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130015081}
15082
Chris Forbes3fb17902016-08-22 14:57:55 +120015083TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015084 TEST_DESCRIPTION(
15085 "Test that an error is produced for a shader consuming an input attachment "
15086 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120015087 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15088 "consumes input attachment index 0 but not provided in subpass");
15089
Tony Barbour1fa09702017-03-16 12:09:08 -060015090 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes3fb17902016-08-22 14:57:55 +120015091
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015092 char const *vsSource =
15093 "#version 450\n"
15094 "\n"
15095 "out gl_PerVertex {\n"
15096 " vec4 gl_Position;\n"
15097 "};\n"
15098 "void main(){\n"
15099 " gl_Position = vec4(1);\n"
15100 "}\n";
15101 char const *fsSource =
15102 "#version 450\n"
15103 "\n"
15104 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15105 "layout(location=0) out vec4 color;\n"
15106 "void main() {\n"
15107 " color = subpassLoad(x);\n"
15108 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120015109
15110 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15111 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15112
15113 VkPipelineObj pipe(m_device);
15114 pipe.AddShader(&vs);
15115 pipe.AddShader(&fs);
15116 pipe.AddColorAttachment();
15117 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15118
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015119 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15120 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120015121 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015122 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015123 ASSERT_VK_SUCCESS(err);
15124
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015125 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120015126 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015127 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015128 ASSERT_VK_SUCCESS(err);
15129
15130 // error here.
15131 pipe.CreateVKPipeline(pl, renderPass());
15132
15133 m_errorMonitor->VerifyFound();
15134
15135 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15136 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15137}
15138
Chris Forbes5a9a0472016-08-22 16:02:09 +120015139TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015140 TEST_DESCRIPTION(
15141 "Test that an error is produced for a shader consuming an input attachment "
15142 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120015143 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15144 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
15145
Tony Barbour1fa09702017-03-16 12:09:08 -060015146 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5a9a0472016-08-22 16:02:09 +120015147
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015148 char const *vsSource =
15149 "#version 450\n"
15150 "\n"
15151 "out gl_PerVertex {\n"
15152 " vec4 gl_Position;\n"
15153 "};\n"
15154 "void main(){\n"
15155 " gl_Position = vec4(1);\n"
15156 "}\n";
15157 char const *fsSource =
15158 "#version 450\n"
15159 "\n"
15160 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15161 "layout(location=0) out vec4 color;\n"
15162 "void main() {\n"
15163 " color = subpassLoad(x);\n"
15164 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120015165
15166 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15167 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15168
15169 VkPipelineObj pipe(m_device);
15170 pipe.AddShader(&vs);
15171 pipe.AddShader(&fs);
15172 pipe.AddColorAttachment();
15173 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15174
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015175 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15176 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015177 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015178 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015179 ASSERT_VK_SUCCESS(err);
15180
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015181 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015182 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015183 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015184 ASSERT_VK_SUCCESS(err);
15185
15186 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015187 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15188 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15189 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
15190 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15191 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 +120015192 };
15193 VkAttachmentReference color = {
15194 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15195 };
15196 VkAttachmentReference input = {
15197 1, VK_IMAGE_LAYOUT_GENERAL,
15198 };
15199
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015200 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015201
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015202 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015203 VkRenderPass rp;
15204 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15205 ASSERT_VK_SUCCESS(err);
15206
15207 // error here.
15208 pipe.CreateVKPipeline(pl, rp);
15209
15210 m_errorMonitor->VerifyFound();
15211
15212 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15213 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15214 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15215}
15216
Chris Forbes541f7b02016-08-22 15:30:27 +120015217TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015218 TEST_DESCRIPTION(
15219 "Test that an error is produced for a shader consuming an input attachment "
15220 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120015221 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070015222 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120015223
Tony Barbour1fa09702017-03-16 12:09:08 -060015224 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes541f7b02016-08-22 15:30:27 +120015225
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015226 char const *vsSource =
15227 "#version 450\n"
15228 "\n"
15229 "out gl_PerVertex {\n"
15230 " vec4 gl_Position;\n"
15231 "};\n"
15232 "void main(){\n"
15233 " gl_Position = vec4(1);\n"
15234 "}\n";
15235 char const *fsSource =
15236 "#version 450\n"
15237 "\n"
15238 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
15239 "layout(location=0) out vec4 color;\n"
15240 "void main() {\n"
15241 " color = subpassLoad(xs[0]);\n"
15242 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120015243
15244 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15245 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15246
15247 VkPipelineObj pipe(m_device);
15248 pipe.AddShader(&vs);
15249 pipe.AddShader(&fs);
15250 pipe.AddColorAttachment();
15251 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15252
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015253 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15254 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120015255 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015256 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015257 ASSERT_VK_SUCCESS(err);
15258
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015259 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120015260 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015261 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015262 ASSERT_VK_SUCCESS(err);
15263
15264 // error here.
15265 pipe.CreateVKPipeline(pl, renderPass());
15266
15267 m_errorMonitor->VerifyFound();
15268
15269 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15270 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15271}
15272
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015273TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015274 TEST_DESCRIPTION(
15275 "Test that an error is produced for a compute pipeline consuming a "
15276 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015277 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015278
Tony Barbour1fa09702017-03-16 12:09:08 -060015279 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015280
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015281 char const *csSource =
15282 "#version 450\n"
15283 "\n"
15284 "layout(local_size_x=1) in;\n"
15285 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15286 "void main(){\n"
15287 " x = vec4(1);\n"
15288 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015289
15290 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15291
15292 VkDescriptorSetObj descriptorSet(m_device);
15293 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15294
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015295 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15296 nullptr,
15297 0,
15298 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15299 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15300 descriptorSet.GetPipelineLayout(),
15301 VK_NULL_HANDLE,
15302 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015303
15304 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015305 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015306
15307 m_errorMonitor->VerifyFound();
15308
15309 if (err == VK_SUCCESS) {
15310 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15311 }
15312}
15313
Chris Forbes22a9b092016-07-19 14:34:05 +120015314TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015315 TEST_DESCRIPTION(
15316 "Test that an error is produced for a pipeline consuming a "
15317 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015318 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15319 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120015320
Tony Barbour1fa09702017-03-16 12:09:08 -060015321 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes22a9b092016-07-19 14:34:05 +120015322
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015323 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
15324 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120015325 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015326 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015327 ASSERT_VK_SUCCESS(err);
15328
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015329 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120015330 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015331 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015332 ASSERT_VK_SUCCESS(err);
15333
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015334 char const *csSource =
15335 "#version 450\n"
15336 "\n"
15337 "layout(local_size_x=1) in;\n"
15338 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15339 "void main() {\n"
15340 " x.x = 1.0f;\n"
15341 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120015342 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15343
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015344 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15345 nullptr,
15346 0,
15347 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15348 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15349 pl,
15350 VK_NULL_HANDLE,
15351 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120015352
15353 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015354 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120015355
15356 m_errorMonitor->VerifyFound();
15357
15358 if (err == VK_SUCCESS) {
15359 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15360 }
15361
15362 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15363 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15364}
15365
Chris Forbes50020592016-07-27 13:52:41 +120015366TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015367 TEST_DESCRIPTION(
15368 "Test that an error is produced when an image view type "
15369 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120015370
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015371 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 +120015372
Tony Barbour1fa09702017-03-16 12:09:08 -060015373 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes50020592016-07-27 13:52:41 +120015374 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15375
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015376 char const *vsSource =
15377 "#version 450\n"
15378 "\n"
15379 "out gl_PerVertex { vec4 gl_Position; };\n"
15380 "void main() { gl_Position = vec4(0); }\n";
15381 char const *fsSource =
15382 "#version 450\n"
15383 "\n"
15384 "layout(set=0, binding=0) uniform sampler3D s;\n"
15385 "layout(location=0) out vec4 color;\n"
15386 "void main() {\n"
15387 " color = texture(s, vec3(0));\n"
15388 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120015389 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15390 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15391
15392 VkPipelineObj pipe(m_device);
15393 pipe.AddShader(&vs);
15394 pipe.AddShader(&fs);
15395 pipe.AddColorAttachment();
15396
15397 VkTextureObj texture(m_device, nullptr);
15398 VkSamplerObj sampler(m_device);
15399
15400 VkDescriptorSetObj descriptorSet(m_device);
15401 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15402 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15403
15404 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15405 ASSERT_VK_SUCCESS(err);
15406
Tony Barbour552f6c02016-12-21 14:34:07 -070015407 m_commandBuffer->BeginCommandBuffer();
15408 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120015409
15410 m_commandBuffer->BindPipeline(pipe);
15411 m_commandBuffer->BindDescriptorSet(descriptorSet);
15412
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015413 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120015414 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015415 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120015416 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15417
15418 // error produced here.
15419 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15420
15421 m_errorMonitor->VerifyFound();
15422
Tony Barbour552f6c02016-12-21 14:34:07 -070015423 m_commandBuffer->EndRenderPass();
15424 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120015425}
15426
Chris Forbes5533bfc2016-07-27 14:12:34 +120015427TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015428 TEST_DESCRIPTION(
15429 "Test that an error is produced when a multisampled images "
15430 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015431
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015432 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015433
Tony Barbour1fa09702017-03-16 12:09:08 -060015434 ASSERT_NO_FATAL_FAILURE(Init());
Chris Forbes5533bfc2016-07-27 14:12:34 +120015435 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15436
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015437 char const *vsSource =
15438 "#version 450\n"
15439 "\n"
15440 "out gl_PerVertex { vec4 gl_Position; };\n"
15441 "void main() { gl_Position = vec4(0); }\n";
15442 char const *fsSource =
15443 "#version 450\n"
15444 "\n"
15445 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
15446 "layout(location=0) out vec4 color;\n"
15447 "void main() {\n"
15448 " color = texelFetch(s, ivec2(0), 0);\n"
15449 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120015450 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15451 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15452
15453 VkPipelineObj pipe(m_device);
15454 pipe.AddShader(&vs);
15455 pipe.AddShader(&fs);
15456 pipe.AddColorAttachment();
15457
15458 VkTextureObj texture(m_device, nullptr);
15459 VkSamplerObj sampler(m_device);
15460
15461 VkDescriptorSetObj descriptorSet(m_device);
15462 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15463 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15464
15465 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15466 ASSERT_VK_SUCCESS(err);
15467
Tony Barbour552f6c02016-12-21 14:34:07 -070015468 m_commandBuffer->BeginCommandBuffer();
15469 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120015470
15471 m_commandBuffer->BindPipeline(pipe);
15472 m_commandBuffer->BindDescriptorSet(descriptorSet);
15473
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015474 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015475 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015476 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015477 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15478
15479 // error produced here.
15480 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15481
15482 m_errorMonitor->VerifyFound();
15483
Tony Barbour552f6c02016-12-21 14:34:07 -070015484 m_commandBuffer->EndRenderPass();
15485 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120015486}
15487
Mark Youngc48c4c12016-04-11 14:26:49 -060015488TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015489 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015490
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015491 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15492 {
15493 VkFormatProperties properties;
15494 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15495 if (properties.optimalTilingFeatures == 0) {
15496 printf(" Image format not supported; skipped.\n");
15497 return;
15498 }
15499 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015500
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015501 VkImageCreateInfo info = {};
15502 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15503 info.pNext = NULL;
15504 info.imageType = VK_IMAGE_TYPE_2D;
15505 info.format = format;
15506 info.extent.height = 32;
15507 info.extent.depth = 1;
15508 info.mipLevels = 1;
15509 info.arrayLayers = 1;
15510 info.samples = VK_SAMPLE_COUNT_1_BIT;
15511 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15512 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15513 info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015514
15515 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015516 {
15517 VkImageFormatProperties properties;
15518 auto const result = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), info.format, info.imageType,
15519 info.tiling, info.usage, info.flags, &properties);
15520 ASSERT_VK_SUCCESS(result);
15521 info.extent.width = properties.maxExtent.width + 1;
15522 }
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015523
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015524 VkImage image;
15525 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
15526 vkCreateImage(m_device->device(), &info, NULL, &image);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015527 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015528}
15529
Mark Youngc48c4c12016-04-11 14:26:49 -060015530TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015531 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngc48c4c12016-04-11 14:26:49 -060015532
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015533 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
15534 {
15535 VkFormatProperties properties;
15536 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
15537 if (properties.optimalTilingFeatures == 0) {
15538 printf(" Image format not supported; skipped.\n");
15539 return;
15540 }
15541 }
Mark Youngc48c4c12016-04-11 14:26:49 -060015542
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015543 VkImageCreateInfo info = {};
15544 info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15545 info.pNext = NULL;
15546 info.imageType = VK_IMAGE_TYPE_2D;
15547 info.format = format;
15548 info.extent.height = 32;
15549 info.extent.depth = 1;
15550 info.mipLevels = 1;
15551 info.arrayLayers = 1;
15552 info.samples = VK_SAMPLE_COUNT_1_BIT;
15553 info.tiling = VK_IMAGE_TILING_OPTIMAL;
15554 info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15555 info.flags = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015556
15557 // Introduce error by sending down a bogus width extent
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015558 info.extent.width = 0;
Mark Youngc48c4c12016-04-11 14:26:49 -060015559
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060015560 VkImage image;
15561 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00716);
15562 m_errorMonitor->SetUnexpectedError("parameter pCreateInfo->extent.width must be greater than 0");
15563 vkCreateImage(m_device->device(), &info, NULL, &image);
Mark Youngc48c4c12016-04-11 14:26:49 -060015564 m_errorMonitor->VerifyFound();
15565}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070015566
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015567TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015568 TEST_DESCRIPTION(
15569 "Create a render pass with an attachment description "
15570 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015571
Tony Barbour1fa09702017-03-16 12:09:08 -060015572 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015573 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15574
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070015575 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015576
15577 VkAttachmentReference color_attach = {};
15578 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
15579 color_attach.attachment = 0;
15580 VkSubpassDescription subpass = {};
15581 subpass.colorAttachmentCount = 1;
15582 subpass.pColorAttachments = &color_attach;
15583
15584 VkRenderPassCreateInfo rpci = {};
15585 rpci.subpassCount = 1;
15586 rpci.pSubpasses = &subpass;
15587 rpci.attachmentCount = 1;
15588 VkAttachmentDescription attach_desc = {};
15589 attach_desc.format = VK_FORMAT_UNDEFINED;
15590 rpci.pAttachments = &attach_desc;
15591 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
15592 VkRenderPass rp;
15593 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
15594
15595 m_errorMonitor->VerifyFound();
15596
15597 if (result == VK_SUCCESS) {
15598 vkDestroyRenderPass(m_device->device(), rp, NULL);
15599 }
15600}
15601
Karl Schultz6addd812016-02-02 17:17:23 -070015602TEST_F(VkLayerTest, InvalidImageView) {
Tony Barbour1fa09702017-03-16 12:09:08 -060015603 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehliscde08892015-09-22 10:11:37 -060015604
Mike Stroyana3082432015-09-25 13:39:21 -060015605 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070015606 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15607 const int32_t tex_width = 32;
15608 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060015609
15610 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015611 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15612 image_create_info.pNext = NULL;
15613 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15614 image_create_info.format = tex_format;
15615 image_create_info.extent.width = tex_width;
15616 image_create_info.extent.height = tex_height;
15617 image_create_info.extent.depth = 1;
15618 image_create_info.mipLevels = 1;
15619 image_create_info.arrayLayers = 1;
15620 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15621 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15622 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15623 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060015624
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015625 VkImage image;
15626 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060015627 ASSERT_VK_SUCCESS(err);
15628
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015629 VkMemoryRequirements requirements;
15630 vkGetImageMemoryRequirements(m_device->device(), image, &requirements);
15631
15632 VkMemoryAllocateInfo alloc_info{};
15633 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15634 alloc_info.pNext = NULL;
15635 alloc_info.memoryTypeIndex = 0;
15636 alloc_info.allocationSize = requirements.size;
15637 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
15638 ASSERT_TRUE(pass);
15639
15640 VkDeviceMemory memory;
15641 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
15642 ASSERT_VK_SUCCESS(err);
15643
15644 err = vkBindImageMemory(m_device->device(), image, memory, 0);
15645
Tobin Ehliscde08892015-09-22 10:11:37 -060015646 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015647 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015648 image_view_create_info.image = image;
15649 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15650 image_view_create_info.format = tex_format;
15651 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015652 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070015653 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015654 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015655
15656 VkImageView view;
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015657 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015658 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015659 m_errorMonitor->VerifyFound();
Jeremy Hayesa1ffc2b2017-03-10 16:05:37 -070015660
15661 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -060015662 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015663}
Mike Stroyana3082432015-09-25 13:39:21 -060015664
Mark Youngd339ba32016-05-30 13:28:35 -060015665TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15666 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060015667 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060015668 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060015669
Tony Barbour1fa09702017-03-16 12:09:08 -060015670 ASSERT_NO_FATAL_FAILURE(Init());
Mark Youngd339ba32016-05-30 13:28:35 -060015671
15672 // Create an image and try to create a view with no memory backing the image
15673 VkImage image;
15674
15675 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15676 const int32_t tex_width = 32;
15677 const int32_t tex_height = 32;
15678
15679 VkImageCreateInfo image_create_info = {};
15680 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15681 image_create_info.pNext = NULL;
15682 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15683 image_create_info.format = tex_format;
15684 image_create_info.extent.width = tex_width;
15685 image_create_info.extent.height = tex_height;
15686 image_create_info.extent.depth = 1;
15687 image_create_info.mipLevels = 1;
15688 image_create_info.arrayLayers = 1;
15689 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15690 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15691 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15692 image_create_info.flags = 0;
15693
15694 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15695 ASSERT_VK_SUCCESS(err);
15696
15697 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015698 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060015699 image_view_create_info.image = image;
15700 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15701 image_view_create_info.format = tex_format;
15702 image_view_create_info.subresourceRange.layerCount = 1;
15703 image_view_create_info.subresourceRange.baseMipLevel = 0;
15704 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015705 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060015706
15707 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015708 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060015709
15710 m_errorMonitor->VerifyFound();
15711 vkDestroyImage(m_device->device(), image, NULL);
15712 // If last error is success, it still created the view, so delete it.
15713 if (err == VK_SUCCESS) {
15714 vkDestroyImageView(m_device->device(), view, NULL);
15715 }
Mark Youngd339ba32016-05-30 13:28:35 -060015716}
15717
Karl Schultz6addd812016-02-02 17:17:23 -070015718TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015719 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015720 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015721
Tony Barbour1fa09702017-03-16 12:09:08 -060015722 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015723
Karl Schultz6addd812016-02-02 17:17:23 -070015724 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015725 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015726 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015727 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015728
15729 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015730 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015731 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015732 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15733 image_view_create_info.format = tex_format;
15734 image_view_create_info.subresourceRange.baseMipLevel = 0;
15735 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015736 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015737 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015738 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015739
15740 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015741 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015742
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015743 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015744}
15745
Mike Weiblena1e13f42017-02-09 21:25:59 -070015746TEST_F(VkLayerTest, ExerciseGetImageSubresourceLayout) {
15747 TEST_DESCRIPTION("Test vkGetImageSubresourceLayout() valid usages");
15748
Tony Barbour1fa09702017-03-16 12:09:08 -060015749 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblena1e13f42017-02-09 21:25:59 -070015750 VkSubresourceLayout subres_layout = {};
15751
15752 // VU 00732: image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR
15753 {
15754 const VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL; // ERROR: violates VU 00732
15755 VkImageObj img(m_device);
15756 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, tiling);
15757 ASSERT_TRUE(img.initialized());
15758
15759 VkImageSubresource subres = {};
15760 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15761 subres.mipLevel = 0;
15762 subres.arrayLayer = 0;
15763
15764 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00732);
15765 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15766 m_errorMonitor->VerifyFound();
15767 }
15768
15769 // VU 00733: The aspectMask member of pSubresource must only have a single bit set
15770 {
15771 VkImageObj img(m_device);
15772 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15773 ASSERT_TRUE(img.initialized());
15774
15775 VkImageSubresource subres = {};
15776 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT; // ERROR: triggers VU 00733
15777 subres.mipLevel = 0;
15778 subres.arrayLayer = 0;
15779
15780 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00733);
15781 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
15782 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15783 m_errorMonitor->VerifyFound();
15784 }
15785
15786 // 00739 mipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created
15787 {
15788 VkImageObj img(m_device);
15789 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15790 ASSERT_TRUE(img.initialized());
15791
15792 VkImageSubresource subres = {};
15793 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15794 subres.mipLevel = 1; // ERROR: triggers VU 00739
15795 subres.arrayLayer = 0;
15796
15797 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00739);
15798 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15799 m_errorMonitor->VerifyFound();
15800 }
15801
15802 // 00740 arrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when the image was created
15803 {
15804 VkImageObj img(m_device);
15805 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15806 ASSERT_TRUE(img.initialized());
15807
15808 VkImageSubresource subres = {};
15809 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15810 subres.mipLevel = 0;
15811 subres.arrayLayer = 1; // ERROR: triggers VU 00740
15812
15813 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00740);
15814 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15815 m_errorMonitor->VerifyFound();
15816 }
15817}
15818
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015819TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070015820 VkResult err;
15821 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015822
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015823 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015824
Tony Barbour1fa09702017-03-16 12:09:08 -060015825 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060015826
15827 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015828 VkImage srcImage;
15829 VkImage dstImage;
15830 VkDeviceMemory srcMem;
15831 VkDeviceMemory destMem;
15832 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015833
15834 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015835 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15836 image_create_info.pNext = NULL;
15837 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15838 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15839 image_create_info.extent.width = 32;
15840 image_create_info.extent.height = 32;
15841 image_create_info.extent.depth = 1;
15842 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015843 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070015844 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15845 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15846 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15847 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015848
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015849 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015850 ASSERT_VK_SUCCESS(err);
15851
Mark Lobodzinski867787a2016-10-14 11:49:55 -060015852 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015853 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015854 ASSERT_VK_SUCCESS(err);
15855
15856 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015857 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015858 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15859 memAlloc.pNext = NULL;
15860 memAlloc.allocationSize = 0;
15861 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015862
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015863 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015864 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015865 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015866 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015867 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015868 ASSERT_VK_SUCCESS(err);
15869
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015870 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015871 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015872 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015873 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015874 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015875 ASSERT_VK_SUCCESS(err);
15876
15877 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15878 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015879 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015880 ASSERT_VK_SUCCESS(err);
15881
Tony Barbour552f6c02016-12-21 14:34:07 -070015882 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015883 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015884 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015885 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015886 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015887 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015888 copyRegion.srcOffset.x = 0;
15889 copyRegion.srcOffset.y = 0;
15890 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015891 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015892 copyRegion.dstSubresource.mipLevel = 0;
15893 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015894 // Introduce failure by forcing the dst layerCount to differ from src
15895 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015896 copyRegion.dstOffset.x = 0;
15897 copyRegion.dstOffset.y = 0;
15898 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015899 copyRegion.extent.width = 1;
15900 copyRegion.extent.height = 1;
15901 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015902 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015903 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015904
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015905 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015906
Chia-I Wuf7458c52015-10-26 21:10:41 +080015907 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015908 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015909 vkFreeMemory(m_device->device(), srcMem, NULL);
15910 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015911}
15912
Tony Barbourd6673642016-05-05 14:46:39 -060015913TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060015914 TEST_DESCRIPTION("Creating images with unsuported formats ");
15915
Tony Barbour1fa09702017-03-16 12:09:08 -060015916 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060015917 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbourd6673642016-05-05 14:46:39 -060015918
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015919 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130015920 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015921 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015922 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15923 image_create_info.format = VK_FORMAT_UNDEFINED;
15924 image_create_info.extent.width = 32;
15925 image_create_info.extent.height = 32;
15926 image_create_info.extent.depth = 1;
15927 image_create_info.mipLevels = 1;
15928 image_create_info.arrayLayers = 1;
15929 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15930 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15931 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015932
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015933 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15934 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015935
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015936 VkImage image;
15937 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015938 m_errorMonitor->VerifyFound();
15939
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015940 // Look for a format that is COMPLETELY unsupported with this hardware
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015941 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Tony Barbourd6673642016-05-05 14:46:39 -060015942 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
15943 VkFormat format = static_cast<VkFormat>(f);
15944 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015945 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060015946 unsupported = format;
15947 break;
15948 }
15949 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015950
Tony Barbourd6673642016-05-05 14:46:39 -060015951 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060015952 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015953 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060015954
Jeremy Hayes96dcd812017-03-14 14:04:19 -060015955 vkCreateImage(m_device->handle(), &image_create_info, NULL, &image);
Tony Barbourd6673642016-05-05 14:46:39 -060015956 m_errorMonitor->VerifyFound();
15957 }
15958}
15959
15960TEST_F(VkLayerTest, ImageLayerViewTests) {
Tony Barbourd6673642016-05-05 14:46:39 -060015961 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
15962
Tony Barbour1fa09702017-03-16 12:09:08 -060015963 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070015964 auto depth_format = find_depth_stencil_format(m_device);
15965 if (!depth_format) {
15966 return;
15967 }
Tony Barbourd6673642016-05-05 14:46:39 -060015968
15969 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015970 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 -060015971 VK_IMAGE_TILING_OPTIMAL, 0);
15972 ASSERT_TRUE(image.initialized());
15973
15974 VkImageView imgView;
15975 VkImageViewCreateInfo imgViewInfo = {};
15976 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
15977 imgViewInfo.image = image.handle();
15978 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
15979 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15980 imgViewInfo.subresourceRange.layerCount = 1;
15981 imgViewInfo.subresourceRange.baseMipLevel = 0;
15982 imgViewInfo.subresourceRange.levelCount = 1;
15983 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15984
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015985 // View can't have baseMipLevel >= image's mipLevels - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060015986 imgViewInfo.subresourceRange.baseMipLevel = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015987 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060015988 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15989 m_errorMonitor->VerifyFound();
15990 imgViewInfo.subresourceRange.baseMipLevel = 0;
15991
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015992 // View can't have baseArrayLayer >= image's arraySize - Expect VIEW_CREATE_ERROR
Tony Barbourd6673642016-05-05 14:46:39 -060015993 imgViewInfo.subresourceRange.baseArrayLayer = 1;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060015994 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060015995 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15996 m_errorMonitor->VerifyFound();
15997 imgViewInfo.subresourceRange.baseArrayLayer = 0;
15998
Tony Barbourd6673642016-05-05 14:46:39 -060015999 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
16000 imgViewInfo.subresourceRange.levelCount = 0;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016001 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060016002 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16003 m_errorMonitor->VerifyFound();
16004 imgViewInfo.subresourceRange.levelCount = 1;
16005
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016006 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
16007 imgViewInfo.subresourceRange.layerCount = 0;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016008 m_errorMonitor->SetDesiredFailureMsg(
16009 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16010 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060016011 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16012 m_errorMonitor->VerifyFound();
16013 imgViewInfo.subresourceRange.layerCount = 1;
16014
Tony Barbourd6673642016-05-05 14:46:39 -060016015 // Can't use depth format for view into color image - Expect INVALID_FORMAT
Tony Barbourf887b162017-03-09 10:06:46 -070016016 imgViewInfo.format = depth_format;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016017 m_errorMonitor->SetDesiredFailureMsg(
16018 VK_DEBUG_REPORT_ERROR_BIT_EXT,
16019 "Formats MUST be IDENTICAL unless VK_IMAGE_CREATE_MUTABLE_FORMAT BIT was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060016020 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16021 m_errorMonitor->VerifyFound();
16022 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16023
Tony Barbourd6673642016-05-05 14:46:39 -060016024 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
16025 // VIEW_CREATE_ERROR
16026 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016027 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060016028 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16029 m_errorMonitor->VerifyFound();
16030 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
16031
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060016032 // TODO: Update framework to easily passing mutable flag into ImageObj init
16033 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070016034 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
16035 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16036 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060016037 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
16038 // VIEW_CREATE_ERROR
16039 VkImageCreateInfo mutImgInfo = image.create_info();
16040 VkImage mutImage;
16041 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016042 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060016043 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
16044 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016045 VkResult ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
Tony Barbourd6673642016-05-05 14:46:39 -060016046 ASSERT_VK_SUCCESS(ret);
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016047
16048 VkMemoryRequirements requirements;
16049 vkGetImageMemoryRequirements(m_device->device(), mutImage, &requirements);
16050
16051 VkMemoryAllocateInfo alloc_info{};
16052 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16053 alloc_info.pNext = NULL;
16054 alloc_info.memoryTypeIndex = 0;
16055 alloc_info.allocationSize = requirements.size;
16056 bool pass = m_device->phy().set_memory_type(requirements.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
16057 ASSERT_TRUE(pass);
16058
16059 VkDeviceMemory memory;
16060 ret = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &memory);
16061 ASSERT_VK_SUCCESS(ret);
16062
16063 ret = vkBindImageMemory(m_device->device(), mutImage, memory, 0);
16064 ASSERT_VK_SUCCESS(ret);
16065
Tony Barbourd6673642016-05-05 14:46:39 -060016066 imgViewInfo.image = mutImage;
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016067 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tony Barbourd6673642016-05-05 14:46:39 -060016068 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
16069 m_errorMonitor->VerifyFound();
16070 imgViewInfo.image = image.handle();
Jeremy Hayes2ffbaa72017-03-14 17:05:50 -060016071
16072 vkFreeMemory(m_device->device(), memory, NULL);
Tony Barbourd6673642016-05-05 14:46:39 -060016073 vkDestroyImage(m_device->handle(), mutImage, NULL);
16074}
16075
Dave Houlton75967fc2017-03-06 17:21:16 -070016076TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
16077 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
16078
Tony Barbour1fa09702017-03-16 12:09:08 -060016079 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton75967fc2017-03-06 17:21:16 -070016080
Jamie Madill35127872017-03-15 16:17:46 -040016081 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton75967fc2017-03-06 17:21:16 -070016082 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
16083 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
16084 if (device_features.textureCompressionBC) {
16085 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
16086 } else if (device_features.textureCompressionETC2) {
16087 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
16088 } else if (device_features.textureCompressionASTC_LDR) {
16089 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
16090 } else {
16091 printf(" No compressed formats supported - CompressedImageMipCopyTests skipped.\n");
16092 return;
16093 }
16094
16095 VkImageCreateInfo ci;
16096 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16097 ci.pNext = NULL;
16098 ci.flags = 0;
16099 ci.imageType = VK_IMAGE_TYPE_2D;
16100 ci.format = compressed_format;
16101 ci.extent = {32, 32, 1};
16102 ci.mipLevels = 6;
16103 ci.arrayLayers = 1;
16104 ci.samples = VK_SAMPLE_COUNT_1_BIT;
16105 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
16106 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16107 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
16108 ci.queueFamilyIndexCount = 0;
16109 ci.pQueueFamilyIndices = NULL;
16110 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16111
16112 VkImageObj image(m_device);
16113 image.init(&ci);
16114 ASSERT_TRUE(image.initialized());
16115
16116 VkImageObj odd_image(m_device);
16117 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
16118 odd_image.init(&ci);
16119 ASSERT_TRUE(odd_image.initialized());
16120
16121 // Allocate buffers
16122 VkMemoryPropertyFlags reqs = 0;
16123 vk_testing::Buffer buffer_1024, buffer_64, buffer_16, buffer_8;
16124 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
16125 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
16126 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
16127 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
16128
16129 VkBufferImageCopy region = {};
16130 region.bufferRowLength = 0;
16131 region.bufferImageHeight = 0;
16132 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16133 region.imageSubresource.layerCount = 1;
16134 region.imageOffset = {0, 0, 0};
16135 region.bufferOffset = 0;
16136
16137 // start recording
16138 m_commandBuffer->BeginCommandBuffer();
16139
16140 // Mip level copies that work - 5 levels
16141 m_errorMonitor->ExpectSuccess();
16142
16143 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
16144 region.imageExtent = {32, 32, 1};
16145 region.imageSubresource.mipLevel = 0;
16146 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1,
16147 &region);
16148 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16149 &region);
16150
16151 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
16152 region.imageExtent = {8, 8, 1};
16153 region.imageSubresource.mipLevel = 2;
16154 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1,
16155 &region);
16156 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16157 &region);
16158
16159 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
16160 region.imageExtent = {4, 4, 1};
16161 region.imageSubresource.mipLevel = 3;
16162 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16163 &region);
16164 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16165 &region);
16166
16167 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
16168 region.imageExtent = {2, 2, 1};
16169 region.imageSubresource.mipLevel = 4;
16170 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16171 &region);
16172 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16173 &region);
16174
16175 region.imageExtent = {1, 1, 1};
16176 region.imageSubresource.mipLevel = 5;
16177 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16178 &region);
16179 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16180 &region);
16181 m_errorMonitor->VerifyNotFound();
16182
16183 // Buffer must accomodate a full compressed block, regardless of texel count
16184 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16185 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1,
16186 &region);
16187 m_errorMonitor->VerifyFound();
16188 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227);
16189 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16190 &region);
16191 m_errorMonitor->VerifyFound();
16192
16193 // Copy width < compressed block size, but not the full mip width
16194 region.imageExtent = {1, 2, 1};
16195 region.imageSubresource.mipLevel = 4;
16196 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16197 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16198 &region);
16199 m_errorMonitor->VerifyFound();
16200 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16201 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16202 &region);
16203 m_errorMonitor->VerifyFound();
16204
16205 // Copy height < compressed block size but not the full mip height
16206 region.imageExtent = {2, 1, 1};
16207 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16208 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16209 &region);
16210 m_errorMonitor->VerifyFound();
16211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16212 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16213 &region);
16214 m_errorMonitor->VerifyFound();
16215
16216 // Offsets must be multiple of compressed block size
16217 region.imageOffset = {1, 1, 0};
16218 region.imageExtent = {1, 1, 1};
16219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16220 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16221 &region);
16222 m_errorMonitor->VerifyFound();
16223 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16224 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16225 &region);
16226 m_errorMonitor->VerifyFound();
16227
16228 // Offset + extent width = mip width - should succeed
16229 region.imageOffset = {4, 4, 0};
16230 region.imageExtent = {3, 4, 1};
16231 region.imageSubresource.mipLevel = 2;
16232 m_errorMonitor->ExpectSuccess();
16233 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16234 &region);
16235 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16236 &region);
16237 m_errorMonitor->VerifyNotFound();
16238
16239 // Offset + extent width > mip width, but still within the final compressed block - should succeed
16240 region.imageExtent = {4, 4, 1};
16241 m_errorMonitor->ExpectSuccess();
16242 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16243 &region);
16244 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16245 &region);
16246 m_errorMonitor->VerifyNotFound();
16247
16248 // Offset + extent width < mip width and not a multiple of block width - should fail
16249 region.imageExtent = {3, 3, 1};
16250 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16251 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16252 &region);
16253 m_errorMonitor->VerifyFound();
16254 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16255 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16256 &region);
16257 m_errorMonitor->VerifyFound();
16258}
16259
Dave Houlton59a20702017-02-02 17:26:23 -070016260TEST_F(VkLayerTest, ImageBufferCopyTests) {
16261 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
16262
Tony Barbour1fa09702017-03-16 12:09:08 -060016263 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070016264 VkFormatProperties format_props = m_device->format_properties(VK_FORMAT_D24_UNORM_S8_UINT);
16265 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
16266 printf(" VK_FORMAT_D24_UNORM_S8_UINT not supported. Skipped.\n");
16267 return;
16268 }
Dave Houlton584d51e2017-02-16 12:52:54 -070016269
16270 // Bail if any dimension of transfer granularity is 0.
16271 auto index = m_device->graphics_queue_node_index_;
16272 auto queue_family_properties = m_device->phy().queue_properties();
16273 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
16274 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
16275 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
16276 printf(" Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n");
16277 return;
16278 }
16279
Dave Houlton59a20702017-02-02 17:26:23 -070016280 VkImageObj image_64k(m_device); // 128^2 texels, 64k
16281 VkImageObj image_16k(m_device); // 64^2 texels, 16k
16282 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
Dave Houltonf3229d52017-02-21 15:59:08 -070016283 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
16284 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
16285 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
16286 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
16287
Dave Houlton59a20702017-02-02 17:26:23 -070016288 image_64k.init(128, 128, VK_FORMAT_R8G8B8A8_UINT,
16289 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16290 VK_IMAGE_TILING_OPTIMAL, 0);
16291 image_16k.init(64, 64, VK_FORMAT_R8G8B8A8_UINT,
16292 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16293 VK_IMAGE_TILING_OPTIMAL, 0);
16294 image_16k_depth.init(64, 64, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16295 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton59a20702017-02-02 17:26:23 -070016296 ASSERT_TRUE(image_64k.initialized());
16297 ASSERT_TRUE(image_16k.initialized());
16298 ASSERT_TRUE(image_16k_depth.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016299
Dave Houltonf3229d52017-02-21 15:59:08 -070016300 // Verify all needed Depth/Stencil formats are supported
16301 bool missing_ds_support = false;
16302 VkFormatProperties props = {0, 0, 0};
16303 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
16304 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16305 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
16306 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16307 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
16308 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16309 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
16310 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16311
16312 if (!missing_ds_support) {
16313 ds_image_4D_1S.init(
16314 256, 256, VK_FORMAT_D32_SFLOAT_S8_UINT,
16315 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16316 VK_IMAGE_TILING_OPTIMAL, 0);
16317 ASSERT_TRUE(ds_image_4D_1S.initialized());
16318
16319 ds_image_3D_1S.init(
16320 256, 256, VK_FORMAT_D24_UNORM_S8_UINT,
16321 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16322 VK_IMAGE_TILING_OPTIMAL, 0);
16323 ASSERT_TRUE(ds_image_3D_1S.initialized());
16324
16325 ds_image_2D.init(
16326 256, 256, VK_FORMAT_D16_UNORM,
16327 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16328 VK_IMAGE_TILING_OPTIMAL, 0);
16329 ASSERT_TRUE(ds_image_2D.initialized());
16330
16331 ds_image_1S.init(
16332 256, 256, VK_FORMAT_S8_UINT,
16333 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16334 VK_IMAGE_TILING_OPTIMAL, 0);
16335 ASSERT_TRUE(ds_image_1S.initialized());
16336 }
16337
16338 // Allocate buffers
16339 vk_testing::Buffer buffer_256k, buffer_128k, buffer_64k, buffer_16k;
Dave Houlton59a20702017-02-02 17:26:23 -070016340 VkMemoryPropertyFlags reqs = 0;
Dave Houltonf3229d52017-02-21 15:59:08 -070016341 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
16342 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
16343 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
16344 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
Dave Houlton59a20702017-02-02 17:26:23 -070016345
16346 VkBufferImageCopy region = {};
16347 region.bufferRowLength = 0;
16348 region.bufferImageHeight = 0;
16349 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16350 region.imageSubresource.layerCount = 1;
16351 region.imageOffset = {0, 0, 0};
16352 region.imageExtent = {64, 64, 1};
16353 region.bufferOffset = 0;
16354
16355 // attempt copies before putting command buffer in recording state
16356 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01240);
16357 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16358 &region);
16359 m_errorMonitor->VerifyFound();
16360
16361 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01258);
16362 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16363 &region);
16364 m_errorMonitor->VerifyFound();
16365
16366 // start recording
16367 m_commandBuffer->BeginCommandBuffer();
16368
16369 // successful copies
16370 m_errorMonitor->ExpectSuccess();
16371 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16372 &region);
16373 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16374 &region);
16375 region.imageOffset.x = 16; // 16k copy, offset requires larger image
16376 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16377 &region);
16378 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
16379 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16380 &region);
16381 region.imageOffset.x = 0;
16382 region.imageExtent.height = 64;
16383 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
16384 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16385 &region);
16386 m_errorMonitor->VerifyNotFound();
16387
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016388 // image/buffer too small (extent too large) on copy to image
Dave Houlton59a20702017-02-02 17:26:23 -070016389 region.imageExtent = {65, 64, 1};
16390 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16391 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16392 &region);
16393 m_errorMonitor->VerifyFound();
16394
16395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16396 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16397 &region);
16398 m_errorMonitor->VerifyFound();
16399
16400 // image/buffer too small (offset) on copy to image
16401 region.imageExtent = {64, 64, 1};
16402 region.imageOffset = {0, 4, 0};
16403 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16404 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16405 &region);
16406 m_errorMonitor->VerifyFound();
16407
16408 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16409 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16410 &region);
16411 m_errorMonitor->VerifyFound();
16412
16413 // image/buffer too small on copy to buffer
16414 region.imageExtent = {64, 64, 1};
16415 region.imageOffset = {0, 0, 0};
Mark Lobodzinski80871462017-02-16 10:37:27 -070016416 region.bufferOffset = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016417 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246); // buffer too small
16418 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16419 &region);
16420 m_errorMonitor->VerifyFound();
16421
16422 region.imageExtent = {64, 65, 1};
16423 region.bufferOffset = 0;
16424 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01245); // image too small
16425 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16426 &region);
16427 m_errorMonitor->VerifyFound();
16428
16429 // buffer size ok but rowlength causes loose packing
16430 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16431 region.imageExtent = {64, 64, 1};
16432 region.bufferRowLength = 68;
16433 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16434 &region);
16435 m_errorMonitor->VerifyFound();
16436
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016437 // An extent with zero area should produce a warning, but no error
16438 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT, "} has zero area");
16439 region.imageExtent.width = 0;
16440 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16441 &region);
16442 m_errorMonitor->VerifyFound();
16443
Dave Houlton59a20702017-02-02 17:26:23 -070016444 // aspect bits
16445 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01280); // more than 1 aspect bit set
16446 region.imageExtent = {64, 64, 1};
16447 region.bufferRowLength = 0;
16448 region.bufferImageHeight = 0;
16449 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16450 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16451 buffer_16k.handle(), 1, &region);
16452 m_errorMonitor->VerifyFound();
16453
16454 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // mis-matched aspect
16455 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16456 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16457 &region);
16458 m_errorMonitor->VerifyFound();
16459
16460 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // different mis-matched aspect
16461 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16462 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16463 buffer_16k.handle(), 1, &region);
16464 m_errorMonitor->VerifyFound();
16465
Dave Houltonf3229d52017-02-21 15:59:08 -070016466 // Test Depth/Stencil copies
16467 if (missing_ds_support) {
16468 printf(" Depth / Stencil formats unsupported - skipping D/S tests.\n");
16469 } else {
16470 VkBufferImageCopy ds_region = {};
16471 ds_region.bufferOffset = 0;
16472 ds_region.bufferRowLength = 0;
16473 ds_region.bufferImageHeight = 0;
16474 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16475 ds_region.imageSubresource.mipLevel = 0;
16476 ds_region.imageSubresource.baseArrayLayer = 0;
16477 ds_region.imageSubresource.layerCount = 1;
16478 ds_region.imageOffset = {0, 0, 0};
16479 ds_region.imageExtent = {256, 256, 1};
16480
16481 // Depth copies that should succeed
16482 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
16483 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16484 buffer_256k.handle(), 1, &ds_region);
16485 m_errorMonitor->VerifyNotFound();
16486
16487 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
16488 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16489 buffer_256k.handle(), 1, &ds_region);
16490 m_errorMonitor->VerifyNotFound();
16491
16492 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
16493 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16494 buffer_128k.handle(), 1, &ds_region);
16495 m_errorMonitor->VerifyNotFound();
16496
16497 // Depth copies that should fail
16498 ds_region.bufferOffset = 4;
16499 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16500 VALIDATION_ERROR_01246); // Extract 4b depth per texel, pack into 256k buffer
16501 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16502 buffer_256k.handle(), 1, &ds_region);
16503 m_errorMonitor->VerifyFound();
16504
16505 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16506 VALIDATION_ERROR_01246); // Extract 3b depth per texel, pack (loose) into 256k buffer
16507 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16508 buffer_256k.handle(), 1, &ds_region);
16509 m_errorMonitor->VerifyFound();
16510
16511 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16512 VALIDATION_ERROR_01246); // Copy 2b depth per texel, into 128k buffer
16513 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16514 buffer_128k.handle(), 1, &ds_region);
16515 m_errorMonitor->VerifyFound();
16516
16517 // Stencil copies that should succeed
16518 ds_region.bufferOffset = 0;
16519 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
16520 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16521 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16522 buffer_64k.handle(), 1, &ds_region);
16523 m_errorMonitor->VerifyNotFound();
16524
16525 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16526 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16527 buffer_64k.handle(), 1, &ds_region);
16528 m_errorMonitor->VerifyNotFound();
16529
16530 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
16531 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16532 buffer_64k.handle(), 1, &ds_region);
16533 m_errorMonitor->VerifyNotFound();
16534
16535 // Stencil copies that should fail
16536 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16537 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16538 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16539 buffer_16k.handle(), 1, &ds_region);
16540 m_errorMonitor->VerifyFound();
16541
16542 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16543 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16544 ds_region.bufferRowLength = 260;
16545 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16546 buffer_64k.handle(), 1, &ds_region);
16547 m_errorMonitor->VerifyFound();
16548
16549 ds_region.bufferRowLength = 0;
16550 ds_region.bufferOffset = 4;
16551 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16552 VALIDATION_ERROR_01246); // Copy 1b depth per texel, into 64k buffer
16553 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16554 buffer_64k.handle(), 1, &ds_region);
16555 m_errorMonitor->VerifyFound();
16556 }
16557
Dave Houlton584d51e2017-02-16 12:52:54 -070016558 // Test compressed formats, if supported
Jamie Madill35127872017-03-15 16:17:46 -040016559 VkPhysicalDeviceFeatures device_features = {};
Dave Houlton584d51e2017-02-16 12:52:54 -070016560 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houltonf3229d52017-02-21 15:59:08 -070016561 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
16562 device_features.textureCompressionASTC_LDR)) {
16563 printf(" No compressed formats supported - block compression tests skipped.\n");
16564 } else {
Dave Houlton67e9b532017-03-02 17:00:10 -070016565 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
16566 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
Dave Houlton584d51e2017-02-16 12:52:54 -070016567 if (device_features.textureCompressionBC) {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016568 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 -070016569 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
16570 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016571 } else if (device_features.textureCompressionETC2) {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016572 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 -070016573 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton67e9b532017-03-02 17:00:10 -070016574 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16575 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016576 } else {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016577 image_16k_4x4comp.init(128, 128, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16578 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton67e9b532017-03-02 17:00:10 -070016579 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16580 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016581 }
16582 ASSERT_TRUE(image_16k_4x4comp.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016583
Dave Houlton584d51e2017-02-16 12:52:54 -070016584 // Just fits
16585 m_errorMonitor->ExpectSuccess();
16586 region.imageExtent = {128, 128, 1};
16587 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16588 buffer_16k.handle(), 1, &region);
16589 m_errorMonitor->VerifyNotFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016590
Dave Houlton584d51e2017-02-16 12:52:54 -070016591 // with offset, too big for buffer
16592 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16593 region.bufferOffset = 16;
16594 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16595 buffer_16k.handle(), 1, &region);
16596 m_errorMonitor->VerifyFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016597 region.bufferOffset = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016598
Dave Houlton67e9b532017-03-02 17:00:10 -070016599 // extents that are not a multiple of compressed block size
16600 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16601 region.imageExtent.width = 66;
16602 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16603 buffer_16k.handle(), 1, &region);
16604 m_errorMonitor->VerifyFound();
16605 region.imageExtent.width = 128;
16606
16607 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016608 region.imageExtent.height = 2;
Dave Houlton67e9b532017-03-02 17:00:10 -070016609 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16610 buffer_16k.handle(), 1, &region);
16611 m_errorMonitor->VerifyFound();
16612 region.imageExtent.height = 128;
16613
16614 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
16615
16616 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
16617 m_errorMonitor->ExpectSuccess();
16618 region.imageExtent.width = 66;
16619 region.imageOffset.x = 64;
16620 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16621 buffer_16k.handle(), 1, &region);
16622 region.imageExtent.width = 16;
16623 region.imageOffset.x = 0;
16624 region.imageExtent.height = 2;
16625 region.imageOffset.y = 128;
16626 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016627 buffer_16k.handle(), 1, &region);
16628 m_errorMonitor->VerifyNotFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016629 region.imageOffset = {0, 0, 0};
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016630
Dave Houlton584d51e2017-02-16 12:52:54 -070016631 // buffer offset must be a multiple of texel block size (16)
16632 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01274);
16633 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
16634 region.imageExtent = {64, 64, 1};
16635 region.bufferOffset = 24;
16636 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16637 buffer_16k.handle(), 1, &region);
16638 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016639
Dave Houlton584d51e2017-02-16 12:52:54 -070016640 // rowlength not a multiple of block width (4)
16641 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01271);
16642 region.bufferOffset = 0;
16643 region.bufferRowLength = 130;
16644 region.bufferImageHeight = 0;
16645 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16646 buffer_64k.handle(), 1, &region);
16647 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016648
Dave Houlton584d51e2017-02-16 12:52:54 -070016649 // imageheight not a multiple of block height (4)
16650 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01272);
16651 region.bufferRowLength = 0;
16652 region.bufferImageHeight = 130;
16653 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16654 buffer_64k.handle(), 1, &region);
16655 m_errorMonitor->VerifyFound();
Dave Houlton584d51e2017-02-16 12:52:54 -070016656 }
Dave Houlton59a20702017-02-02 17:26:23 -070016657}
16658
Tony Barbourd6673642016-05-05 14:46:39 -060016659TEST_F(VkLayerTest, MiscImageLayerTests) {
Mark Lobodzinskie6911292017-02-15 14:38:51 -070016660 TEST_DESCRIPTION("Image-related tests that don't belong elsewhare");
Tony Barbourd6673642016-05-05 14:46:39 -060016661
Tony Barbour1fa09702017-03-16 12:09:08 -060016662 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourd6673642016-05-05 14:46:39 -060016663
Rene Lindsay135204f2016-12-22 17:11:09 -070016664 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060016665 VkImageObj image(m_device);
Rene Lindsay135204f2016-12-22 17:11:09 -070016666 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 -070016667 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060016668 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060016669 vk_testing::Buffer buffer;
16670 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070016671 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060016672 VkBufferImageCopy region = {};
16673 region.bufferRowLength = 128;
16674 region.bufferImageHeight = 128;
16675 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16676 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070016677 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016678 region.imageExtent.height = 4;
16679 region.imageExtent.width = 4;
16680 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070016681
16682 VkImageObj image2(m_device);
16683 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 -070016684 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070016685 ASSERT_TRUE(image2.initialized());
16686 vk_testing::Buffer buffer2;
16687 VkMemoryPropertyFlags reqs2 = 0;
16688 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
16689 VkBufferImageCopy region2 = {};
16690 region2.bufferRowLength = 128;
16691 region2.bufferImageHeight = 128;
16692 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16693 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
16694 region2.imageSubresource.layerCount = 1;
16695 region2.imageExtent.height = 4;
16696 region2.imageExtent.width = 4;
16697 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016698 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060016699
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016700 // Image must have offset.z of 0 and extent.depth of 1
16701 // Introduce failure by setting imageExtent.depth to 0
16702 region.imageExtent.depth = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016703 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016704 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016705 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016706 m_errorMonitor->VerifyFound();
16707
16708 region.imageExtent.depth = 1;
16709
16710 // Image must have offset.z of 0 and extent.depth of 1
16711 // Introduce failure by setting imageOffset.z to 4
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016712 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016713 region.imageOffset.z = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016714 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016715 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016716 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016717 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016718 m_errorMonitor->VerifyFound();
16719
16720 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016721 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
16722 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070016723 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016724 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016725 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16726 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016727 m_errorMonitor->VerifyFound();
16728
16729 // BufferOffset must be a multiple of 4
16730 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070016731 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016732 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070016733 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
16734 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016735 m_errorMonitor->VerifyFound();
16736
16737 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
16738 region.bufferOffset = 0;
16739 region.imageExtent.height = 128;
16740 region.imageExtent.width = 128;
16741 // Introduce failure by setting bufferRowLength > 0 but less than width
16742 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016743 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016744 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16745 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016746 m_errorMonitor->VerifyFound();
16747
16748 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
16749 region.bufferRowLength = 128;
16750 // Introduce failure by setting bufferRowHeight > 0 but less than height
16751 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016752 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016753 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16754 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016755 m_errorMonitor->VerifyFound();
16756
16757 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060016758 VkImageObj intImage1(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070016759 intImage1.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16760 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016761 VkImageObj intImage2(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070016762 intImage2.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16763 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016764 VkImageBlit blitRegion = {};
16765 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16766 blitRegion.srcSubresource.baseArrayLayer = 0;
16767 blitRegion.srcSubresource.layerCount = 1;
16768 blitRegion.srcSubresource.mipLevel = 0;
16769 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16770 blitRegion.dstSubresource.baseArrayLayer = 0;
16771 blitRegion.dstSubresource.layerCount = 1;
16772 blitRegion.dstSubresource.mipLevel = 0;
16773
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016774 // Look for NULL-blit warning
Jeremy Hayesf8e749f2017-03-15 09:40:27 -060016775 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
16776 "vkCmdBlitImage: pRegions[0].srcOffsets specify a zero-volume area.");
16777 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
16778 "vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016779 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.layout(), intImage2.handle(),
16780 intImage2.layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016781 m_errorMonitor->VerifyFound();
16782
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070016783 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060016784 VkImageMemoryBarrier img_barrier;
16785 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
16786 img_barrier.pNext = NULL;
16787 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
16788 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
16789 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16790 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16791 img_barrier.image = image.handle();
16792 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16793 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16794 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16795 img_barrier.subresourceRange.baseArrayLayer = 0;
16796 img_barrier.subresourceRange.baseMipLevel = 0;
Tony Barbourd6673642016-05-05 14:46:39 -060016797 img_barrier.subresourceRange.layerCount = 0;
16798 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016799 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
16800 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060016801 m_errorMonitor->VerifyFound();
16802 img_barrier.subresourceRange.layerCount = 1;
16803}
16804
16805TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060016806 TEST_DESCRIPTION("Exceed the limits of image format ");
16807
Tony Barbour1fa09702017-03-16 12:09:08 -060016808 ASSERT_NO_FATAL_FAILURE(Init());
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016809
16810 VkFormat const format = VK_FORMAT_B8G8R8A8_UNORM;
16811 {
16812 VkFormatProperties properties;
16813 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), format, &properties);
16814 if (properties.linearTilingFeatures == 0) {
16815 printf(" Image format not supported; skipped.\n");
16816 return;
16817 }
16818 }
16819
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016820 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060016821 VkImageCreateInfo image_create_info = {};
16822 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16823 image_create_info.pNext = NULL;
16824 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Jeremy Hayesbb63cc12017-03-20 15:33:01 -060016825 image_create_info.format = format;
Tony Barbourd6673642016-05-05 14:46:39 -060016826 image_create_info.extent.width = 32;
16827 image_create_info.extent.height = 32;
16828 image_create_info.extent.depth = 1;
16829 image_create_info.mipLevels = 1;
16830 image_create_info.arrayLayers = 1;
16831 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16832 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16833 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16834 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16835 image_create_info.flags = 0;
16836
16837 VkImage nullImg;
16838 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016839 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
16840 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070016841 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016842 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16843 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16844 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070016845 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016846
Tony Barbour0907e362017-03-09 15:05:30 -070016847 uint32_t maxDim =
16848 std::max(std::max(image_create_info.extent.width, image_create_info.extent.height), image_create_info.extent.depth);
16849 // If max mip levels exceeds image extents, skip the max mip levels test
16850 if ((imgFmtProps.maxMipLevels + 1) <= (floor(log2(maxDim)) + 1)) {
16851 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
16852 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
16853 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16854 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16855 m_errorMonitor->VerifyFound();
16856 image_create_info.mipLevels = 1;
16857 }
Tony Barbourd6673642016-05-05 14:46:39 -060016858
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016859 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060016860 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
16861 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16862 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16863 m_errorMonitor->VerifyFound();
16864 image_create_info.arrayLayers = 1;
16865
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016866 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060016867 int samples = imgFmtProps.sampleCounts >> 1;
16868 image_create_info.samples = (VkSampleCountFlagBits)samples;
16869 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16870 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16871 m_errorMonitor->VerifyFound();
16872 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16873
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16875 "pCreateInfo->initialLayout, must be "
16876 "VK_IMAGE_LAYOUT_UNDEFINED or "
16877 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060016878 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16879 // Expect INVALID_LAYOUT
16880 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16881 m_errorMonitor->VerifyFound();
16882 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16883}
16884
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016885TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016886 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060016887 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016888
Tony Barbour1fa09702017-03-16 12:09:08 -060016889 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016890
16891 VkImageObj src_image(m_device);
16892 src_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
16893 VkImageObj dst_image(m_device);
16894 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
16895
Tony Barbour552f6c02016-12-21 14:34:07 -070016896 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016897 VkImageCopy copy_region;
16898 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16899 copy_region.srcSubresource.mipLevel = 0;
16900 copy_region.srcSubresource.baseArrayLayer = 0;
16901 copy_region.srcSubresource.layerCount = 0;
16902 copy_region.srcOffset.x = 0;
16903 copy_region.srcOffset.y = 0;
16904 copy_region.srcOffset.z = 0;
16905 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16906 copy_region.dstSubresource.mipLevel = 0;
16907 copy_region.dstSubresource.baseArrayLayer = 0;
16908 copy_region.dstSubresource.layerCount = 0;
16909 copy_region.dstOffset.x = 0;
16910 copy_region.dstOffset.y = 0;
16911 copy_region.dstOffset.z = 0;
16912 copy_region.extent.width = 64;
16913 copy_region.extent.height = 64;
16914 copy_region.extent.depth = 1;
16915 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
16916 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070016917 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016918
16919 m_errorMonitor->VerifyFound();
16920}
16921
16922TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016923 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060016924 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016925
Tony Barbour1fa09702017-03-16 12:09:08 -060016926 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016927
16928 VkImageObj src_image(m_device);
16929 src_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
16930 VkImageObj dst_image(m_device);
16931 dst_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
16932
Tony Barbour552f6c02016-12-21 14:34:07 -070016933 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016934 VkImageCopy copy_region;
16935 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16936 copy_region.srcSubresource.mipLevel = 0;
16937 copy_region.srcSubresource.baseArrayLayer = 0;
16938 copy_region.srcSubresource.layerCount = 0;
16939 copy_region.srcOffset.x = 0;
16940 copy_region.srcOffset.y = 0;
16941 copy_region.srcOffset.z = 0;
16942 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16943 copy_region.dstSubresource.mipLevel = 0;
16944 copy_region.dstSubresource.baseArrayLayer = 0;
16945 copy_region.dstSubresource.layerCount = 0;
16946 copy_region.dstOffset.x = 0;
16947 copy_region.dstOffset.y = 0;
16948 copy_region.dstOffset.z = 0;
16949 copy_region.extent.width = 64;
16950 copy_region.extent.height = 64;
16951 copy_region.extent.depth = 1;
16952 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
16953 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070016954 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016955
16956 m_errorMonitor->VerifyFound();
16957}
16958
Karl Schultz6addd812016-02-02 17:17:23 -070016959TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060016960 VkResult err;
16961 bool pass;
16962
16963 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016964 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060016965
Tony Barbour1fa09702017-03-16 12:09:08 -060016966 ASSERT_NO_FATAL_FAILURE(Init());
Karl Schultzbdb75952016-04-19 11:36:49 -060016967
16968 // Create two images of different types and try to copy between them
16969 VkImage srcImage;
16970 VkImage dstImage;
16971 VkDeviceMemory srcMem;
16972 VkDeviceMemory destMem;
16973 VkMemoryRequirements memReqs;
16974
16975 VkImageCreateInfo image_create_info = {};
16976 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16977 image_create_info.pNext = NULL;
16978 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16979 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16980 image_create_info.extent.width = 32;
16981 image_create_info.extent.height = 32;
16982 image_create_info.extent.depth = 1;
16983 image_create_info.mipLevels = 1;
16984 image_create_info.arrayLayers = 1;
16985 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16986 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16987 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16988 image_create_info.flags = 0;
16989
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016990 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060016991 ASSERT_VK_SUCCESS(err);
16992
16993 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16994 // Introduce failure by creating second image with a different-sized format.
16995 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
16996
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016997 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060016998 ASSERT_VK_SUCCESS(err);
16999
17000 // Allocate memory
17001 VkMemoryAllocateInfo memAlloc = {};
17002 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17003 memAlloc.pNext = NULL;
17004 memAlloc.allocationSize = 0;
17005 memAlloc.memoryTypeIndex = 0;
17006
17007 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
17008 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017009 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017010 ASSERT_TRUE(pass);
17011 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
17012 ASSERT_VK_SUCCESS(err);
17013
17014 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
17015 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017016 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060017017 ASSERT_TRUE(pass);
17018 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
17019 ASSERT_VK_SUCCESS(err);
17020
17021 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17022 ASSERT_VK_SUCCESS(err);
17023 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
17024 ASSERT_VK_SUCCESS(err);
17025
Tony Barbour552f6c02016-12-21 14:34:07 -070017026 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017027 VkImageCopy copyRegion;
17028 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17029 copyRegion.srcSubresource.mipLevel = 0;
17030 copyRegion.srcSubresource.baseArrayLayer = 0;
17031 copyRegion.srcSubresource.layerCount = 0;
17032 copyRegion.srcOffset.x = 0;
17033 copyRegion.srcOffset.y = 0;
17034 copyRegion.srcOffset.z = 0;
17035 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17036 copyRegion.dstSubresource.mipLevel = 0;
17037 copyRegion.dstSubresource.baseArrayLayer = 0;
17038 copyRegion.dstSubresource.layerCount = 0;
17039 copyRegion.dstOffset.x = 0;
17040 copyRegion.dstOffset.y = 0;
17041 copyRegion.dstOffset.z = 0;
17042 copyRegion.extent.width = 1;
17043 copyRegion.extent.height = 1;
17044 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017045 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017046 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060017047
17048 m_errorMonitor->VerifyFound();
17049
17050 vkDestroyImage(m_device->device(), srcImage, NULL);
17051 vkDestroyImage(m_device->device(), dstImage, NULL);
17052 vkFreeMemory(m_device->device(), srcMem, NULL);
17053 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017054}
17055
Karl Schultz6addd812016-02-02 17:17:23 -070017056TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
17057 VkResult err;
17058 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017059
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017060 // Create a depth image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017061 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17062 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017063
Tony Barbour1fa09702017-03-16 12:09:08 -060017064 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070017065 auto depth_format = find_depth_stencil_format(m_device);
17066 if (!depth_format) {
17067 return;
17068 }
Mike Stroyana3082432015-09-25 13:39:21 -060017069
17070 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017071 VkImage srcImage;
17072 VkImage dstImage;
17073 VkDeviceMemory srcMem;
17074 VkDeviceMemory destMem;
17075 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017076
17077 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017078 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17079 image_create_info.pNext = NULL;
17080 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017081 image_create_info.format = VK_FORMAT_D32_SFLOAT;
Karl Schultz6addd812016-02-02 17:17:23 -070017082 image_create_info.extent.width = 32;
17083 image_create_info.extent.height = 32;
17084 image_create_info.extent.depth = 1;
17085 image_create_info.mipLevels = 1;
17086 image_create_info.arrayLayers = 1;
17087 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17088 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17089 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17090 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017091
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017092 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017093 ASSERT_VK_SUCCESS(err);
17094
Karl Schultzbdb75952016-04-19 11:36:49 -060017095 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17096
Mark Lobodzinskidb117632016-03-31 10:45:56 -060017097 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070017098 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tony Barbourf887b162017-03-09 10:06:46 -070017099 image_create_info.format = depth_format;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060017100 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017101
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017102 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017103 ASSERT_VK_SUCCESS(err);
17104
17105 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017106 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017107 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17108 memAlloc.pNext = NULL;
17109 memAlloc.allocationSize = 0;
17110 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017111
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017112 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017113 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017114 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017115 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017116 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017117 ASSERT_VK_SUCCESS(err);
17118
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017119 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017120 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017121 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017122 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017123 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017124 ASSERT_VK_SUCCESS(err);
17125
17126 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17127 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017128 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017129 ASSERT_VK_SUCCESS(err);
17130
Tony Barbour552f6c02016-12-21 14:34:07 -070017131 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017132 VkImageCopy copyRegion;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017133 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017134 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017135 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017136 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017137 copyRegion.srcOffset.x = 0;
17138 copyRegion.srcOffset.y = 0;
17139 copyRegion.srcOffset.z = 0;
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017140 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017141 copyRegion.dstSubresource.mipLevel = 0;
17142 copyRegion.dstSubresource.baseArrayLayer = 0;
17143 copyRegion.dstSubresource.layerCount = 0;
17144 copyRegion.dstOffset.x = 0;
17145 copyRegion.dstOffset.y = 0;
17146 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017147 copyRegion.extent.width = 1;
17148 copyRegion.extent.height = 1;
17149 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017150 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017151 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017152
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017153 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017154
Chia-I Wuf7458c52015-10-26 21:10:41 +080017155 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017156 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017157 vkFreeMemory(m_device->device(), srcMem, NULL);
17158 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017159}
17160
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017161TEST_F(VkLayerTest, CopyImageSampleCountMismatch) {
17162 TEST_DESCRIPTION("Image copies with sample count mis-matches");
Dave Houlton33c22b72017-02-28 13:16:02 -070017163
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017164 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton33c22b72017-02-28 13:16:02 -070017165
17166 VkImageFormatProperties image_format_properties;
17167 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
17168 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT, 0,
17169 &image_format_properties);
17170
17171 if ((0 == (VK_SAMPLE_COUNT_2_BIT & image_format_properties.sampleCounts)) ||
17172 (0 == (VK_SAMPLE_COUNT_4_BIT & image_format_properties.sampleCounts))) {
17173 printf(" Image multi-sample support not found; skipped.\n");
17174 return;
17175 }
17176
17177 VkImageCreateInfo ci;
17178 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17179 ci.pNext = NULL;
17180 ci.flags = 0;
17181 ci.imageType = VK_IMAGE_TYPE_2D;
17182 ci.format = VK_FORMAT_R8G8B8A8_UNORM;
17183 ci.extent = {128, 128, 1};
17184 ci.mipLevels = 1;
17185 ci.arrayLayers = 1;
17186 ci.samples = VK_SAMPLE_COUNT_1_BIT;
17187 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
17188 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
17189 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
17190 ci.queueFamilyIndexCount = 0;
17191 ci.pQueueFamilyIndices = NULL;
17192 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
17193
17194 VkImageObj image1(m_device);
17195 image1.init(&ci);
17196 ASSERT_TRUE(image1.initialized());
17197
17198 ci.samples = VK_SAMPLE_COUNT_2_BIT;
17199 VkImageObj image2(m_device);
17200 image2.init(&ci);
17201 ASSERT_TRUE(image2.initialized());
17202
17203 ci.samples = VK_SAMPLE_COUNT_4_BIT;
17204 VkImageObj image4(m_device);
17205 image4.init(&ci);
17206 ASSERT_TRUE(image4.initialized());
17207
17208 m_commandBuffer->BeginCommandBuffer();
17209
17210 VkImageCopy copyRegion;
17211 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17212 copyRegion.srcSubresource.mipLevel = 0;
17213 copyRegion.srcSubresource.baseArrayLayer = 0;
17214 copyRegion.srcSubresource.layerCount = 1;
17215 copyRegion.srcOffset = {0, 0, 0};
17216 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17217 copyRegion.dstSubresource.mipLevel = 0;
17218 copyRegion.dstSubresource.baseArrayLayer = 0;
17219 copyRegion.dstSubresource.layerCount = 1;
17220 copyRegion.dstOffset = {0, 0, 0};
17221 copyRegion.extent = {128, 128, 1};
17222
17223 // Copy a single sample image to/from a multi-sample image
17224 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17225 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image1.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17226 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17227 m_errorMonitor->VerifyFound();
17228
17229 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17230 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image1.handle(),
17231 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17232 m_errorMonitor->VerifyFound();
17233
17234 // Copy between multi-sample images with different sample counts
17235 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17236 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image2.handle(), VK_IMAGE_LAYOUT_GENERAL, image4.handle(),
17237 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17238 m_errorMonitor->VerifyFound();
17239
17240 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01185);
17241 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), image4.handle(), VK_IMAGE_LAYOUT_GENERAL, image2.handle(),
17242 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17243 m_errorMonitor->VerifyFound();
17244
17245 m_commandBuffer->EndCommandBuffer();
17246}
17247
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017248TEST_F(VkLayerTest, CopyImageAspectMismatch) {
17249 TEST_DESCRIPTION("Image copies with aspect mask errors");
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060017250 ASSERT_NO_FATAL_FAILURE(Init());
Dave Houlton4eaaf3a2017-03-14 11:31:20 -060017251
17252 VkImageObj color_image(m_device), ds_image(m_device), depth_image(m_device);
17253 color_image.init(128, 128, VK_FORMAT_R32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
17254 depth_image.init(128, 128, VK_FORMAT_D32_SFLOAT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
17255 ds_image.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT);
17256 ASSERT_TRUE(color_image.initialized());
17257 ASSERT_TRUE(depth_image.initialized());
17258 ASSERT_TRUE(ds_image.initialized());
17259
17260 VkImageCopy copyRegion;
17261 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17262 copyRegion.srcSubresource.mipLevel = 0;
17263 copyRegion.srcSubresource.baseArrayLayer = 0;
17264 copyRegion.srcSubresource.layerCount = 1;
17265 copyRegion.srcOffset = {0, 0, 0};
17266 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17267 copyRegion.dstSubresource.mipLevel = 0;
17268 copyRegion.dstSubresource.baseArrayLayer = 0;
17269 copyRegion.dstSubresource.layerCount = 1;
17270 copyRegion.dstOffset = {64, 0, 0};
17271 copyRegion.extent = {64, 128, 1};
17272
17273 // Submitting command before command buffer is in recording state
17274 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "You must call vkBeginCommandBuffer");// VALIDATION_ERROR_01192);
17275 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17276 m_errorMonitor->VerifyFound();
17277
17278 m_commandBuffer->BeginCommandBuffer();
17279
17280 // Src and dest aspect masks don't match
17281 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
17282 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01197);
17283 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17284 m_errorMonitor->VerifyFound();
17285 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17286
17287 // Illegal combinations of aspect bits - VU 01221
17288 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT; // color must be alone
17289 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
17290 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01221);
17291 // These aspect/format mismatches are redundant but unavoidable here
17292 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17293 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
17294 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17295 m_errorMonitor->VerifyFound();
17296 // Metadata aspect is illegal - VU 01222
17297 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17298 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
17299 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01222);
17300 // These aspect/format mismatches are redundant but unavoidable here
17301 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17302 m_errorMonitor->VerifyFound();
17303
17304 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17305 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
17306
17307 // Aspect mask doesn't match source image format - VU 01200
17308 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01200);
17309 // Again redundant but unavoidable when provoking vu01200 w/o vu01201
17310 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17311 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17312 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17313 m_errorMonitor->VerifyFound();
17314
17315 // Aspect mask doesn't match dest image format - VU 01201
17316 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17317 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
17318 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01201);
17319 // Again redundant but unavoidable when provoking vu01201 w/o vu01200
17320 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "unmatched source and dest image depth/stencil formats");
17321 vkCmdCopyImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, depth_image.handle(),
17322 VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
17323 m_errorMonitor->VerifyFound();
17324
17325 m_commandBuffer->EndCommandBuffer();
17326}
17327
Karl Schultz6addd812016-02-02 17:17:23 -070017328TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
17329 VkResult err;
17330 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017331
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017332 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17333 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017334
Tony Barbour1fa09702017-03-16 12:09:08 -060017335 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017336
17337 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017338 VkImage srcImage;
17339 VkImage dstImage;
17340 VkDeviceMemory srcMem;
17341 VkDeviceMemory destMem;
17342 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017343
17344 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017345 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17346 image_create_info.pNext = NULL;
17347 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17348 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17349 image_create_info.extent.width = 32;
17350 image_create_info.extent.height = 1;
17351 image_create_info.extent.depth = 1;
17352 image_create_info.mipLevels = 1;
17353 image_create_info.arrayLayers = 1;
17354 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17355 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17356 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17357 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017358
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017359 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017360 ASSERT_VK_SUCCESS(err);
17361
Karl Schultz6addd812016-02-02 17:17:23 -070017362 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017363
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017364 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017365 ASSERT_VK_SUCCESS(err);
17366
17367 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017368 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017369 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17370 memAlloc.pNext = NULL;
17371 memAlloc.allocationSize = 0;
17372 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017373
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017374 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017375 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017376 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017377 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017378 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017379 ASSERT_VK_SUCCESS(err);
17380
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017381 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017382 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017383 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017384 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017385 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017386 ASSERT_VK_SUCCESS(err);
17387
17388 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17389 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017390 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017391 ASSERT_VK_SUCCESS(err);
17392
Tony Barbour552f6c02016-12-21 14:34:07 -070017393 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017394 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017395 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17396 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017397 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017398 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017399 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017400 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017401 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017402 resolveRegion.srcOffset.x = 0;
17403 resolveRegion.srcOffset.y = 0;
17404 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017405 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017406 resolveRegion.dstSubresource.mipLevel = 0;
17407 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017408 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017409 resolveRegion.dstOffset.x = 0;
17410 resolveRegion.dstOffset.y = 0;
17411 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017412 resolveRegion.extent.width = 1;
17413 resolveRegion.extent.height = 1;
17414 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017415 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017416 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017417
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017418 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017419
Chia-I Wuf7458c52015-10-26 21:10:41 +080017420 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017421 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017422 vkFreeMemory(m_device->device(), srcMem, NULL);
17423 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017424}
17425
Karl Schultz6addd812016-02-02 17:17:23 -070017426TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
17427 VkResult err;
17428 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017429
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017430 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17431 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017432
Tony Barbour1fa09702017-03-16 12:09:08 -060017433 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017434
Chris Forbesa7530692016-05-08 12:35:39 +120017435 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017436 VkImage srcImage;
17437 VkImage dstImage;
17438 VkDeviceMemory srcMem;
17439 VkDeviceMemory destMem;
17440 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017441
17442 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017443 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17444 image_create_info.pNext = NULL;
17445 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17446 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17447 image_create_info.extent.width = 32;
17448 image_create_info.extent.height = 1;
17449 image_create_info.extent.depth = 1;
17450 image_create_info.mipLevels = 1;
17451 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120017452 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017453 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17454 // Note: Some implementations expect color attachment usage for any
17455 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017456 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017457 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017458
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017459 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017460 ASSERT_VK_SUCCESS(err);
17461
Karl Schultz6addd812016-02-02 17:17:23 -070017462 // Note: Some implementations expect color attachment usage for any
17463 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017464 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017465
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017466 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017467 ASSERT_VK_SUCCESS(err);
17468
17469 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017470 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017471 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17472 memAlloc.pNext = NULL;
17473 memAlloc.allocationSize = 0;
17474 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017475
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017476 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017477 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017478 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017479 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017480 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017481 ASSERT_VK_SUCCESS(err);
17482
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017483 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017484 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017485 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017486 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017487 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017488 ASSERT_VK_SUCCESS(err);
17489
17490 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17491 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017492 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017493 ASSERT_VK_SUCCESS(err);
17494
Tony Barbour552f6c02016-12-21 14:34:07 -070017495 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017496 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017497 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17498 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017499 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017500 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017501 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017502 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017503 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017504 resolveRegion.srcOffset.x = 0;
17505 resolveRegion.srcOffset.y = 0;
17506 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017507 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017508 resolveRegion.dstSubresource.mipLevel = 0;
17509 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017510 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017511 resolveRegion.dstOffset.x = 0;
17512 resolveRegion.dstOffset.y = 0;
17513 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017514 resolveRegion.extent.width = 1;
17515 resolveRegion.extent.height = 1;
17516 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017517 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017518 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017519
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017520 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017521
Chia-I Wuf7458c52015-10-26 21:10:41 +080017522 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017523 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017524 vkFreeMemory(m_device->device(), srcMem, NULL);
17525 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017526}
17527
Karl Schultz6addd812016-02-02 17:17:23 -070017528TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
17529 VkResult err;
17530 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017531
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017532 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017533 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017534
Tony Barbour1fa09702017-03-16 12:09:08 -060017535 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017536
17537 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017538 VkImage srcImage;
17539 VkImage dstImage;
17540 VkDeviceMemory srcMem;
17541 VkDeviceMemory destMem;
17542 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017543
17544 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017545 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17546 image_create_info.pNext = NULL;
17547 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17548 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17549 image_create_info.extent.width = 32;
17550 image_create_info.extent.height = 1;
17551 image_create_info.extent.depth = 1;
17552 image_create_info.mipLevels = 1;
17553 image_create_info.arrayLayers = 1;
17554 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17555 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17556 // Note: Some implementations expect color attachment usage for any
17557 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017558 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017559 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017560
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017561 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017562 ASSERT_VK_SUCCESS(err);
17563
Karl Schultz6addd812016-02-02 17:17:23 -070017564 // Set format to something other than source image
17565 image_create_info.format = VK_FORMAT_R32_SFLOAT;
17566 // Note: Some implementations expect color attachment usage for any
17567 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017568 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017569 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017570
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017571 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017572 ASSERT_VK_SUCCESS(err);
17573
17574 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017575 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017576 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17577 memAlloc.pNext = NULL;
17578 memAlloc.allocationSize = 0;
17579 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017580
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017581 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017582 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017583 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017584 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017585 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017586 ASSERT_VK_SUCCESS(err);
17587
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017588 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017589 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017590 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017591 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017592 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017593 ASSERT_VK_SUCCESS(err);
17594
17595 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17596 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017597 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017598 ASSERT_VK_SUCCESS(err);
17599
Tony Barbour552f6c02016-12-21 14:34:07 -070017600 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017601 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017602 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17603 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017604 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017605 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017606 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017607 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017608 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017609 resolveRegion.srcOffset.x = 0;
17610 resolveRegion.srcOffset.y = 0;
17611 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017612 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017613 resolveRegion.dstSubresource.mipLevel = 0;
17614 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017615 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017616 resolveRegion.dstOffset.x = 0;
17617 resolveRegion.dstOffset.y = 0;
17618 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017619 resolveRegion.extent.width = 1;
17620 resolveRegion.extent.height = 1;
17621 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017622 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017623 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017624
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017625 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017626
Chia-I Wuf7458c52015-10-26 21:10:41 +080017627 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017628 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017629 vkFreeMemory(m_device->device(), srcMem, NULL);
17630 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017631}
17632
Karl Schultz6addd812016-02-02 17:17:23 -070017633TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
17634 VkResult err;
17635 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017636
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017637 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017638 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017639
Tony Barbour1fa09702017-03-16 12:09:08 -060017640 ASSERT_NO_FATAL_FAILURE(Init());
Mike Stroyana3082432015-09-25 13:39:21 -060017641
17642 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017643 VkImage srcImage;
17644 VkImage dstImage;
17645 VkDeviceMemory srcMem;
17646 VkDeviceMemory destMem;
17647 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017648
17649 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017650 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17651 image_create_info.pNext = NULL;
17652 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17653 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17654 image_create_info.extent.width = 32;
17655 image_create_info.extent.height = 1;
17656 image_create_info.extent.depth = 1;
17657 image_create_info.mipLevels = 1;
17658 image_create_info.arrayLayers = 1;
17659 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17660 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17661 // Note: Some implementations expect color attachment usage for any
17662 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017663 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017664 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017665
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017666 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017667 ASSERT_VK_SUCCESS(err);
17668
Karl Schultz6addd812016-02-02 17:17:23 -070017669 image_create_info.imageType = VK_IMAGE_TYPE_1D;
17670 // Note: Some implementations expect color attachment usage for any
17671 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017672 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017673 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017674
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017675 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017676 ASSERT_VK_SUCCESS(err);
17677
17678 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017679 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017680 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17681 memAlloc.pNext = NULL;
17682 memAlloc.allocationSize = 0;
17683 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017684
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017685 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017686 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017687 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017688 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017689 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017690 ASSERT_VK_SUCCESS(err);
17691
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017692 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017693 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017694 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017695 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017696 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017697 ASSERT_VK_SUCCESS(err);
17698
17699 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17700 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017701 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017702 ASSERT_VK_SUCCESS(err);
17703
Tony Barbour552f6c02016-12-21 14:34:07 -070017704 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017705 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017706 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17707 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017708 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017709 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017710 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017711 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017712 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017713 resolveRegion.srcOffset.x = 0;
17714 resolveRegion.srcOffset.y = 0;
17715 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017716 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017717 resolveRegion.dstSubresource.mipLevel = 0;
17718 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017719 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017720 resolveRegion.dstOffset.x = 0;
17721 resolveRegion.dstOffset.y = 0;
17722 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017723 resolveRegion.extent.width = 1;
17724 resolveRegion.extent.height = 1;
17725 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017726 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017727 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017728
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017729 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017730
Chia-I Wuf7458c52015-10-26 21:10:41 +080017731 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017732 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017733 vkFreeMemory(m_device->device(), srcMem, NULL);
17734 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017735}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017736
Karl Schultz6addd812016-02-02 17:17:23 -070017737TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017738 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070017739 // to using a DS format, then cause it to hit error due to COLOR_BIT not
17740 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017741 // The image format check comes 2nd in validation so we trigger it first,
17742 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070017743 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017744
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017745 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17746 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017747
Tony Barbour1fa09702017-03-16 12:09:08 -060017748 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070017749 auto depth_format = find_depth_stencil_format(m_device);
17750 if (!depth_format) {
17751 return;
17752 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017753
Chia-I Wu1b99bb22015-10-27 19:25:11 +080017754 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017755 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17756 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017757
17758 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017759 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17760 ds_pool_ci.pNext = NULL;
17761 ds_pool_ci.maxSets = 1;
17762 ds_pool_ci.poolSizeCount = 1;
17763 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017764
17765 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017766 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017767 ASSERT_VK_SUCCESS(err);
17768
17769 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017770 dsl_binding.binding = 0;
17771 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17772 dsl_binding.descriptorCount = 1;
17773 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
17774 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017775
17776 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017777 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17778 ds_layout_ci.pNext = NULL;
17779 ds_layout_ci.bindingCount = 1;
17780 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017781 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017782 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017783 ASSERT_VK_SUCCESS(err);
17784
17785 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017786 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080017787 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070017788 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017789 alloc_info.descriptorPool = ds_pool;
17790 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017791 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017792 ASSERT_VK_SUCCESS(err);
17793
Karl Schultz6addd812016-02-02 17:17:23 -070017794 VkImage image_bad;
17795 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017796 // One bad format and one good format for Color attachment
Tony Barbourf887b162017-03-09 10:06:46 -070017797 const VkFormat tex_format_bad = depth_format;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017798 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070017799 const int32_t tex_width = 32;
17800 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017801
17802 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017803 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17804 image_create_info.pNext = NULL;
17805 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17806 image_create_info.format = tex_format_bad;
17807 image_create_info.extent.width = tex_width;
17808 image_create_info.extent.height = tex_height;
17809 image_create_info.extent.depth = 1;
17810 image_create_info.mipLevels = 1;
17811 image_create_info.arrayLayers = 1;
17812 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17813 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017814 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017815 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017816
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017817 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017818 ASSERT_VK_SUCCESS(err);
17819 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017820 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
17821 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017822 ASSERT_VK_SUCCESS(err);
17823
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017824 // ---Bind image memory---
17825 VkMemoryRequirements img_mem_reqs;
17826 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
17827 VkMemoryAllocateInfo image_alloc_info = {};
17828 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17829 image_alloc_info.pNext = NULL;
17830 image_alloc_info.memoryTypeIndex = 0;
17831 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017832 bool pass =
17833 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 -070017834 ASSERT_TRUE(pass);
17835 VkDeviceMemory mem;
17836 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
17837 ASSERT_VK_SUCCESS(err);
17838 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
17839 ASSERT_VK_SUCCESS(err);
17840 // -----------------------
17841
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017842 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130017843 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070017844 image_view_create_info.image = image_bad;
17845 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
17846 image_view_create_info.format = tex_format_bad;
17847 image_view_create_info.subresourceRange.baseArrayLayer = 0;
17848 image_view_create_info.subresourceRange.baseMipLevel = 0;
17849 image_view_create_info.subresourceRange.layerCount = 1;
17850 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017851 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017852
17853 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017854 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017855
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017856 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017857
Chia-I Wuf7458c52015-10-26 21:10:41 +080017858 vkDestroyImage(m_device->device(), image_bad, NULL);
17859 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017860 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17861 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017862
17863 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017864}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017865
17866TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017867 TEST_DESCRIPTION(
17868 "Call ClearColorImage w/ a depth|stencil image and "
17869 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017870
Tony Barbour1fa09702017-03-16 12:09:08 -060017871 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070017872 auto depth_format = find_depth_stencil_format(m_device);
17873 if (!depth_format) {
17874 return;
17875 }
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017876 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
17877
Tony Barbour552f6c02016-12-21 14:34:07 -070017878 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017879
17880 // Color image
17881 VkClearColorValue clear_color;
17882 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
17883 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
17884 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
17885 const int32_t img_width = 32;
17886 const int32_t img_height = 32;
17887 VkImageCreateInfo image_create_info = {};
17888 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17889 image_create_info.pNext = NULL;
17890 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17891 image_create_info.format = color_format;
17892 image_create_info.extent.width = img_width;
17893 image_create_info.extent.height = img_height;
17894 image_create_info.extent.depth = 1;
17895 image_create_info.mipLevels = 1;
17896 image_create_info.arrayLayers = 1;
17897 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17898 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17899 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
17900
17901 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017902 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017903
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017904 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017905
17906 // Depth/Stencil image
17907 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017908 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017909 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
17910 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070017911 ds_image_create_info.format = depth_format;
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017912 ds_image_create_info.extent.width = 64;
17913 ds_image_create_info.extent.height = 64;
17914 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070017915 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 -060017916
17917 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017918 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017919
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017920 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 -060017921
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017922 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017923
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017924 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017925 &color_range);
17926
17927 m_errorMonitor->VerifyFound();
17928
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17930 "vkCmdClearColorImage called with "
17931 "image created without "
17932 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060017933
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070017934 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060017935 &color_range);
17936
17937 m_errorMonitor->VerifyFound();
17938
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017939 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017940 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17941 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017942
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017943 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
17944 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017945
17946 m_errorMonitor->VerifyFound();
17947}
Tobin Ehliscde08892015-09-22 10:11:37 -060017948
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017949// WSI Enabled Tests
17950//
Chris Forbes09368e42016-10-13 11:59:22 +130017951#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017952TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
17953
17954#if defined(VK_USE_PLATFORM_XCB_KHR)
17955 VkSurfaceKHR surface = VK_NULL_HANDLE;
17956
17957 VkResult err;
17958 bool pass;
17959 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
17960 VkSwapchainCreateInfoKHR swapchain_create_info = {};
17961 // uint32_t swapchain_image_count = 0;
17962 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
17963 // uint32_t image_index = 0;
17964 // VkPresentInfoKHR present_info = {};
17965
Tony Barbour1fa09702017-03-16 12:09:08 -060017966 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017967
17968 // Use the create function from one of the VK_KHR_*_surface extension in
17969 // order to create a surface, testing all known errors in the process,
17970 // before successfully creating a surface:
17971 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
17972 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
17973 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
17974 pass = (err != VK_SUCCESS);
17975 ASSERT_TRUE(pass);
17976 m_errorMonitor->VerifyFound();
17977
17978 // Next, try to create a surface with the wrong
17979 // VkXcbSurfaceCreateInfoKHR::sType:
17980 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
17981 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
17982 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
17983 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
17984 pass = (err != VK_SUCCESS);
17985 ASSERT_TRUE(pass);
17986 m_errorMonitor->VerifyFound();
17987
17988 // Create a native window, and then correctly create a surface:
17989 xcb_connection_t *connection;
17990 xcb_screen_t *screen;
17991 xcb_window_t xcb_window;
17992 xcb_intern_atom_reply_t *atom_wm_delete_window;
17993
17994 const xcb_setup_t *setup;
17995 xcb_screen_iterator_t iter;
17996 int scr;
17997 uint32_t value_mask, value_list[32];
17998 int width = 1;
17999 int height = 1;
18000
18001 connection = xcb_connect(NULL, &scr);
18002 ASSERT_TRUE(connection != NULL);
18003 setup = xcb_get_setup(connection);
18004 iter = xcb_setup_roots_iterator(setup);
18005 while (scr-- > 0)
18006 xcb_screen_next(&iter);
18007 screen = iter.data;
18008
18009 xcb_window = xcb_generate_id(connection);
18010
18011 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
18012 value_list[0] = screen->black_pixel;
18013 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
18014
18015 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
18016 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
18017
18018 /* Magic code that will send notification when window is destroyed */
18019 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
18020 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
18021
18022 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
18023 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
18024 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
18025 free(reply);
18026
18027 xcb_map_window(connection, xcb_window);
18028
18029 // Force the x/y coordinates to 100,100 results are identical in consecutive
18030 // runs
18031 const uint32_t coords[] = { 100, 100 };
18032 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
18033
18034 // Finally, try to correctly create a surface:
18035 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
18036 xcb_create_info.pNext = NULL;
18037 xcb_create_info.flags = 0;
18038 xcb_create_info.connection = connection;
18039 xcb_create_info.window = xcb_window;
18040 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
18041 pass = (err == VK_SUCCESS);
18042 ASSERT_TRUE(pass);
18043
18044 // Check if surface supports presentation:
18045
18046 // 1st, do so without having queried the queue families:
18047 VkBool32 supported = false;
18048 // TODO: Get the following error to come out:
18049 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18050 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
18051 "function");
18052 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18053 pass = (err != VK_SUCCESS);
18054 // ASSERT_TRUE(pass);
18055 // m_errorMonitor->VerifyFound();
18056
18057 // Next, query a queue family index that's too large:
18058 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18059 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
18060 pass = (err != VK_SUCCESS);
18061 ASSERT_TRUE(pass);
18062 m_errorMonitor->VerifyFound();
18063
18064 // Finally, do so correctly:
18065 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18066 // SUPPORTED
18067 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
18068 pass = (err == VK_SUCCESS);
18069 ASSERT_TRUE(pass);
18070
18071 // Before proceeding, try to create a swapchain without having called
18072 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
18073 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18074 swapchain_create_info.pNext = NULL;
18075 swapchain_create_info.flags = 0;
18076 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
18077 swapchain_create_info.surface = surface;
18078 swapchain_create_info.imageArrayLayers = 1;
18079 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
18080 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
18081 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18082 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
18083 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18084 pass = (err != VK_SUCCESS);
18085 ASSERT_TRUE(pass);
18086 m_errorMonitor->VerifyFound();
18087
18088 // Get the surface capabilities:
18089 VkSurfaceCapabilitiesKHR surface_capabilities;
18090
18091 // Do so correctly (only error logged by this entrypoint is if the
18092 // extension isn't enabled):
18093 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
18094 pass = (err == VK_SUCCESS);
18095 ASSERT_TRUE(pass);
18096
18097 // Get the surface formats:
18098 uint32_t surface_format_count;
18099
18100 // First, try without a pointer to surface_format_count:
18101 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
18102 "specified as NULL");
18103 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
18104 pass = (err == VK_SUCCESS);
18105 ASSERT_TRUE(pass);
18106 m_errorMonitor->VerifyFound();
18107
18108 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
18109 // correctly done a 1st try (to get the count):
18110 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18111 surface_format_count = 0;
18112 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
18113 pass = (err == VK_SUCCESS);
18114 ASSERT_TRUE(pass);
18115 m_errorMonitor->VerifyFound();
18116
18117 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18118 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18119 pass = (err == VK_SUCCESS);
18120 ASSERT_TRUE(pass);
18121
18122 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18123 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
18124
18125 // Next, do a 2nd try with surface_format_count being set too high:
18126 surface_format_count += 5;
18127 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18128 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18129 pass = (err == VK_SUCCESS);
18130 ASSERT_TRUE(pass);
18131 m_errorMonitor->VerifyFound();
18132
18133 // Finally, do a correct 1st and 2nd try:
18134 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
18135 pass = (err == VK_SUCCESS);
18136 ASSERT_TRUE(pass);
18137 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
18138 pass = (err == VK_SUCCESS);
18139 ASSERT_TRUE(pass);
18140
18141 // Get the surface present modes:
18142 uint32_t surface_present_mode_count;
18143
18144 // First, try without a pointer to surface_format_count:
18145 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
18146 "specified as NULL");
18147
18148 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
18149 pass = (err == VK_SUCCESS);
18150 ASSERT_TRUE(pass);
18151 m_errorMonitor->VerifyFound();
18152
18153 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
18154 // correctly done a 1st try (to get the count):
18155 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
18156 surface_present_mode_count = 0;
18157 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
18158 (VkPresentModeKHR *)&surface_present_mode_count);
18159 pass = (err == VK_SUCCESS);
18160 ASSERT_TRUE(pass);
18161 m_errorMonitor->VerifyFound();
18162
18163 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
18164 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18165 pass = (err == VK_SUCCESS);
18166 ASSERT_TRUE(pass);
18167
18168 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
18169 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
18170
18171 // Next, do a 2nd try with surface_format_count being set too high:
18172 surface_present_mode_count += 5;
18173 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
18174 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18175 pass = (err == VK_SUCCESS);
18176 ASSERT_TRUE(pass);
18177 m_errorMonitor->VerifyFound();
18178
18179 // Finally, do a correct 1st and 2nd try:
18180 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
18181 pass = (err == VK_SUCCESS);
18182 ASSERT_TRUE(pass);
18183 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
18184 pass = (err == VK_SUCCESS);
18185 ASSERT_TRUE(pass);
18186
18187 // Create a swapchain:
18188
18189 // First, try without a pointer to swapchain_create_info:
18190 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
18191 "specified as NULL");
18192
18193 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
18194 pass = (err != VK_SUCCESS);
18195 ASSERT_TRUE(pass);
18196 m_errorMonitor->VerifyFound();
18197
18198 // Next, call with a non-NULL swapchain_create_info, that has the wrong
18199 // sType:
18200 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
18201 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
18202
18203 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18204 pass = (err != VK_SUCCESS);
18205 ASSERT_TRUE(pass);
18206 m_errorMonitor->VerifyFound();
18207
18208 // Next, call with a NULL swapchain pointer:
18209 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
18210 swapchain_create_info.pNext = NULL;
18211 swapchain_create_info.flags = 0;
18212 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
18213 "specified as NULL");
18214
18215 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
18216 pass = (err != VK_SUCCESS);
18217 ASSERT_TRUE(pass);
18218 m_errorMonitor->VerifyFound();
18219
18220 // TODO: Enhance swapchain layer so that
18221 // swapchain_create_info.queueFamilyIndexCount is checked against something?
18222
18223 // Next, call with a queue family index that's too large:
18224 uint32_t queueFamilyIndex[2] = { 100000, 0 };
18225 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18226 swapchain_create_info.queueFamilyIndexCount = 2;
18227 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
18228 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
18229 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18230 pass = (err != VK_SUCCESS);
18231 ASSERT_TRUE(pass);
18232 m_errorMonitor->VerifyFound();
18233
18234 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
18235 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
18236 swapchain_create_info.queueFamilyIndexCount = 1;
18237 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18238 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
18239 "pCreateInfo->pQueueFamilyIndices).");
18240 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18241 pass = (err != VK_SUCCESS);
18242 ASSERT_TRUE(pass);
18243 m_errorMonitor->VerifyFound();
18244
18245 // Next, call with an invalid imageSharingMode:
18246 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
18247 swapchain_create_info.queueFamilyIndexCount = 1;
18248 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
18249 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
18250 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
18251 pass = (err != VK_SUCCESS);
18252 ASSERT_TRUE(pass);
18253 m_errorMonitor->VerifyFound();
18254 // Fix for the future:
18255 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
18256 // SUPPORTED
18257 swapchain_create_info.queueFamilyIndexCount = 0;
18258 queueFamilyIndex[0] = 0;
18259 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
18260
18261 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
18262 // Get the images from a swapchain:
18263 // Acquire an image from a swapchain:
18264 // Present an image to a swapchain:
18265 // Destroy the swapchain:
18266
18267 // TODOs:
18268 //
18269 // - Try destroying the device without first destroying the swapchain
18270 //
18271 // - Try destroying the device without first destroying the surface
18272 //
18273 // - Try destroying the surface without first destroying the swapchain
18274
18275 // Destroy the surface:
18276 vkDestroySurfaceKHR(instance(), surface, NULL);
18277
18278 // Tear down the window:
18279 xcb_destroy_window(connection, xcb_window);
18280 xcb_disconnect(connection);
18281
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018282#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018283 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018284#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018285}
Chris Forbes09368e42016-10-13 11:59:22 +130018286#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018287
18288//
18289// POSITIVE VALIDATION TESTS
18290//
18291// These tests do not expect to encounter ANY validation errors pass only if this is true
18292
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018293TEST_F(VkPositiveLayerTest, SecondaryCommandBufferClearColorAttachments) {
18294 TEST_DESCRIPTION("Create a secondary command buffer and record a CmdClearAttachments call into it");
Tony Barbour1fa09702017-03-16 12:09:08 -060018295 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018296 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18297
18298 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18299 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018300 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070018301 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18302 command_buffer_allocate_info.commandBufferCount = 1;
18303
18304 VkCommandBuffer secondary_command_buffer;
18305 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18306 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18307 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18308 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18309 command_buffer_inheritance_info.renderPass = m_renderPass;
18310 command_buffer_inheritance_info.framebuffer = m_framebuffer;
18311
18312 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18313 command_buffer_begin_info.flags =
18314 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
18315 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18316
18317 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18318 VkClearAttachment color_attachment;
18319 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18320 color_attachment.clearValue.color.float32[0] = 0;
18321 color_attachment.clearValue.color.float32[1] = 0;
18322 color_attachment.clearValue.color.float32[2] = 0;
18323 color_attachment.clearValue.color.float32[3] = 0;
18324 color_attachment.colorAttachment = 0;
18325 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
18326 vkCmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
18327}
18328
Tobin Ehlise0006882016-11-03 10:14:28 -060018329TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018330 TEST_DESCRIPTION(
18331 "Perform an image layout transition in a secondary command buffer followed "
18332 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060018333 VkResult err;
18334 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060018335 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070018336 auto depth_format = find_depth_stencil_format(m_device);
18337 if (!depth_format) {
18338 return;
18339 }
Tobin Ehlise0006882016-11-03 10:14:28 -060018340 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18341 // Allocate a secondary and primary cmd buffer
18342 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18343 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mike Schuchardt06304c22017-03-01 17:09:09 -070018344 command_buffer_allocate_info.commandPool = m_commandPool->handle();
Tobin Ehlise0006882016-11-03 10:14:28 -060018345 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18346 command_buffer_allocate_info.commandBufferCount = 1;
18347
18348 VkCommandBuffer secondary_command_buffer;
18349 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18350 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18351 VkCommandBuffer primary_command_buffer;
18352 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
18353 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18354 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18355 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18356 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18357 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
18358 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18359
18360 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18361 ASSERT_VK_SUCCESS(err);
18362 VkImageObj image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -070018363 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 -060018364 ASSERT_TRUE(image.initialized());
18365 VkImageMemoryBarrier img_barrier = {};
18366 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18367 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18368 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18369 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18370 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18371 img_barrier.image = image.handle();
18372 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18373 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18374 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18375 img_barrier.subresourceRange.baseArrayLayer = 0;
18376 img_barrier.subresourceRange.baseMipLevel = 0;
18377 img_barrier.subresourceRange.layerCount = 1;
18378 img_barrier.subresourceRange.levelCount = 1;
18379 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
18380 0, nullptr, 1, &img_barrier);
18381 err = vkEndCommandBuffer(secondary_command_buffer);
18382 ASSERT_VK_SUCCESS(err);
18383
18384 // Now update primary cmd buffer to execute secondary and transitions image
18385 command_buffer_begin_info.pInheritanceInfo = nullptr;
18386 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
18387 ASSERT_VK_SUCCESS(err);
18388 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
18389 VkImageMemoryBarrier img_barrier2 = {};
18390 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18391 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18392 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18393 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18394 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18395 img_barrier2.image = image.handle();
18396 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18397 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18398 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18399 img_barrier2.subresourceRange.baseArrayLayer = 0;
18400 img_barrier2.subresourceRange.baseMipLevel = 0;
18401 img_barrier2.subresourceRange.layerCount = 1;
18402 img_barrier2.subresourceRange.levelCount = 1;
18403 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
18404 nullptr, 1, &img_barrier2);
18405 err = vkEndCommandBuffer(primary_command_buffer);
18406 ASSERT_VK_SUCCESS(err);
18407 VkSubmitInfo submit_info = {};
18408 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18409 submit_info.commandBufferCount = 1;
18410 submit_info.pCommandBuffers = &primary_command_buffer;
18411 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18412 ASSERT_VK_SUCCESS(err);
18413 m_errorMonitor->VerifyNotFound();
18414 err = vkDeviceWaitIdle(m_device->device());
18415 ASSERT_VK_SUCCESS(err);
Mike Schuchardt06304c22017-03-01 17:09:09 -070018416 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &secondary_command_buffer);
18417 vkFreeCommandBuffers(m_device->device(), m_commandPool->handle(), 1, &primary_command_buffer);
Tobin Ehlise0006882016-11-03 10:14:28 -060018418}
18419
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018420// This is a positive test. No failures are expected.
18421TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018422 TEST_DESCRIPTION(
18423 "Ensure that the vkUpdateDescriptorSets validation code "
18424 "is ignoring VkWriteDescriptorSet members that are not "
18425 "related to the descriptor type specified by "
18426 "VkWriteDescriptorSet::descriptorType. Correct "
18427 "validation behavior will result in the test running to "
18428 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018429
18430 const uintptr_t invalid_ptr = 0xcdcdcdcd;
18431
Tony Barbour1fa09702017-03-16 12:09:08 -060018432 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018433
18434 // Image Case
18435 {
18436 m_errorMonitor->ExpectSuccess();
18437
18438 VkImage image;
18439 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
18440 const int32_t tex_width = 32;
18441 const int32_t tex_height = 32;
18442 VkImageCreateInfo image_create_info = {};
18443 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18444 image_create_info.pNext = NULL;
18445 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18446 image_create_info.format = tex_format;
18447 image_create_info.extent.width = tex_width;
18448 image_create_info.extent.height = tex_height;
18449 image_create_info.extent.depth = 1;
18450 image_create_info.mipLevels = 1;
18451 image_create_info.arrayLayers = 1;
18452 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18453 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18454 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18455 image_create_info.flags = 0;
18456 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
18457 ASSERT_VK_SUCCESS(err);
18458
18459 VkMemoryRequirements memory_reqs;
18460 VkDeviceMemory image_memory;
18461 bool pass;
18462 VkMemoryAllocateInfo memory_info = {};
18463 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18464 memory_info.pNext = NULL;
18465 memory_info.allocationSize = 0;
18466 memory_info.memoryTypeIndex = 0;
18467 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
18468 memory_info.allocationSize = memory_reqs.size;
18469 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18470 ASSERT_TRUE(pass);
18471 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
18472 ASSERT_VK_SUCCESS(err);
18473 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
18474 ASSERT_VK_SUCCESS(err);
18475
18476 VkImageViewCreateInfo image_view_create_info = {};
18477 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
18478 image_view_create_info.image = image;
18479 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18480 image_view_create_info.format = tex_format;
18481 image_view_create_info.subresourceRange.layerCount = 1;
18482 image_view_create_info.subresourceRange.baseMipLevel = 0;
18483 image_view_create_info.subresourceRange.levelCount = 1;
18484 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18485
18486 VkImageView view;
18487 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
18488 ASSERT_VK_SUCCESS(err);
18489
18490 VkDescriptorPoolSize ds_type_count = {};
18491 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18492 ds_type_count.descriptorCount = 1;
18493
18494 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18495 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18496 ds_pool_ci.pNext = NULL;
18497 ds_pool_ci.maxSets = 1;
18498 ds_pool_ci.poolSizeCount = 1;
18499 ds_pool_ci.pPoolSizes = &ds_type_count;
18500
18501 VkDescriptorPool ds_pool;
18502 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18503 ASSERT_VK_SUCCESS(err);
18504
18505 VkDescriptorSetLayoutBinding dsl_binding = {};
18506 dsl_binding.binding = 0;
18507 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18508 dsl_binding.descriptorCount = 1;
18509 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18510 dsl_binding.pImmutableSamplers = NULL;
18511
18512 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18513 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18514 ds_layout_ci.pNext = NULL;
18515 ds_layout_ci.bindingCount = 1;
18516 ds_layout_ci.pBindings = &dsl_binding;
18517 VkDescriptorSetLayout ds_layout;
18518 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18519 ASSERT_VK_SUCCESS(err);
18520
18521 VkDescriptorSet descriptor_set;
18522 VkDescriptorSetAllocateInfo alloc_info = {};
18523 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18524 alloc_info.descriptorSetCount = 1;
18525 alloc_info.descriptorPool = ds_pool;
18526 alloc_info.pSetLayouts = &ds_layout;
18527 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18528 ASSERT_VK_SUCCESS(err);
18529
18530 VkDescriptorImageInfo image_info = {};
18531 image_info.imageView = view;
18532 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
18533
18534 VkWriteDescriptorSet descriptor_write;
18535 memset(&descriptor_write, 0, sizeof(descriptor_write));
18536 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18537 descriptor_write.dstSet = descriptor_set;
18538 descriptor_write.dstBinding = 0;
18539 descriptor_write.descriptorCount = 1;
18540 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18541 descriptor_write.pImageInfo = &image_info;
18542
18543 // Set pBufferInfo and pTexelBufferView to invalid values, which should
18544 // be
18545 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
18546 // This will most likely produce a crash if the parameter_validation
18547 // layer
18548 // does not correctly ignore pBufferInfo.
18549 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18550 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18551
18552 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18553
18554 m_errorMonitor->VerifyNotFound();
18555
18556 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18557 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18558 vkDestroyImageView(m_device->device(), view, NULL);
18559 vkDestroyImage(m_device->device(), image, NULL);
18560 vkFreeMemory(m_device->device(), image_memory, NULL);
18561 }
18562
18563 // Buffer Case
18564 {
18565 m_errorMonitor->ExpectSuccess();
18566
18567 VkBuffer buffer;
18568 uint32_t queue_family_index = 0;
18569 VkBufferCreateInfo buffer_create_info = {};
18570 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18571 buffer_create_info.size = 1024;
18572 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18573 buffer_create_info.queueFamilyIndexCount = 1;
18574 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18575
18576 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18577 ASSERT_VK_SUCCESS(err);
18578
18579 VkMemoryRequirements memory_reqs;
18580 VkDeviceMemory buffer_memory;
18581 bool pass;
18582 VkMemoryAllocateInfo memory_info = {};
18583 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18584 memory_info.pNext = NULL;
18585 memory_info.allocationSize = 0;
18586 memory_info.memoryTypeIndex = 0;
18587
18588 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18589 memory_info.allocationSize = memory_reqs.size;
18590 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18591 ASSERT_TRUE(pass);
18592
18593 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18594 ASSERT_VK_SUCCESS(err);
18595 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18596 ASSERT_VK_SUCCESS(err);
18597
18598 VkDescriptorPoolSize ds_type_count = {};
18599 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18600 ds_type_count.descriptorCount = 1;
18601
18602 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18603 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18604 ds_pool_ci.pNext = NULL;
18605 ds_pool_ci.maxSets = 1;
18606 ds_pool_ci.poolSizeCount = 1;
18607 ds_pool_ci.pPoolSizes = &ds_type_count;
18608
18609 VkDescriptorPool ds_pool;
18610 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18611 ASSERT_VK_SUCCESS(err);
18612
18613 VkDescriptorSetLayoutBinding dsl_binding = {};
18614 dsl_binding.binding = 0;
18615 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18616 dsl_binding.descriptorCount = 1;
18617 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18618 dsl_binding.pImmutableSamplers = NULL;
18619
18620 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18621 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18622 ds_layout_ci.pNext = NULL;
18623 ds_layout_ci.bindingCount = 1;
18624 ds_layout_ci.pBindings = &dsl_binding;
18625 VkDescriptorSetLayout ds_layout;
18626 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18627 ASSERT_VK_SUCCESS(err);
18628
18629 VkDescriptorSet descriptor_set;
18630 VkDescriptorSetAllocateInfo alloc_info = {};
18631 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18632 alloc_info.descriptorSetCount = 1;
18633 alloc_info.descriptorPool = ds_pool;
18634 alloc_info.pSetLayouts = &ds_layout;
18635 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18636 ASSERT_VK_SUCCESS(err);
18637
18638 VkDescriptorBufferInfo buffer_info = {};
18639 buffer_info.buffer = buffer;
18640 buffer_info.offset = 0;
18641 buffer_info.range = 1024;
18642
18643 VkWriteDescriptorSet descriptor_write;
18644 memset(&descriptor_write, 0, sizeof(descriptor_write));
18645 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18646 descriptor_write.dstSet = descriptor_set;
18647 descriptor_write.dstBinding = 0;
18648 descriptor_write.descriptorCount = 1;
18649 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18650 descriptor_write.pBufferInfo = &buffer_info;
18651
18652 // Set pImageInfo and pTexelBufferView to invalid values, which should
18653 // be
18654 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
18655 // This will most likely produce a crash if the parameter_validation
18656 // layer
18657 // does not correctly ignore pImageInfo.
18658 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18659 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18660
18661 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18662
18663 m_errorMonitor->VerifyNotFound();
18664
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018665 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18666 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18667 vkDestroyBuffer(m_device->device(), buffer, NULL);
18668 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18669 }
18670
18671 // Texel Buffer Case
18672 {
18673 m_errorMonitor->ExpectSuccess();
18674
18675 VkBuffer buffer;
18676 uint32_t queue_family_index = 0;
18677 VkBufferCreateInfo buffer_create_info = {};
18678 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18679 buffer_create_info.size = 1024;
18680 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
18681 buffer_create_info.queueFamilyIndexCount = 1;
18682 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18683
18684 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18685 ASSERT_VK_SUCCESS(err);
18686
18687 VkMemoryRequirements memory_reqs;
18688 VkDeviceMemory buffer_memory;
18689 bool pass;
18690 VkMemoryAllocateInfo memory_info = {};
18691 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18692 memory_info.pNext = NULL;
18693 memory_info.allocationSize = 0;
18694 memory_info.memoryTypeIndex = 0;
18695
18696 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18697 memory_info.allocationSize = memory_reqs.size;
18698 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18699 ASSERT_TRUE(pass);
18700
18701 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18702 ASSERT_VK_SUCCESS(err);
18703 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18704 ASSERT_VK_SUCCESS(err);
18705
18706 VkBufferViewCreateInfo buff_view_ci = {};
18707 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
18708 buff_view_ci.buffer = buffer;
18709 buff_view_ci.format = VK_FORMAT_R8_UNORM;
18710 buff_view_ci.range = VK_WHOLE_SIZE;
18711 VkBufferView buffer_view;
18712 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
18713
18714 VkDescriptorPoolSize ds_type_count = {};
18715 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18716 ds_type_count.descriptorCount = 1;
18717
18718 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18719 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18720 ds_pool_ci.pNext = NULL;
18721 ds_pool_ci.maxSets = 1;
18722 ds_pool_ci.poolSizeCount = 1;
18723 ds_pool_ci.pPoolSizes = &ds_type_count;
18724
18725 VkDescriptorPool ds_pool;
18726 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18727 ASSERT_VK_SUCCESS(err);
18728
18729 VkDescriptorSetLayoutBinding dsl_binding = {};
18730 dsl_binding.binding = 0;
18731 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18732 dsl_binding.descriptorCount = 1;
18733 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18734 dsl_binding.pImmutableSamplers = NULL;
18735
18736 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18737 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18738 ds_layout_ci.pNext = NULL;
18739 ds_layout_ci.bindingCount = 1;
18740 ds_layout_ci.pBindings = &dsl_binding;
18741 VkDescriptorSetLayout ds_layout;
18742 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18743 ASSERT_VK_SUCCESS(err);
18744
18745 VkDescriptorSet descriptor_set;
18746 VkDescriptorSetAllocateInfo alloc_info = {};
18747 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18748 alloc_info.descriptorSetCount = 1;
18749 alloc_info.descriptorPool = ds_pool;
18750 alloc_info.pSetLayouts = &ds_layout;
18751 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18752 ASSERT_VK_SUCCESS(err);
18753
18754 VkWriteDescriptorSet descriptor_write;
18755 memset(&descriptor_write, 0, sizeof(descriptor_write));
18756 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18757 descriptor_write.dstSet = descriptor_set;
18758 descriptor_write.dstBinding = 0;
18759 descriptor_write.descriptorCount = 1;
18760 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18761 descriptor_write.pTexelBufferView = &buffer_view;
18762
18763 // Set pImageInfo and pBufferInfo to invalid values, which should be
18764 // ignored for descriptorType ==
18765 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
18766 // This will most likely produce a crash if the parameter_validation
18767 // layer
18768 // does not correctly ignore pImageInfo and pBufferInfo.
18769 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18770 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18771
18772 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18773
18774 m_errorMonitor->VerifyNotFound();
18775
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018776 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18777 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18778 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
18779 vkDestroyBuffer(m_device->device(), buffer, NULL);
18780 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18781 }
18782}
18783
Tobin Ehlisf7428442016-10-25 07:58:24 -060018784TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
18785 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
18786
Tony Barbour1fa09702017-03-16 12:09:08 -060018787 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlisf7428442016-10-25 07:58:24 -060018788 // Create layout where two binding #s are "1"
18789 static const uint32_t NUM_BINDINGS = 3;
18790 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
18791 dsl_binding[0].binding = 1;
18792 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18793 dsl_binding[0].descriptorCount = 1;
18794 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18795 dsl_binding[0].pImmutableSamplers = NULL;
18796 dsl_binding[1].binding = 0;
18797 dsl_binding[1].descriptorCount = 1;
18798 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18799 dsl_binding[1].descriptorCount = 1;
18800 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18801 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018802 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060018803 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18804 dsl_binding[2].descriptorCount = 1;
18805 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18806 dsl_binding[2].pImmutableSamplers = NULL;
18807
18808 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18809 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18810 ds_layout_ci.pNext = NULL;
18811 ds_layout_ci.bindingCount = NUM_BINDINGS;
18812 ds_layout_ci.pBindings = dsl_binding;
18813 VkDescriptorSetLayout ds_layout;
18814 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
18815 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18816 m_errorMonitor->VerifyFound();
18817}
18818
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060018819TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018820 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
18821
Tony Barbour1fa09702017-03-16 12:09:08 -060018822 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018823
Tony Barbour552f6c02016-12-21 14:34:07 -070018824 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018825
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060018826 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
18827
18828 {
18829 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
18830 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
18831 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18832 m_errorMonitor->VerifyFound();
18833 }
18834
18835 {
18836 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
18837 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
18838 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18839 m_errorMonitor->VerifyFound();
18840 }
18841
18842 {
18843 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
18844 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
18845 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18846 m_errorMonitor->VerifyFound();
18847 }
18848
18849 {
18850 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
18851 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
18852 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18853 m_errorMonitor->VerifyFound();
18854 }
18855
18856 {
18857 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
18858 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
18859 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18860 m_errorMonitor->VerifyFound();
18861 }
18862
18863 {
18864 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
18865 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
18866 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18867 m_errorMonitor->VerifyFound();
18868 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018869
18870 {
18871 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
18872 VkRect2D scissor = {{-1, 0}, {16, 16}};
18873 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18874 m_errorMonitor->VerifyFound();
18875 }
18876
18877 {
18878 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
18879 VkRect2D scissor = {{0, -2}, {16, 16}};
18880 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18881 m_errorMonitor->VerifyFound();
18882 }
18883
18884 {
18885 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
18886 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
18887 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18888 m_errorMonitor->VerifyFound();
18889 }
18890
18891 {
18892 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
18893 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
18894 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18895 m_errorMonitor->VerifyFound();
18896 }
18897
Tony Barbour552f6c02016-12-21 14:34:07 -070018898 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018899}
18900
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018901// This is a positive test. No failures are expected.
18902TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
18903 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
18904 VkResult err;
18905
Tony Barbour1fa09702017-03-16 12:09:08 -060018906 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018907 m_errorMonitor->ExpectSuccess();
18908 VkDescriptorPoolSize ds_type_count = {};
18909 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18910 ds_type_count.descriptorCount = 2;
18911
18912 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18913 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18914 ds_pool_ci.pNext = NULL;
18915 ds_pool_ci.maxSets = 1;
18916 ds_pool_ci.poolSizeCount = 1;
18917 ds_pool_ci.pPoolSizes = &ds_type_count;
18918
18919 VkDescriptorPool ds_pool;
18920 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18921 ASSERT_VK_SUCCESS(err);
18922
18923 // Create layout with two uniform buffer descriptors w/ empty binding between them
18924 static const uint32_t NUM_BINDINGS = 3;
18925 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
18926 dsl_binding[0].binding = 0;
18927 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18928 dsl_binding[0].descriptorCount = 1;
18929 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
18930 dsl_binding[0].pImmutableSamplers = NULL;
18931 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018932 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018933 dsl_binding[2].binding = 2;
18934 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18935 dsl_binding[2].descriptorCount = 1;
18936 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
18937 dsl_binding[2].pImmutableSamplers = NULL;
18938
18939 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18940 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18941 ds_layout_ci.pNext = NULL;
18942 ds_layout_ci.bindingCount = NUM_BINDINGS;
18943 ds_layout_ci.pBindings = dsl_binding;
18944 VkDescriptorSetLayout ds_layout;
18945 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18946 ASSERT_VK_SUCCESS(err);
18947
18948 VkDescriptorSet descriptor_set = {};
18949 VkDescriptorSetAllocateInfo alloc_info = {};
18950 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18951 alloc_info.descriptorSetCount = 1;
18952 alloc_info.descriptorPool = ds_pool;
18953 alloc_info.pSetLayouts = &ds_layout;
18954 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18955 ASSERT_VK_SUCCESS(err);
18956
18957 // Create a buffer to be used for update
18958 VkBufferCreateInfo buff_ci = {};
18959 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18960 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18961 buff_ci.size = 256;
18962 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
18963 VkBuffer buffer;
18964 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
18965 ASSERT_VK_SUCCESS(err);
18966 // Have to bind memory to buffer before descriptor update
18967 VkMemoryAllocateInfo mem_alloc = {};
18968 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18969 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018970 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018971 mem_alloc.memoryTypeIndex = 0;
18972
18973 VkMemoryRequirements mem_reqs;
18974 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
18975 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
18976 if (!pass) {
18977 vkDestroyBuffer(m_device->device(), buffer, NULL);
18978 return;
18979 }
18980
18981 VkDeviceMemory mem;
18982 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
18983 ASSERT_VK_SUCCESS(err);
18984 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
18985 ASSERT_VK_SUCCESS(err);
18986
18987 // Only update the descriptor at binding 2
18988 VkDescriptorBufferInfo buff_info = {};
18989 buff_info.buffer = buffer;
18990 buff_info.offset = 0;
18991 buff_info.range = VK_WHOLE_SIZE;
18992 VkWriteDescriptorSet descriptor_write = {};
18993 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18994 descriptor_write.dstBinding = 2;
18995 descriptor_write.descriptorCount = 1;
18996 descriptor_write.pTexelBufferView = nullptr;
18997 descriptor_write.pBufferInfo = &buff_info;
18998 descriptor_write.pImageInfo = nullptr;
18999 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
19000 descriptor_write.dstSet = descriptor_set;
19001
19002 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19003
19004 m_errorMonitor->VerifyNotFound();
19005 // Cleanup
19006 vkFreeMemory(m_device->device(), mem, NULL);
19007 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19008 vkDestroyBuffer(m_device->device(), buffer, NULL);
19009 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19010}
19011
19012// This is a positive test. No failures are expected.
19013TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
19014 VkResult err;
19015 bool pass;
19016
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019017 TEST_DESCRIPTION(
19018 "Create a buffer, allocate memory, bind memory, destroy "
19019 "the buffer, create an image, and bind the same memory to "
19020 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019021
19022 m_errorMonitor->ExpectSuccess();
19023
Tony Barbour1fa09702017-03-16 12:09:08 -060019024 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019025
19026 VkBuffer buffer;
19027 VkImage image;
19028 VkDeviceMemory mem;
19029 VkMemoryRequirements mem_reqs;
19030
19031 VkBufferCreateInfo buf_info = {};
19032 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19033 buf_info.pNext = NULL;
19034 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19035 buf_info.size = 256;
19036 buf_info.queueFamilyIndexCount = 0;
19037 buf_info.pQueueFamilyIndices = NULL;
19038 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19039 buf_info.flags = 0;
19040 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
19041 ASSERT_VK_SUCCESS(err);
19042
19043 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
19044
19045 VkMemoryAllocateInfo alloc_info = {};
19046 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19047 alloc_info.pNext = NULL;
19048 alloc_info.memoryTypeIndex = 0;
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019049
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019050 // Ensure memory is big enough for both bindings
19051 alloc_info.allocationSize = 0x10000;
19052
19053 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19054 if (!pass) {
19055 vkDestroyBuffer(m_device->device(), buffer, NULL);
19056 return;
19057 }
19058
19059 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19060 ASSERT_VK_SUCCESS(err);
19061
19062 uint8_t *pData;
19063 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
19064 ASSERT_VK_SUCCESS(err);
19065
19066 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
19067
19068 vkUnmapMemory(m_device->device(), mem);
19069
19070 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
19071 ASSERT_VK_SUCCESS(err);
19072
19073 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
19074 // memory. In fact, it was never used by the GPU.
19075 // Just be be sure, wait for idle.
19076 vkDestroyBuffer(m_device->device(), buffer, NULL);
19077 vkDeviceWaitIdle(m_device->device());
19078
Tobin Ehlis6a005702016-12-28 15:25:56 -070019079 // Use optimal as some platforms report linear support but then fail image creation
19080 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
19081 VkImageFormatProperties image_format_properties;
19082 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
19083 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
19084 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070019085 printf(" Image format not supported; skipped.\n");
Tobin Ehlis6a005702016-12-28 15:25:56 -070019086 vkFreeMemory(m_device->device(), mem, NULL);
19087 return;
19088 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019089 VkImageCreateInfo image_create_info = {};
19090 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19091 image_create_info.pNext = NULL;
19092 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19093 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
19094 image_create_info.extent.width = 64;
19095 image_create_info.extent.height = 64;
19096 image_create_info.extent.depth = 1;
19097 image_create_info.mipLevels = 1;
19098 image_create_info.arrayLayers = 1;
19099 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070019100 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019101 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
19102 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
19103 image_create_info.queueFamilyIndexCount = 0;
19104 image_create_info.pQueueFamilyIndices = NULL;
19105 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
19106 image_create_info.flags = 0;
19107
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019108 /* Create a mappable image. It will be the texture if linear images are ok
Dave Houlton9dae7ec2017-03-01 16:23:25 -070019109 * to be textures or it will be the staging image if they are not.
19110 */
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019111 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19112 ASSERT_VK_SUCCESS(err);
19113
19114 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
19115
Tobin Ehlis6a005702016-12-28 15:25:56 -070019116 VkMemoryAllocateInfo mem_alloc = {};
19117 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19118 mem_alloc.pNext = NULL;
19119 mem_alloc.allocationSize = 0;
19120 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019121 mem_alloc.allocationSize = mem_reqs.size;
19122
19123 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
19124 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070019125 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019126 vkDestroyImage(m_device->device(), image, NULL);
19127 return;
19128 }
19129
19130 // VALIDATION FAILURE:
19131 err = vkBindImageMemory(m_device->device(), image, mem, 0);
19132 ASSERT_VK_SUCCESS(err);
19133
19134 m_errorMonitor->VerifyNotFound();
19135
19136 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019137 vkDestroyImage(m_device->device(), image, NULL);
19138}
19139
Tony Barbourab713912017-02-02 14:17:35 -070019140// This is a positive test. No failures are expected.
19141TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
19142 VkResult err;
19143
19144 TEST_DESCRIPTION(
19145 "Call all applicable destroy and free routines with NULL"
19146 "handles, expecting no validation errors");
19147
19148 m_errorMonitor->ExpectSuccess();
19149
Tony Barbour1fa09702017-03-16 12:09:08 -060019150 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourab713912017-02-02 14:17:35 -070019151 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19152 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
19153 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
19154 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
19155 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19156 vkDestroyDevice(VK_NULL_HANDLE, NULL);
19157 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
19158 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
19159 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
19160 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
19161 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
19162 vkDestroyInstance(VK_NULL_HANDLE, NULL);
19163 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
19164 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
19165 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
19166 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
19167 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
19168 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
19169 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
19170 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
19171
19172 VkCommandPool command_pool;
19173 VkCommandPoolCreateInfo pool_create_info{};
19174 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19175 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19176 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19177 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19178 VkCommandBuffer command_buffers[3] = {};
19179 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19180 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19181 command_buffer_allocate_info.commandPool = command_pool;
19182 command_buffer_allocate_info.commandBufferCount = 1;
19183 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19184 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
19185 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
19186 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19187
19188 VkDescriptorPoolSize ds_type_count = {};
19189 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19190 ds_type_count.descriptorCount = 1;
19191
19192 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19193 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19194 ds_pool_ci.pNext = NULL;
19195 ds_pool_ci.maxSets = 1;
19196 ds_pool_ci.poolSizeCount = 1;
19197 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
19198 ds_pool_ci.pPoolSizes = &ds_type_count;
19199
19200 VkDescriptorPool ds_pool;
19201 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19202 ASSERT_VK_SUCCESS(err);
19203
19204 VkDescriptorSetLayoutBinding dsl_binding = {};
19205 dsl_binding.binding = 2;
19206 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19207 dsl_binding.descriptorCount = 1;
19208 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19209 dsl_binding.pImmutableSamplers = NULL;
19210 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19211 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19212 ds_layout_ci.pNext = NULL;
19213 ds_layout_ci.bindingCount = 1;
19214 ds_layout_ci.pBindings = &dsl_binding;
19215 VkDescriptorSetLayout ds_layout;
19216 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19217 ASSERT_VK_SUCCESS(err);
19218
19219 VkDescriptorSet descriptor_sets[3] = {};
19220 VkDescriptorSetAllocateInfo alloc_info = {};
19221 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19222 alloc_info.descriptorSetCount = 1;
19223 alloc_info.descriptorPool = ds_pool;
19224 alloc_info.pSetLayouts = &ds_layout;
19225 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
19226 ASSERT_VK_SUCCESS(err);
19227 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
19228 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19229 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19230
19231 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
19232
19233 m_errorMonitor->VerifyNotFound();
19234}
19235
Tony Barbour626994c2017-02-08 15:29:37 -070019236TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070019237 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070019238
19239 m_errorMonitor->ExpectSuccess();
19240
Tony Barbour1fa09702017-03-16 12:09:08 -060019241 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbour626994c2017-02-08 15:29:37 -070019242 VkCommandBuffer cmd_bufs[4];
19243 VkCommandBufferAllocateInfo alloc_info;
19244 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19245 alloc_info.pNext = NULL;
19246 alloc_info.commandBufferCount = 4;
Mike Schuchardt06304c22017-03-01 17:09:09 -070019247 alloc_info.commandPool = m_commandPool->handle();
Tony Barbour626994c2017-02-08 15:29:37 -070019248 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19249 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
19250 VkImageObj image(m_device);
Mike Weiblen62d08a32017-03-07 22:18:27 -070019251 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM,
19252 (VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT),
19253 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour626994c2017-02-08 15:29:37 -070019254 ASSERT_TRUE(image.initialized());
19255 VkCommandBufferBeginInfo cb_binfo;
19256 cb_binfo.pNext = NULL;
19257 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19258 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
19259 cb_binfo.flags = 0;
19260 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
19261 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
19262 VkImageMemoryBarrier img_barrier = {};
19263 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19264 img_barrier.pNext = NULL;
19265 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19266 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
19267 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19268 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
19269 img_barrier.image = image.handle();
19270 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19271 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
19272 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19273 img_barrier.subresourceRange.baseArrayLayer = 0;
19274 img_barrier.subresourceRange.baseMipLevel = 0;
19275 img_barrier.subresourceRange.layerCount = 1;
19276 img_barrier.subresourceRange.levelCount = 1;
19277 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19278 &img_barrier);
19279 vkEndCommandBuffer(cmd_bufs[0]);
19280 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
19281 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
19282 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19283 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19284 &img_barrier);
19285 vkEndCommandBuffer(cmd_bufs[1]);
19286 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
19287 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
19288 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19289 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19290 &img_barrier);
19291 vkEndCommandBuffer(cmd_bufs[2]);
19292 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
19293 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
19294 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
19295 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
19296 &img_barrier);
19297 vkEndCommandBuffer(cmd_bufs[3]);
19298
19299 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
19300 VkSemaphore semaphore1, semaphore2;
19301 VkSemaphoreCreateInfo semaphore_create_info{};
19302 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19303 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
19304 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
19305 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
19306 VkSubmitInfo submit_info[3];
19307 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19308 submit_info[0].pNext = nullptr;
19309 submit_info[0].commandBufferCount = 1;
19310 submit_info[0].pCommandBuffers = &cmd_bufs[0];
19311 submit_info[0].signalSemaphoreCount = 1;
19312 submit_info[0].pSignalSemaphores = &semaphore1;
19313 submit_info[0].waitSemaphoreCount = 0;
19314 submit_info[0].pWaitDstStageMask = nullptr;
19315 submit_info[0].pWaitDstStageMask = flags;
19316 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19317 submit_info[1].pNext = nullptr;
19318 submit_info[1].commandBufferCount = 1;
19319 submit_info[1].pCommandBuffers = &cmd_bufs[1];
19320 submit_info[1].waitSemaphoreCount = 1;
19321 submit_info[1].pWaitSemaphores = &semaphore1;
19322 submit_info[1].signalSemaphoreCount = 1;
19323 submit_info[1].pSignalSemaphores = &semaphore2;
19324 submit_info[1].pWaitDstStageMask = flags;
19325 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19326 submit_info[2].pNext = nullptr;
19327 submit_info[2].commandBufferCount = 2;
19328 submit_info[2].pCommandBuffers = &cmd_bufs[2];
19329 submit_info[2].waitSemaphoreCount = 1;
19330 submit_info[2].pWaitSemaphores = &semaphore2;
19331 submit_info[2].signalSemaphoreCount = 0;
19332 submit_info[2].pSignalSemaphores = nullptr;
19333 submit_info[2].pWaitDstStageMask = flags;
19334 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
19335 vkQueueWaitIdle(m_device->m_queue);
19336
19337 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
19338 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
19339 m_errorMonitor->VerifyNotFound();
19340}
19341
Tobin Ehlis953e8392016-11-17 10:54:13 -070019342TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
19343 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
19344 // We previously had a bug where dynamic offset of inactive bindings was still being used
19345 VkResult err;
19346 m_errorMonitor->ExpectSuccess();
19347
Tony Barbour1fa09702017-03-16 12:09:08 -060019348 ASSERT_NO_FATAL_FAILURE(Init());
Tobin Ehlis953e8392016-11-17 10:54:13 -070019349 ASSERT_NO_FATAL_FAILURE(InitViewport());
19350 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19351
19352 VkDescriptorPoolSize ds_type_count = {};
19353 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19354 ds_type_count.descriptorCount = 3;
19355
19356 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19357 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19358 ds_pool_ci.pNext = NULL;
19359 ds_pool_ci.maxSets = 1;
19360 ds_pool_ci.poolSizeCount = 1;
19361 ds_pool_ci.pPoolSizes = &ds_type_count;
19362
19363 VkDescriptorPool ds_pool;
19364 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19365 ASSERT_VK_SUCCESS(err);
19366
19367 const uint32_t BINDING_COUNT = 3;
19368 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019369 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019370 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19371 dsl_binding[0].descriptorCount = 1;
19372 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19373 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019374 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019375 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19376 dsl_binding[1].descriptorCount = 1;
19377 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19378 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019379 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019380 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19381 dsl_binding[2].descriptorCount = 1;
19382 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19383 dsl_binding[2].pImmutableSamplers = NULL;
19384
19385 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19386 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19387 ds_layout_ci.pNext = NULL;
19388 ds_layout_ci.bindingCount = BINDING_COUNT;
19389 ds_layout_ci.pBindings = dsl_binding;
19390 VkDescriptorSetLayout ds_layout;
19391 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19392 ASSERT_VK_SUCCESS(err);
19393
19394 VkDescriptorSet descriptor_set;
19395 VkDescriptorSetAllocateInfo alloc_info = {};
19396 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19397 alloc_info.descriptorSetCount = 1;
19398 alloc_info.descriptorPool = ds_pool;
19399 alloc_info.pSetLayouts = &ds_layout;
19400 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19401 ASSERT_VK_SUCCESS(err);
19402
19403 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
19404 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
19405 pipeline_layout_ci.pNext = NULL;
19406 pipeline_layout_ci.setLayoutCount = 1;
19407 pipeline_layout_ci.pSetLayouts = &ds_layout;
19408
19409 VkPipelineLayout pipeline_layout;
19410 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
19411 ASSERT_VK_SUCCESS(err);
19412
19413 // Create two buffers to update the descriptors with
19414 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
19415 uint32_t qfi = 0;
19416 VkBufferCreateInfo buffCI = {};
19417 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19418 buffCI.size = 2048;
19419 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19420 buffCI.queueFamilyIndexCount = 1;
19421 buffCI.pQueueFamilyIndices = &qfi;
19422
19423 VkBuffer dyub1;
19424 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
19425 ASSERT_VK_SUCCESS(err);
19426 // buffer2
19427 buffCI.size = 1024;
19428 VkBuffer dyub2;
19429 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
19430 ASSERT_VK_SUCCESS(err);
19431 // Allocate memory and bind to buffers
19432 VkMemoryAllocateInfo mem_alloc[2] = {};
19433 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19434 mem_alloc[0].pNext = NULL;
19435 mem_alloc[0].memoryTypeIndex = 0;
19436 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19437 mem_alloc[1].pNext = NULL;
19438 mem_alloc[1].memoryTypeIndex = 0;
19439
19440 VkMemoryRequirements mem_reqs1;
19441 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
19442 VkMemoryRequirements mem_reqs2;
19443 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
19444 mem_alloc[0].allocationSize = mem_reqs1.size;
19445 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
19446 mem_alloc[1].allocationSize = mem_reqs2.size;
19447 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
19448 if (!pass) {
19449 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19450 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19451 return;
19452 }
19453
19454 VkDeviceMemory mem1;
19455 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
19456 ASSERT_VK_SUCCESS(err);
19457 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
19458 ASSERT_VK_SUCCESS(err);
19459 VkDeviceMemory mem2;
19460 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
19461 ASSERT_VK_SUCCESS(err);
19462 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
19463 ASSERT_VK_SUCCESS(err);
19464 // Update descriptors
19465 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
19466 buff_info[0].buffer = dyub1;
19467 buff_info[0].offset = 0;
19468 buff_info[0].range = 256;
19469 buff_info[1].buffer = dyub1;
19470 buff_info[1].offset = 256;
19471 buff_info[1].range = 512;
19472 buff_info[2].buffer = dyub2;
19473 buff_info[2].offset = 0;
19474 buff_info[2].range = 512;
19475
19476 VkWriteDescriptorSet descriptor_write;
19477 memset(&descriptor_write, 0, sizeof(descriptor_write));
19478 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19479 descriptor_write.dstSet = descriptor_set;
19480 descriptor_write.dstBinding = 0;
19481 descriptor_write.descriptorCount = BINDING_COUNT;
19482 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19483 descriptor_write.pBufferInfo = buff_info;
19484
19485 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19486
Tony Barbour552f6c02016-12-21 14:34:07 -070019487 m_commandBuffer->BeginCommandBuffer();
19488 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070019489
19490 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019491 char const *vsSource =
19492 "#version 450\n"
19493 "\n"
19494 "out gl_PerVertex { \n"
19495 " vec4 gl_Position;\n"
19496 "};\n"
19497 "void main(){\n"
19498 " gl_Position = vec4(1);\n"
19499 "}\n";
19500 char const *fsSource =
19501 "#version 450\n"
19502 "\n"
19503 "layout(location=0) out vec4 x;\n"
19504 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
19505 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
19506 "void main(){\n"
19507 " x = vec4(bar1.y) + vec4(bar2.y);\n"
19508 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070019509 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19510 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19511 VkPipelineObj pipe(m_device);
19512 pipe.SetViewport(m_viewports);
19513 pipe.SetScissor(m_scissors);
19514 pipe.AddShader(&vs);
19515 pipe.AddShader(&fs);
19516 pipe.AddColorAttachment();
19517 pipe.CreateVKPipeline(pipeline_layout, renderPass());
19518
19519 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
19520 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
19521 // we used to have a bug in this case.
19522 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
19523 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
19524 &descriptor_set, BINDING_COUNT, dyn_off);
19525 Draw(1, 0, 0, 0);
19526 m_errorMonitor->VerifyNotFound();
19527
19528 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19529 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19530 vkFreeMemory(m_device->device(), mem1, NULL);
19531 vkFreeMemory(m_device->device(), mem2, NULL);
19532
19533 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
19534 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19535 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19536}
19537
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019538TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019539 TEST_DESCRIPTION(
19540 "Ensure that validations handling of non-coherent memory "
19541 "mapping while using VK_WHOLE_SIZE does not cause access "
19542 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019543 VkResult err;
19544 uint8_t *pData;
Tony Barbour1fa09702017-03-16 12:09:08 -060019545 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019546
19547 VkDeviceMemory mem;
19548 VkMemoryRequirements mem_reqs;
19549 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019550 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019551 VkMemoryAllocateInfo alloc_info = {};
19552 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19553 alloc_info.pNext = NULL;
19554 alloc_info.memoryTypeIndex = 0;
19555
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019556 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019557 alloc_info.allocationSize = allocation_size;
19558
19559 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
19560 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 -070019561 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019562 if (!pass) {
19563 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019564 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
19565 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019566 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019567 pass = m_device->phy().set_memory_type(
19568 mem_reqs.memoryTypeBits, &alloc_info,
19569 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
19570 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019571 if (!pass) {
19572 return;
19573 }
19574 }
19575 }
19576
19577 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19578 ASSERT_VK_SUCCESS(err);
19579
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019580 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019581 m_errorMonitor->ExpectSuccess();
19582 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19583 ASSERT_VK_SUCCESS(err);
19584 VkMappedMemoryRange mmr = {};
19585 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19586 mmr.memory = mem;
19587 mmr.offset = 0;
19588 mmr.size = VK_WHOLE_SIZE;
19589 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19590 ASSERT_VK_SUCCESS(err);
19591 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19592 ASSERT_VK_SUCCESS(err);
19593 m_errorMonitor->VerifyNotFound();
19594 vkUnmapMemory(m_device->device(), mem);
19595
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019596 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019597 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019598 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019599 ASSERT_VK_SUCCESS(err);
19600 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19601 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019602 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019603 mmr.size = VK_WHOLE_SIZE;
19604 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19605 ASSERT_VK_SUCCESS(err);
19606 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19607 ASSERT_VK_SUCCESS(err);
19608 m_errorMonitor->VerifyNotFound();
19609 vkUnmapMemory(m_device->device(), mem);
19610
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019611 // Map with offset and size
19612 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019613 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019614 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019615 ASSERT_VK_SUCCESS(err);
19616 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19617 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019618 mmr.offset = 4 * atom_size;
19619 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019620 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19621 ASSERT_VK_SUCCESS(err);
19622 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19623 ASSERT_VK_SUCCESS(err);
19624 m_errorMonitor->VerifyNotFound();
19625 vkUnmapMemory(m_device->device(), mem);
19626
19627 // Map without offset and flush WHOLE_SIZE with two separate offsets
19628 m_errorMonitor->ExpectSuccess();
19629 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19630 ASSERT_VK_SUCCESS(err);
19631 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19632 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019633 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019634 mmr.size = VK_WHOLE_SIZE;
19635 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19636 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019637 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019638 mmr.size = VK_WHOLE_SIZE;
19639 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19640 ASSERT_VK_SUCCESS(err);
19641 m_errorMonitor->VerifyNotFound();
19642 vkUnmapMemory(m_device->device(), mem);
19643
19644 vkFreeMemory(m_device->device(), mem, NULL);
19645}
19646
19647// This is a positive test. We used to expect error in this case but spec now allows it
19648TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
19649 m_errorMonitor->ExpectSuccess();
19650 vk_testing::Fence testFence;
19651 VkFenceCreateInfo fenceInfo = {};
19652 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19653 fenceInfo.pNext = NULL;
19654
Tony Barbour1fa09702017-03-16 12:09:08 -060019655 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019656 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019657 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019658 VkResult result = vkResetFences(m_device->device(), 1, fences);
19659 ASSERT_VK_SUCCESS(result);
19660
19661 m_errorMonitor->VerifyNotFound();
19662}
19663
19664TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
19665 m_errorMonitor->ExpectSuccess();
19666
Tony Barbour1fa09702017-03-16 12:09:08 -060019667 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019668 VkResult err;
19669
19670 // Record (empty!) command buffer that can be submitted multiple times
19671 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019672 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
19673 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019674 m_commandBuffer->BeginCommandBuffer(&cbbi);
19675 m_commandBuffer->EndCommandBuffer();
19676
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019677 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019678 VkFence fence;
19679 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
19680 ASSERT_VK_SUCCESS(err);
19681
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019682 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019683 VkSemaphore s1, s2;
19684 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
19685 ASSERT_VK_SUCCESS(err);
19686 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
19687 ASSERT_VK_SUCCESS(err);
19688
19689 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019690 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019691 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
19692 ASSERT_VK_SUCCESS(err);
19693
19694 // Submit CB again, signaling s2.
19695 si.pSignalSemaphores = &s2;
19696 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
19697 ASSERT_VK_SUCCESS(err);
19698
19699 // Wait for fence.
19700 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19701 ASSERT_VK_SUCCESS(err);
19702
19703 // CB is still in flight from second submission, but semaphore s1 is no
19704 // longer in flight. delete it.
19705 vkDestroySemaphore(m_device->device(), s1, nullptr);
19706
19707 m_errorMonitor->VerifyNotFound();
19708
19709 // Force device idle and clean up remaining objects
19710 vkDeviceWaitIdle(m_device->device());
19711 vkDestroySemaphore(m_device->device(), s2, nullptr);
19712 vkDestroyFence(m_device->device(), fence, nullptr);
19713}
19714
19715TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
19716 m_errorMonitor->ExpectSuccess();
19717
Tony Barbour1fa09702017-03-16 12:09:08 -060019718 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019719 VkResult err;
19720
19721 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019722 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019723 VkFence f1;
19724 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
19725 ASSERT_VK_SUCCESS(err);
19726
19727 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019728 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019729 VkFence f2;
19730 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
19731 ASSERT_VK_SUCCESS(err);
19732
19733 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019734 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019735 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
19736
19737 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019738 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019739 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
19740
19741 // Should have both retired!
19742 vkDestroyFence(m_device->device(), f1, nullptr);
19743 vkDestroyFence(m_device->device(), f2, nullptr);
19744
19745 m_errorMonitor->VerifyNotFound();
19746}
19747
19748TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019749 TEST_DESCRIPTION(
19750 "Verify that creating an image view from an image with valid usage "
19751 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019752
Tony Barbour1fa09702017-03-16 12:09:08 -060019753 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019754
19755 m_errorMonitor->ExpectSuccess();
19756 // Verify that we can create a view with usage INPUT_ATTACHMENT
19757 VkImageObj image(m_device);
19758 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
19759 ASSERT_TRUE(image.initialized());
19760 VkImageView imageView;
19761 VkImageViewCreateInfo ivci = {};
19762 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
19763 ivci.image = image.handle();
19764 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
19765 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
19766 ivci.subresourceRange.layerCount = 1;
19767 ivci.subresourceRange.baseMipLevel = 0;
19768 ivci.subresourceRange.levelCount = 1;
19769 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19770
19771 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
19772 m_errorMonitor->VerifyNotFound();
19773 vkDestroyImageView(m_device->device(), imageView, NULL);
19774}
19775
19776// This is a positive test. No failures are expected.
19777TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019778 TEST_DESCRIPTION(
19779 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
19780 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019781
Tony Barbour1fa09702017-03-16 12:09:08 -060019782 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019783
19784 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019785 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019786
19787 m_errorMonitor->ExpectSuccess();
19788
19789 VkImage image;
19790 VkImageCreateInfo image_create_info = {};
19791 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19792 image_create_info.pNext = NULL;
19793 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19794 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
19795 image_create_info.extent.width = 64;
19796 image_create_info.extent.height = 64;
19797 image_create_info.extent.depth = 1;
19798 image_create_info.mipLevels = 1;
19799 image_create_info.arrayLayers = 1;
19800 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
19801 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
19802 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
19803 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
19804 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19805 ASSERT_VK_SUCCESS(err);
19806
19807 VkMemoryRequirements memory_reqs;
19808 VkDeviceMemory memory_one, memory_two;
19809 bool pass;
19810 VkMemoryAllocateInfo memory_info = {};
19811 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19812 memory_info.pNext = NULL;
19813 memory_info.allocationSize = 0;
19814 memory_info.memoryTypeIndex = 0;
19815 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19816 // Find an image big enough to allow sparse mapping of 2 memory regions
19817 // Increase the image size until it is at least twice the
19818 // size of the required alignment, to ensure we can bind both
19819 // allocated memory blocks to the image on aligned offsets.
19820 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
19821 vkDestroyImage(m_device->device(), image, nullptr);
19822 image_create_info.extent.width *= 2;
19823 image_create_info.extent.height *= 2;
19824 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
19825 ASSERT_VK_SUCCESS(err);
19826 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19827 }
19828 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
19829 // at the end of the first
19830 memory_info.allocationSize = memory_reqs.alignment;
19831 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19832 ASSERT_TRUE(pass);
19833 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
19834 ASSERT_VK_SUCCESS(err);
19835 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
19836 ASSERT_VK_SUCCESS(err);
19837 VkSparseMemoryBind binds[2];
19838 binds[0].flags = 0;
19839 binds[0].memory = memory_one;
19840 binds[0].memoryOffset = 0;
19841 binds[0].resourceOffset = 0;
19842 binds[0].size = memory_info.allocationSize;
19843 binds[1].flags = 0;
19844 binds[1].memory = memory_two;
19845 binds[1].memoryOffset = 0;
19846 binds[1].resourceOffset = memory_info.allocationSize;
19847 binds[1].size = memory_info.allocationSize;
19848
19849 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
19850 opaqueBindInfo.image = image;
19851 opaqueBindInfo.bindCount = 2;
19852 opaqueBindInfo.pBinds = binds;
19853
19854 VkFence fence = VK_NULL_HANDLE;
19855 VkBindSparseInfo bindSparseInfo = {};
19856 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
19857 bindSparseInfo.imageOpaqueBindCount = 1;
19858 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
19859
19860 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
19861 vkQueueWaitIdle(m_device->m_queue);
19862 vkDestroyImage(m_device->device(), image, NULL);
19863 vkFreeMemory(m_device->device(), memory_one, NULL);
19864 vkFreeMemory(m_device->device(), memory_two, NULL);
19865 m_errorMonitor->VerifyNotFound();
19866}
19867
19868TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019869 TEST_DESCRIPTION(
19870 "Ensure that CmdBeginRenderPass with an attachment's "
19871 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
19872 "the command buffer has prior knowledge of that "
19873 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019874
19875 m_errorMonitor->ExpectSuccess();
19876
Tony Barbour1fa09702017-03-16 12:09:08 -060019877 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019878
19879 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019880 VkAttachmentDescription attachment = {0,
19881 VK_FORMAT_R8G8B8A8_UNORM,
19882 VK_SAMPLE_COUNT_1_BIT,
19883 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19884 VK_ATTACHMENT_STORE_OP_STORE,
19885 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19886 VK_ATTACHMENT_STORE_OP_DONT_CARE,
19887 VK_IMAGE_LAYOUT_UNDEFINED,
19888 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019889
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019890 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019891
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019892 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019893
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019894 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019895
19896 VkRenderPass rp;
19897 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
19898 ASSERT_VK_SUCCESS(err);
19899
19900 // A compatible framebuffer.
19901 VkImageObj image(m_device);
19902 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
19903 ASSERT_TRUE(image.initialized());
19904
19905 VkImageViewCreateInfo ivci = {
19906 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
19907 nullptr,
19908 0,
19909 image.handle(),
19910 VK_IMAGE_VIEW_TYPE_2D,
19911 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019912 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
19913 VK_COMPONENT_SWIZZLE_IDENTITY},
19914 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019915 };
19916 VkImageView view;
19917 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
19918 ASSERT_VK_SUCCESS(err);
19919
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019920 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019921 VkFramebuffer fb;
19922 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
19923 ASSERT_VK_SUCCESS(err);
19924
19925 // Record a single command buffer which uses this renderpass twice. The
19926 // bug is triggered at the beginning of the second renderpass, when the
19927 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019928 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 -070019929 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019930 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
19931 vkCmdEndRenderPass(m_commandBuffer->handle());
19932 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
19933
19934 m_errorMonitor->VerifyNotFound();
19935
19936 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070019937 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019938
19939 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
19940 vkDestroyRenderPass(m_device->device(), rp, nullptr);
19941 vkDestroyImageView(m_device->device(), view, nullptr);
19942}
19943
19944TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019945 TEST_DESCRIPTION(
19946 "This test should pass. Create a Framebuffer and "
19947 "command buffer, bind them together, then destroy "
19948 "command pool and framebuffer and verify there are no "
19949 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019950
19951 m_errorMonitor->ExpectSuccess();
19952
Tony Barbour1fa09702017-03-16 12:09:08 -060019953 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019954
19955 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019956 VkAttachmentDescription attachment = {0,
19957 VK_FORMAT_R8G8B8A8_UNORM,
19958 VK_SAMPLE_COUNT_1_BIT,
19959 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19960 VK_ATTACHMENT_STORE_OP_STORE,
19961 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19962 VK_ATTACHMENT_STORE_OP_DONT_CARE,
19963 VK_IMAGE_LAYOUT_UNDEFINED,
19964 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019965
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019966 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019967
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019968 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019969
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019970 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019971
19972 VkRenderPass rp;
19973 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
19974 ASSERT_VK_SUCCESS(err);
19975
19976 // A compatible framebuffer.
19977 VkImageObj image(m_device);
19978 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
19979 ASSERT_TRUE(image.initialized());
19980
19981 VkImageViewCreateInfo ivci = {
19982 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
19983 nullptr,
19984 0,
19985 image.handle(),
19986 VK_IMAGE_VIEW_TYPE_2D,
19987 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019988 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
19989 VK_COMPONENT_SWIZZLE_IDENTITY},
19990 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019991 };
19992 VkImageView view;
19993 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
19994 ASSERT_VK_SUCCESS(err);
19995
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019996 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019997 VkFramebuffer fb;
19998 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
19999 ASSERT_VK_SUCCESS(err);
20000
20001 // Explicitly create a command buffer to bind the FB to so that we can then
20002 // destroy the command pool in order to implicitly free command buffer
20003 VkCommandPool command_pool;
20004 VkCommandPoolCreateInfo pool_create_info{};
20005 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20006 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20007 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20008 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20009
20010 VkCommandBuffer command_buffer;
20011 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20012 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20013 command_buffer_allocate_info.commandPool = command_pool;
20014 command_buffer_allocate_info.commandBufferCount = 1;
20015 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20016 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20017
20018 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020019 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 -060020020 VkCommandBufferBeginInfo begin_info{};
20021 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20022 vkBeginCommandBuffer(command_buffer, &begin_info);
20023
20024 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20025 vkCmdEndRenderPass(command_buffer);
20026 vkEndCommandBuffer(command_buffer);
20027 vkDestroyImageView(m_device->device(), view, nullptr);
20028 // Destroy command pool to implicitly free command buffer
20029 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20030 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20031 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20032 m_errorMonitor->VerifyNotFound();
20033}
20034
20035TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020036 TEST_DESCRIPTION(
20037 "Ensure that CmdBeginRenderPass applies the layout "
20038 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020039
20040 m_errorMonitor->ExpectSuccess();
20041
Tony Barbour1fa09702017-03-16 12:09:08 -060020042 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020043
20044 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020045 VkAttachmentDescription attachment = {0,
20046 VK_FORMAT_R8G8B8A8_UNORM,
20047 VK_SAMPLE_COUNT_1_BIT,
20048 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20049 VK_ATTACHMENT_STORE_OP_STORE,
20050 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20051 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20052 VK_IMAGE_LAYOUT_UNDEFINED,
20053 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020054
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020055 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020056
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020057 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020058
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020059 VkSubpassDependency dep = {0,
20060 0,
20061 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20062 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20063 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20064 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20065 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020066
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020067 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020068
20069 VkResult err;
20070 VkRenderPass rp;
20071 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20072 ASSERT_VK_SUCCESS(err);
20073
20074 // A compatible framebuffer.
20075 VkImageObj image(m_device);
20076 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
20077 ASSERT_TRUE(image.initialized());
20078
20079 VkImageViewCreateInfo ivci = {
20080 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20081 nullptr,
20082 0,
20083 image.handle(),
20084 VK_IMAGE_VIEW_TYPE_2D,
20085 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020086 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
20087 VK_COMPONENT_SWIZZLE_IDENTITY},
20088 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020089 };
20090 VkImageView view;
20091 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20092 ASSERT_VK_SUCCESS(err);
20093
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020094 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020095 VkFramebuffer fb;
20096 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20097 ASSERT_VK_SUCCESS(err);
20098
20099 // Record a single command buffer which issues a pipeline barrier w/
20100 // image memory barrier for the attachment. This detects the previously
20101 // missing tracking of the subpass layout by throwing a validation error
20102 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020103 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 -070020104 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020105 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20106
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020107 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
20108 nullptr,
20109 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20110 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20111 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20112 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
20113 VK_QUEUE_FAMILY_IGNORED,
20114 VK_QUEUE_FAMILY_IGNORED,
20115 image.handle(),
20116 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020117 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020118 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20119 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020120
20121 vkCmdEndRenderPass(m_commandBuffer->handle());
20122 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020123 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020124
20125 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20126 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20127 vkDestroyImageView(m_device->device(), view, nullptr);
20128}
20129
20130TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020131 TEST_DESCRIPTION(
20132 "Validate that when an imageView of a depth/stencil image "
20133 "is used as a depth/stencil framebuffer attachment, the "
20134 "aspectMask is ignored and both depth and stencil image "
20135 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020136
Tony Barbour1fa09702017-03-16 12:09:08 -060020137 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020138 VkFormatProperties format_properties;
20139 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
20140 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
20141 return;
20142 }
20143
20144 m_errorMonitor->ExpectSuccess();
20145
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020146 VkAttachmentDescription attachment = {0,
20147 VK_FORMAT_D32_SFLOAT_S8_UINT,
20148 VK_SAMPLE_COUNT_1_BIT,
20149 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20150 VK_ATTACHMENT_STORE_OP_STORE,
20151 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
20152 VK_ATTACHMENT_STORE_OP_DONT_CARE,
20153 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
20154 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020155
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020156 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020157
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020158 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020159
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020160 VkSubpassDependency dep = {0,
20161 0,
20162 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20163 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
20164 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20165 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
20166 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020167
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020168 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020169
20170 VkResult err;
20171 VkRenderPass rp;
20172 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20173 ASSERT_VK_SUCCESS(err);
20174
20175 VkImageObj image(m_device);
20176 image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020177 0x26, // usage
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020178 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020179 ASSERT_TRUE(image.initialized());
20180 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
20181
20182 VkImageViewCreateInfo ivci = {
20183 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
20184 nullptr,
20185 0,
20186 image.handle(),
20187 VK_IMAGE_VIEW_TYPE_2D,
20188 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020189 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
20190 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020191 };
20192 VkImageView view;
20193 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
20194 ASSERT_VK_SUCCESS(err);
20195
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020196 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020197 VkFramebuffer fb;
20198 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20199 ASSERT_VK_SUCCESS(err);
20200
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020201 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 -070020202 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020203 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20204
20205 VkImageMemoryBarrier imb = {};
20206 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20207 imb.pNext = nullptr;
20208 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20209 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20210 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20211 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
20212 imb.srcQueueFamilyIndex = 0;
20213 imb.dstQueueFamilyIndex = 0;
20214 imb.image = image.handle();
20215 imb.subresourceRange.aspectMask = 0x6;
20216 imb.subresourceRange.baseMipLevel = 0;
20217 imb.subresourceRange.levelCount = 0x1;
20218 imb.subresourceRange.baseArrayLayer = 0;
20219 imb.subresourceRange.layerCount = 0x1;
20220
20221 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020222 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
20223 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020224
20225 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070020226 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020227 QueueCommandBuffer(false);
20228 m_errorMonitor->VerifyNotFound();
20229
20230 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20231 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20232 vkDestroyImageView(m_device->device(), view, nullptr);
20233}
20234
20235TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020236 TEST_DESCRIPTION(
20237 "Ensure that layout transitions work correctly without "
20238 "errors, when an attachment reference is "
20239 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020240
20241 m_errorMonitor->ExpectSuccess();
20242
Tony Barbour1fa09702017-03-16 12:09:08 -060020243 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020244
20245 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020246 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020247
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020248 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020249
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020250 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020251
20252 VkRenderPass rp;
20253 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
20254 ASSERT_VK_SUCCESS(err);
20255
20256 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020257 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020258 VkFramebuffer fb;
20259 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
20260 ASSERT_VK_SUCCESS(err);
20261
20262 // Record a command buffer which just begins and ends the renderpass. The
20263 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020264 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 -070020265 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020266 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
20267 vkCmdEndRenderPass(m_commandBuffer->handle());
20268 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070020269 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020270
20271 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20272 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20273}
20274
20275// This is a positive test. No errors are expected.
20276TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020277 TEST_DESCRIPTION(
20278 "Create a stencil-only attachment with a LOAD_OP set to "
20279 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020280 VkResult result = VK_SUCCESS;
Tony Barbour1fa09702017-03-16 12:09:08 -060020281 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070020282 auto depth_format = find_depth_stencil_format(m_device);
20283 if (!depth_format) {
20284 printf(" No Depth + Stencil format found. Skipped.\n");
20285 return;
20286 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020287 VkImageFormatProperties formatProps;
Tony Barbourf887b162017-03-09 10:06:46 -070020288 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020289 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
20290 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020291 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
20292 return;
20293 }
20294
Tony Barbourf887b162017-03-09 10:06:46 -070020295 VkFormat depth_stencil_fmt = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020296 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020297 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020298 VkAttachmentDescription att = {};
20299 VkAttachmentReference ref = {};
20300 att.format = depth_stencil_fmt;
20301 att.samples = VK_SAMPLE_COUNT_1_BIT;
20302 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
20303 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
20304 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
20305 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
20306 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20307 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20308
20309 VkClearValue clear;
20310 clear.depthStencil.depth = 1.0;
20311 clear.depthStencil.stencil = 0;
20312 ref.attachment = 0;
20313 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20314
20315 VkSubpassDescription subpass = {};
20316 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
20317 subpass.flags = 0;
20318 subpass.inputAttachmentCount = 0;
20319 subpass.pInputAttachments = NULL;
20320 subpass.colorAttachmentCount = 0;
20321 subpass.pColorAttachments = NULL;
20322 subpass.pResolveAttachments = NULL;
20323 subpass.pDepthStencilAttachment = &ref;
20324 subpass.preserveAttachmentCount = 0;
20325 subpass.pPreserveAttachments = NULL;
20326
20327 VkRenderPass rp;
20328 VkRenderPassCreateInfo rp_info = {};
20329 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
20330 rp_info.attachmentCount = 1;
20331 rp_info.pAttachments = &att;
20332 rp_info.subpassCount = 1;
20333 rp_info.pSubpasses = &subpass;
20334 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
20335 ASSERT_VK_SUCCESS(result);
20336
20337 VkImageView *depthView = m_depthStencil->BindInfo();
20338 VkFramebufferCreateInfo fb_info = {};
20339 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
20340 fb_info.pNext = NULL;
20341 fb_info.renderPass = rp;
20342 fb_info.attachmentCount = 1;
20343 fb_info.pAttachments = depthView;
20344 fb_info.width = 100;
20345 fb_info.height = 100;
20346 fb_info.layers = 1;
20347 VkFramebuffer fb;
20348 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
20349 ASSERT_VK_SUCCESS(result);
20350
20351 VkRenderPassBeginInfo rpbinfo = {};
20352 rpbinfo.clearValueCount = 1;
20353 rpbinfo.pClearValues = &clear;
20354 rpbinfo.pNext = NULL;
20355 rpbinfo.renderPass = rp;
20356 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
20357 rpbinfo.renderArea.extent.width = 100;
20358 rpbinfo.renderArea.extent.height = 100;
20359 rpbinfo.renderArea.offset.x = 0;
20360 rpbinfo.renderArea.offset.y = 0;
20361 rpbinfo.framebuffer = fb;
20362
20363 VkFence fence = {};
20364 VkFenceCreateInfo fence_ci = {};
20365 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20366 fence_ci.pNext = nullptr;
20367 fence_ci.flags = 0;
20368 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
20369 ASSERT_VK_SUCCESS(result);
20370
20371 m_commandBuffer->BeginCommandBuffer();
20372 m_commandBuffer->BeginRenderPass(rpbinfo);
20373 m_commandBuffer->EndRenderPass();
20374 m_commandBuffer->EndCommandBuffer();
20375 m_commandBuffer->QueueCommandBuffer(fence);
20376
20377 VkImageObj destImage(m_device);
20378 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 -070020379 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020380 VkImageMemoryBarrier barrier = {};
20381 VkImageSubresourceRange range;
20382 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20383 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20384 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
20385 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20386 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20387 barrier.image = m_depthStencil->handle();
20388 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20389 range.baseMipLevel = 0;
20390 range.levelCount = 1;
20391 range.baseArrayLayer = 0;
20392 range.layerCount = 1;
20393 barrier.subresourceRange = range;
20394 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20395 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
20396 cmdbuf.BeginCommandBuffer();
20397 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 -070020398 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020399 barrier.srcAccessMask = 0;
20400 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
20401 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
20402 barrier.image = destImage.handle();
20403 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20404 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 -070020405 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020406 VkImageCopy cregion;
20407 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20408 cregion.srcSubresource.mipLevel = 0;
20409 cregion.srcSubresource.baseArrayLayer = 0;
20410 cregion.srcSubresource.layerCount = 1;
20411 cregion.srcOffset.x = 0;
20412 cregion.srcOffset.y = 0;
20413 cregion.srcOffset.z = 0;
20414 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20415 cregion.dstSubresource.mipLevel = 0;
20416 cregion.dstSubresource.baseArrayLayer = 0;
20417 cregion.dstSubresource.layerCount = 1;
20418 cregion.dstOffset.x = 0;
20419 cregion.dstOffset.y = 0;
20420 cregion.dstOffset.z = 0;
20421 cregion.extent.width = 100;
20422 cregion.extent.height = 100;
20423 cregion.extent.depth = 1;
20424 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020425 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020426 cmdbuf.EndCommandBuffer();
20427
20428 VkSubmitInfo submit_info;
20429 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20430 submit_info.pNext = NULL;
20431 submit_info.waitSemaphoreCount = 0;
20432 submit_info.pWaitSemaphores = NULL;
20433 submit_info.pWaitDstStageMask = NULL;
20434 submit_info.commandBufferCount = 1;
20435 submit_info.pCommandBuffers = &cmdbuf.handle();
20436 submit_info.signalSemaphoreCount = 0;
20437 submit_info.pSignalSemaphores = NULL;
20438
20439 m_errorMonitor->ExpectSuccess();
20440 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20441 m_errorMonitor->VerifyNotFound();
20442
20443 vkQueueWaitIdle(m_device->m_queue);
20444 vkDestroyFence(m_device->device(), fence, nullptr);
20445 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20446 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20447}
20448
20449// This is a positive test. No errors should be generated.
Mike Weiblene4e225d2017-03-07 23:15:43 -070020450TEST_F(VkPositiveLayerTest, BarrierLayoutToImageUsage) {
20451 TEST_DESCRIPTION("Ensure barriers' new and old VkImageLayout are compatible with their images' VkImageUsageFlags");
20452
20453 m_errorMonitor->ExpectSuccess();
20454
Tony Barbour1fa09702017-03-16 12:09:08 -060020455 ASSERT_NO_FATAL_FAILURE(Init());
Mike Weiblene4e225d2017-03-07 23:15:43 -070020456 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
20457
20458 VkImageMemoryBarrier img_barrier = {};
20459 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20460 img_barrier.pNext = NULL;
20461 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
20462 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
20463 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20464 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
20465 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20466 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
20467 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
20468 img_barrier.subresourceRange.baseArrayLayer = 0;
20469 img_barrier.subresourceRange.baseMipLevel = 0;
20470 img_barrier.subresourceRange.layerCount = 1;
20471 img_barrier.subresourceRange.levelCount = 1;
20472
20473 {
20474 VkImageObj img_color(m_device);
20475 img_color.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
20476 ASSERT_TRUE(img_color.initialized());
20477
20478 VkImageObj img_ds1(m_device);
20479 img_ds1.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
20480 ASSERT_TRUE(img_ds1.initialized());
20481
20482 VkImageObj img_ds2(m_device);
20483 img_ds2.init(128, 128, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
20484 ASSERT_TRUE(img_ds2.initialized());
20485
20486 VkImageObj img_xfer_src(m_device);
20487 img_xfer_src.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL);
20488 ASSERT_TRUE(img_xfer_src.initialized());
20489
20490 VkImageObj img_xfer_dst(m_device);
20491 img_xfer_dst.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_OPTIMAL);
20492 ASSERT_TRUE(img_xfer_dst.initialized());
20493
20494 VkImageObj img_sampled(m_device);
20495 img_sampled.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL);
20496 ASSERT_TRUE(img_sampled.initialized());
20497
20498 VkImageObj img_input(m_device);
20499 img_input.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL);
20500 ASSERT_TRUE(img_input.initialized());
20501
20502 const struct {
20503 VkImageObj &image_obj;
20504 VkImageLayout old_layout;
20505 VkImageLayout new_layout;
20506 } buffer_layouts[] = {
20507 // clang-format off
20508 {img_color, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20509 {img_ds1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20510 {img_ds2, VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20511 {img_sampled, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20512 {img_input, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20513 {img_xfer_src, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20514 {img_xfer_dst, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_GENERAL},
20515 // clang-format on
20516 };
20517 const uint32_t layout_count = sizeof(buffer_layouts) / sizeof(buffer_layouts[0]);
20518
20519 m_commandBuffer->BeginCommandBuffer();
20520 for (uint32_t i = 0; i < layout_count; ++i) {
20521 img_barrier.image = buffer_layouts[i].image_obj.handle();
20522 const VkImageUsageFlags usage = buffer_layouts[i].image_obj.usage();
20523 img_barrier.subresourceRange.aspectMask = (usage == VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT)
20524 ? (VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT)
20525 : VK_IMAGE_ASPECT_COLOR_BIT;
20526
20527 img_barrier.oldLayout = buffer_layouts[i].old_layout;
20528 img_barrier.newLayout = buffer_layouts[i].new_layout;
20529 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20530 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20531
20532 img_barrier.oldLayout = buffer_layouts[i].new_layout;
20533 img_barrier.newLayout = buffer_layouts[i].old_layout;
20534 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT,
20535 VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0, nullptr, 1, &img_barrier);
20536 }
20537 m_commandBuffer->EndCommandBuffer();
20538
20539 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
20540 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
20541 }
20542 m_errorMonitor->VerifyNotFound();
20543}
20544
20545// This is a positive test. No errors should be generated.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020546TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
20547 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
20548
20549 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060020550 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020551
20552 VkEvent event;
20553 VkEventCreateInfo event_create_info{};
20554 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20555 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20556
20557 VkCommandPool command_pool;
20558 VkCommandPoolCreateInfo pool_create_info{};
20559 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20560 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20561 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20562 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20563
20564 VkCommandBuffer command_buffer;
20565 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20566 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20567 command_buffer_allocate_info.commandPool = command_pool;
20568 command_buffer_allocate_info.commandBufferCount = 1;
20569 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20570 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20571
20572 VkQueue queue = VK_NULL_HANDLE;
20573 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20574
20575 {
20576 VkCommandBufferBeginInfo begin_info{};
20577 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20578 vkBeginCommandBuffer(command_buffer, &begin_info);
20579
20580 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 -070020581 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020582 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
20583 vkEndCommandBuffer(command_buffer);
20584 }
20585 {
20586 VkSubmitInfo submit_info{};
20587 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20588 submit_info.commandBufferCount = 1;
20589 submit_info.pCommandBuffers = &command_buffer;
20590 submit_info.signalSemaphoreCount = 0;
20591 submit_info.pSignalSemaphores = nullptr;
20592 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20593 }
20594 { vkSetEvent(m_device->device(), event); }
20595
20596 vkQueueWaitIdle(queue);
20597
20598 vkDestroyEvent(m_device->device(), event, nullptr);
20599 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20600 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20601
20602 m_errorMonitor->VerifyNotFound();
20603}
20604// This is a positive test. No errors should be generated.
20605TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
20606 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
20607
Tony Barbour1fa09702017-03-16 12:09:08 -060020608 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020609 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020610
20611 m_errorMonitor->ExpectSuccess();
20612
20613 VkQueryPool query_pool;
20614 VkQueryPoolCreateInfo query_pool_create_info{};
20615 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20616 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20617 query_pool_create_info.queryCount = 1;
20618 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20619
20620 VkCommandPool command_pool;
20621 VkCommandPoolCreateInfo pool_create_info{};
20622 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20623 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20624 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20625 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20626
20627 VkCommandBuffer command_buffer;
20628 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20629 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20630 command_buffer_allocate_info.commandPool = command_pool;
20631 command_buffer_allocate_info.commandBufferCount = 1;
20632 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20633 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20634
20635 VkCommandBuffer secondary_command_buffer;
20636 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
20637 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
20638
20639 VkQueue queue = VK_NULL_HANDLE;
20640 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20641
20642 uint32_t qfi = 0;
20643 VkBufferCreateInfo buff_create_info = {};
20644 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20645 buff_create_info.size = 1024;
20646 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20647 buff_create_info.queueFamilyIndexCount = 1;
20648 buff_create_info.pQueueFamilyIndices = &qfi;
20649
20650 VkResult err;
20651 VkBuffer buffer;
20652 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20653 ASSERT_VK_SUCCESS(err);
20654 VkMemoryAllocateInfo mem_alloc = {};
20655 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20656 mem_alloc.pNext = NULL;
20657 mem_alloc.allocationSize = 1024;
20658 mem_alloc.memoryTypeIndex = 0;
20659
20660 VkMemoryRequirements memReqs;
20661 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20662 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20663 if (!pass) {
20664 vkDestroyBuffer(m_device->device(), buffer, NULL);
20665 return;
20666 }
20667
20668 VkDeviceMemory mem;
20669 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20670 ASSERT_VK_SUCCESS(err);
20671 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20672 ASSERT_VK_SUCCESS(err);
20673
20674 VkCommandBufferInheritanceInfo hinfo = {};
20675 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
20676 hinfo.renderPass = VK_NULL_HANDLE;
20677 hinfo.subpass = 0;
20678 hinfo.framebuffer = VK_NULL_HANDLE;
20679 hinfo.occlusionQueryEnable = VK_FALSE;
20680 hinfo.queryFlags = 0;
20681 hinfo.pipelineStatistics = 0;
20682
20683 {
20684 VkCommandBufferBeginInfo begin_info{};
20685 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20686 begin_info.pInheritanceInfo = &hinfo;
20687 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
20688
20689 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
20690 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20691
20692 vkEndCommandBuffer(secondary_command_buffer);
20693
20694 begin_info.pInheritanceInfo = nullptr;
20695 vkBeginCommandBuffer(command_buffer, &begin_info);
20696
20697 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
20698 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
20699
20700 vkEndCommandBuffer(command_buffer);
20701 }
20702 {
20703 VkSubmitInfo submit_info{};
20704 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20705 submit_info.commandBufferCount = 1;
20706 submit_info.pCommandBuffers = &command_buffer;
20707 submit_info.signalSemaphoreCount = 0;
20708 submit_info.pSignalSemaphores = nullptr;
20709 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20710 }
20711
20712 vkQueueWaitIdle(queue);
20713
20714 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
20715 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20716 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
20717 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20718 vkDestroyBuffer(m_device->device(), buffer, NULL);
20719 vkFreeMemory(m_device->device(), mem, NULL);
20720
20721 m_errorMonitor->VerifyNotFound();
20722}
20723
20724// This is a positive test. No errors should be generated.
20725TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
20726 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
20727
Tony Barbour1fa09702017-03-16 12:09:08 -060020728 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020729 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020730
20731 m_errorMonitor->ExpectSuccess();
20732
20733 VkQueryPool query_pool;
20734 VkQueryPoolCreateInfo query_pool_create_info{};
20735 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20736 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20737 query_pool_create_info.queryCount = 1;
20738 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20739
20740 VkCommandPool command_pool;
20741 VkCommandPoolCreateInfo pool_create_info{};
20742 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20743 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20744 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20745 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20746
20747 VkCommandBuffer command_buffer[2];
20748 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20749 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20750 command_buffer_allocate_info.commandPool = command_pool;
20751 command_buffer_allocate_info.commandBufferCount = 2;
20752 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20753 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20754
20755 VkQueue queue = VK_NULL_HANDLE;
20756 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20757
20758 uint32_t qfi = 0;
20759 VkBufferCreateInfo buff_create_info = {};
20760 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20761 buff_create_info.size = 1024;
20762 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20763 buff_create_info.queueFamilyIndexCount = 1;
20764 buff_create_info.pQueueFamilyIndices = &qfi;
20765
20766 VkResult err;
20767 VkBuffer buffer;
20768 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20769 ASSERT_VK_SUCCESS(err);
20770 VkMemoryAllocateInfo mem_alloc = {};
20771 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20772 mem_alloc.pNext = NULL;
20773 mem_alloc.allocationSize = 1024;
20774 mem_alloc.memoryTypeIndex = 0;
20775
20776 VkMemoryRequirements memReqs;
20777 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20778 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20779 if (!pass) {
20780 vkDestroyBuffer(m_device->device(), buffer, NULL);
20781 return;
20782 }
20783
20784 VkDeviceMemory mem;
20785 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20786 ASSERT_VK_SUCCESS(err);
20787 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20788 ASSERT_VK_SUCCESS(err);
20789
20790 {
20791 VkCommandBufferBeginInfo begin_info{};
20792 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20793 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20794
20795 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
20796 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20797
20798 vkEndCommandBuffer(command_buffer[0]);
20799
20800 vkBeginCommandBuffer(command_buffer[1], &begin_info);
20801
20802 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
20803
20804 vkEndCommandBuffer(command_buffer[1]);
20805 }
20806 {
20807 VkSubmitInfo submit_info{};
20808 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20809 submit_info.commandBufferCount = 2;
20810 submit_info.pCommandBuffers = command_buffer;
20811 submit_info.signalSemaphoreCount = 0;
20812 submit_info.pSignalSemaphores = nullptr;
20813 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20814 }
20815
20816 vkQueueWaitIdle(queue);
20817
20818 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
20819 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
20820 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20821 vkDestroyBuffer(m_device->device(), buffer, NULL);
20822 vkFreeMemory(m_device->device(), mem, NULL);
20823
20824 m_errorMonitor->VerifyNotFound();
20825}
20826
Tony Barbourc46924f2016-11-04 11:49:52 -060020827TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020828 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
20829
Tony Barbour1fa09702017-03-16 12:09:08 -060020830 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020831 VkEvent event;
20832 VkEventCreateInfo event_create_info{};
20833 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20834 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20835
20836 VkCommandPool command_pool;
20837 VkCommandPoolCreateInfo pool_create_info{};
20838 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20839 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20840 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20841 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20842
20843 VkCommandBuffer command_buffer;
20844 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20845 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20846 command_buffer_allocate_info.commandPool = command_pool;
20847 command_buffer_allocate_info.commandBufferCount = 1;
20848 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20849 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20850
20851 VkQueue queue = VK_NULL_HANDLE;
20852 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20853
20854 {
20855 VkCommandBufferBeginInfo begin_info{};
20856 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20857 vkBeginCommandBuffer(command_buffer, &begin_info);
20858
20859 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020860 vkEndCommandBuffer(command_buffer);
20861 }
20862 {
20863 VkSubmitInfo submit_info{};
20864 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20865 submit_info.commandBufferCount = 1;
20866 submit_info.pCommandBuffers = &command_buffer;
20867 submit_info.signalSemaphoreCount = 0;
20868 submit_info.pSignalSemaphores = nullptr;
20869 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20870 }
20871 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020872 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
20873 "that is already in use by a "
20874 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020875 vkSetEvent(m_device->device(), event);
20876 m_errorMonitor->VerifyFound();
20877 }
20878
20879 vkQueueWaitIdle(queue);
20880
20881 vkDestroyEvent(m_device->device(), event, nullptr);
20882 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20883 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20884}
20885
20886// This is a positive test. No errors should be generated.
20887TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020888 TEST_DESCRIPTION(
20889 "Two command buffers with two separate fences are each "
20890 "run through a Submit & WaitForFences cycle 3 times. This "
20891 "previously revealed a bug so running this positive test "
20892 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020893 m_errorMonitor->ExpectSuccess();
20894
Tony Barbour1fa09702017-03-16 12:09:08 -060020895 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020896 VkQueue queue = VK_NULL_HANDLE;
20897 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20898
20899 static const uint32_t NUM_OBJECTS = 2;
20900 static const uint32_t NUM_FRAMES = 3;
20901 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
20902 VkFence fences[NUM_OBJECTS] = {};
20903
20904 VkCommandPool cmd_pool;
20905 VkCommandPoolCreateInfo cmd_pool_ci = {};
20906 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20907 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
20908 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20909 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
20910 ASSERT_VK_SUCCESS(err);
20911
20912 VkCommandBufferAllocateInfo cmd_buf_info = {};
20913 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20914 cmd_buf_info.commandPool = cmd_pool;
20915 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20916 cmd_buf_info.commandBufferCount = 1;
20917
20918 VkFenceCreateInfo fence_ci = {};
20919 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20920 fence_ci.pNext = nullptr;
20921 fence_ci.flags = 0;
20922
20923 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
20924 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
20925 ASSERT_VK_SUCCESS(err);
20926 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
20927 ASSERT_VK_SUCCESS(err);
20928 }
20929
20930 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
20931 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
20932 // Create empty cmd buffer
20933 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
20934 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20935
20936 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
20937 ASSERT_VK_SUCCESS(err);
20938 err = vkEndCommandBuffer(cmd_buffers[obj]);
20939 ASSERT_VK_SUCCESS(err);
20940
20941 VkSubmitInfo submit_info = {};
20942 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20943 submit_info.commandBufferCount = 1;
20944 submit_info.pCommandBuffers = &cmd_buffers[obj];
20945 // Submit cmd buffer and wait for fence
20946 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
20947 ASSERT_VK_SUCCESS(err);
20948 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
20949 ASSERT_VK_SUCCESS(err);
20950 err = vkResetFences(m_device->device(), 1, &fences[obj]);
20951 ASSERT_VK_SUCCESS(err);
20952 }
20953 }
20954 m_errorMonitor->VerifyNotFound();
20955 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
20956 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
20957 vkDestroyFence(m_device->device(), fences[i], nullptr);
20958 }
20959}
20960// This is a positive test. No errors should be generated.
20961TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020962 TEST_DESCRIPTION(
20963 "Two command buffers, each in a separate QueueSubmit call "
20964 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020965
Tony Barbour1fa09702017-03-16 12:09:08 -060020966 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020967 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020968
20969 m_errorMonitor->ExpectSuccess();
20970
20971 VkSemaphore semaphore;
20972 VkSemaphoreCreateInfo semaphore_create_info{};
20973 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
20974 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
20975
20976 VkCommandPool command_pool;
20977 VkCommandPoolCreateInfo pool_create_info{};
20978 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20979 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20980 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20981 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20982
20983 VkCommandBuffer command_buffer[2];
20984 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20985 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20986 command_buffer_allocate_info.commandPool = command_pool;
20987 command_buffer_allocate_info.commandBufferCount = 2;
20988 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20989 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20990
20991 VkQueue queue = VK_NULL_HANDLE;
20992 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20993
20994 {
20995 VkCommandBufferBeginInfo begin_info{};
20996 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20997 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20998
20999 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 -070021000 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021001
21002 VkViewport viewport{};
21003 viewport.maxDepth = 1.0f;
21004 viewport.minDepth = 0.0f;
21005 viewport.width = 512;
21006 viewport.height = 512;
21007 viewport.x = 0;
21008 viewport.y = 0;
21009 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21010 vkEndCommandBuffer(command_buffer[0]);
21011 }
21012 {
21013 VkCommandBufferBeginInfo begin_info{};
21014 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21015 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21016
21017 VkViewport viewport{};
21018 viewport.maxDepth = 1.0f;
21019 viewport.minDepth = 0.0f;
21020 viewport.width = 512;
21021 viewport.height = 512;
21022 viewport.x = 0;
21023 viewport.y = 0;
21024 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21025 vkEndCommandBuffer(command_buffer[1]);
21026 }
21027 {
21028 VkSubmitInfo submit_info{};
21029 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21030 submit_info.commandBufferCount = 1;
21031 submit_info.pCommandBuffers = &command_buffer[0];
21032 submit_info.signalSemaphoreCount = 1;
21033 submit_info.pSignalSemaphores = &semaphore;
21034 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21035 }
21036 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021037 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021038 VkSubmitInfo submit_info{};
21039 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21040 submit_info.commandBufferCount = 1;
21041 submit_info.pCommandBuffers = &command_buffer[1];
21042 submit_info.waitSemaphoreCount = 1;
21043 submit_info.pWaitSemaphores = &semaphore;
21044 submit_info.pWaitDstStageMask = flags;
21045 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21046 }
21047
21048 vkQueueWaitIdle(m_device->m_queue);
21049
21050 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21051 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21052 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21053
21054 m_errorMonitor->VerifyNotFound();
21055}
21056
21057// This is a positive test. No errors should be generated.
21058TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021059 TEST_DESCRIPTION(
21060 "Two command buffers, each in a separate QueueSubmit call "
21061 "submitted on separate queues, the second having a fence"
21062 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021063
Tony Barbour1fa09702017-03-16 12:09:08 -060021064 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021065 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021066
21067 m_errorMonitor->ExpectSuccess();
21068
21069 VkFence fence;
21070 VkFenceCreateInfo fence_create_info{};
21071 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21072 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21073
21074 VkSemaphore semaphore;
21075 VkSemaphoreCreateInfo semaphore_create_info{};
21076 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21077 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21078
21079 VkCommandPool command_pool;
21080 VkCommandPoolCreateInfo pool_create_info{};
21081 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21082 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21083 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21084 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21085
21086 VkCommandBuffer command_buffer[2];
21087 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21088 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21089 command_buffer_allocate_info.commandPool = command_pool;
21090 command_buffer_allocate_info.commandBufferCount = 2;
21091 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21092 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21093
21094 VkQueue queue = VK_NULL_HANDLE;
21095 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21096
21097 {
21098 VkCommandBufferBeginInfo begin_info{};
21099 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21100 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21101
21102 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 -070021103 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021104
21105 VkViewport viewport{};
21106 viewport.maxDepth = 1.0f;
21107 viewport.minDepth = 0.0f;
21108 viewport.width = 512;
21109 viewport.height = 512;
21110 viewport.x = 0;
21111 viewport.y = 0;
21112 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21113 vkEndCommandBuffer(command_buffer[0]);
21114 }
21115 {
21116 VkCommandBufferBeginInfo begin_info{};
21117 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21118 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21119
21120 VkViewport viewport{};
21121 viewport.maxDepth = 1.0f;
21122 viewport.minDepth = 0.0f;
21123 viewport.width = 512;
21124 viewport.height = 512;
21125 viewport.x = 0;
21126 viewport.y = 0;
21127 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21128 vkEndCommandBuffer(command_buffer[1]);
21129 }
21130 {
21131 VkSubmitInfo submit_info{};
21132 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21133 submit_info.commandBufferCount = 1;
21134 submit_info.pCommandBuffers = &command_buffer[0];
21135 submit_info.signalSemaphoreCount = 1;
21136 submit_info.pSignalSemaphores = &semaphore;
21137 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21138 }
21139 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021140 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021141 VkSubmitInfo submit_info{};
21142 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21143 submit_info.commandBufferCount = 1;
21144 submit_info.pCommandBuffers = &command_buffer[1];
21145 submit_info.waitSemaphoreCount = 1;
21146 submit_info.pWaitSemaphores = &semaphore;
21147 submit_info.pWaitDstStageMask = flags;
21148 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21149 }
21150
21151 vkQueueWaitIdle(m_device->m_queue);
21152
21153 vkDestroyFence(m_device->device(), fence, nullptr);
21154 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21155 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21156 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21157
21158 m_errorMonitor->VerifyNotFound();
21159}
21160
21161// This is a positive test. No errors should be generated.
21162TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021163 TEST_DESCRIPTION(
21164 "Two command buffers, each in a separate QueueSubmit call "
21165 "submitted on separate queues, the second having a fence"
21166 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021167
Tony Barbour1fa09702017-03-16 12:09:08 -060021168 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021169 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021170
21171 m_errorMonitor->ExpectSuccess();
21172
21173 VkFence fence;
21174 VkFenceCreateInfo fence_create_info{};
21175 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21176 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21177
21178 VkSemaphore semaphore;
21179 VkSemaphoreCreateInfo semaphore_create_info{};
21180 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21181 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21182
21183 VkCommandPool command_pool;
21184 VkCommandPoolCreateInfo pool_create_info{};
21185 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21186 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21187 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21188 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21189
21190 VkCommandBuffer command_buffer[2];
21191 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21192 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21193 command_buffer_allocate_info.commandPool = command_pool;
21194 command_buffer_allocate_info.commandBufferCount = 2;
21195 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21196 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21197
21198 VkQueue queue = VK_NULL_HANDLE;
21199 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21200
21201 {
21202 VkCommandBufferBeginInfo begin_info{};
21203 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21204 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21205
21206 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 -070021207 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021208
21209 VkViewport viewport{};
21210 viewport.maxDepth = 1.0f;
21211 viewport.minDepth = 0.0f;
21212 viewport.width = 512;
21213 viewport.height = 512;
21214 viewport.x = 0;
21215 viewport.y = 0;
21216 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21217 vkEndCommandBuffer(command_buffer[0]);
21218 }
21219 {
21220 VkCommandBufferBeginInfo begin_info{};
21221 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21222 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21223
21224 VkViewport viewport{};
21225 viewport.maxDepth = 1.0f;
21226 viewport.minDepth = 0.0f;
21227 viewport.width = 512;
21228 viewport.height = 512;
21229 viewport.x = 0;
21230 viewport.y = 0;
21231 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21232 vkEndCommandBuffer(command_buffer[1]);
21233 }
21234 {
21235 VkSubmitInfo submit_info{};
21236 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21237 submit_info.commandBufferCount = 1;
21238 submit_info.pCommandBuffers = &command_buffer[0];
21239 submit_info.signalSemaphoreCount = 1;
21240 submit_info.pSignalSemaphores = &semaphore;
21241 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21242 }
21243 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021244 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021245 VkSubmitInfo submit_info{};
21246 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21247 submit_info.commandBufferCount = 1;
21248 submit_info.pCommandBuffers = &command_buffer[1];
21249 submit_info.waitSemaphoreCount = 1;
21250 submit_info.pWaitSemaphores = &semaphore;
21251 submit_info.pWaitDstStageMask = flags;
21252 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21253 }
21254
21255 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21256 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21257
21258 vkDestroyFence(m_device->device(), fence, nullptr);
21259 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21260 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21261 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21262
21263 m_errorMonitor->VerifyNotFound();
21264}
21265
21266TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Tony Barbour1fa09702017-03-16 12:09:08 -060021267 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021268 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070021269 printf(" Test requires two queues, skipping\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021270 return;
21271 }
21272
21273 VkResult err;
21274
21275 m_errorMonitor->ExpectSuccess();
21276
21277 VkQueue q0 = m_device->m_queue;
21278 VkQueue q1 = nullptr;
21279 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
21280 ASSERT_NE(q1, nullptr);
21281
21282 // An (empty) command buffer. We must have work in the first submission --
21283 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021284 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021285 VkCommandPool pool;
21286 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
21287 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021288 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
21289 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021290 VkCommandBuffer cb;
21291 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
21292 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021293 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021294 err = vkBeginCommandBuffer(cb, &cbbi);
21295 ASSERT_VK_SUCCESS(err);
21296 err = vkEndCommandBuffer(cb);
21297 ASSERT_VK_SUCCESS(err);
21298
21299 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021300 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021301 VkSemaphore s;
21302 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
21303 ASSERT_VK_SUCCESS(err);
21304
21305 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021306 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021307
21308 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
21309 ASSERT_VK_SUCCESS(err);
21310
21311 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021312 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021313 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021314
21315 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
21316 ASSERT_VK_SUCCESS(err);
21317
21318 // Wait for q0 idle
21319 err = vkQueueWaitIdle(q0);
21320 ASSERT_VK_SUCCESS(err);
21321
21322 // Command buffer should have been completed (it was on q0); reset the pool.
21323 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
21324
21325 m_errorMonitor->VerifyNotFound();
21326
21327 // Force device completely idle and clean up resources
21328 vkDeviceWaitIdle(m_device->device());
21329 vkDestroyCommandPool(m_device->device(), pool, nullptr);
21330 vkDestroySemaphore(m_device->device(), s, nullptr);
21331}
21332
21333// This is a positive test. No errors should be generated.
21334TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021335 TEST_DESCRIPTION(
21336 "Two command buffers, each in a separate QueueSubmit call "
21337 "submitted on separate queues, the second having a fence, "
21338 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021339
Tony Barbour1fa09702017-03-16 12:09:08 -060021340 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021341 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021342
21343 m_errorMonitor->ExpectSuccess();
21344
Tony Barbour1fa09702017-03-16 12:09:08 -060021345 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021346 VkFence fence;
21347 VkFenceCreateInfo fence_create_info{};
21348 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21349 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21350
21351 VkSemaphore semaphore;
21352 VkSemaphoreCreateInfo semaphore_create_info{};
21353 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21354 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21355
21356 VkCommandPool command_pool;
21357 VkCommandPoolCreateInfo pool_create_info{};
21358 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21359 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21360 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21361 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21362
21363 VkCommandBuffer command_buffer[2];
21364 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21365 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21366 command_buffer_allocate_info.commandPool = command_pool;
21367 command_buffer_allocate_info.commandBufferCount = 2;
21368 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21369 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21370
21371 VkQueue queue = VK_NULL_HANDLE;
21372 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
21373
21374 {
21375 VkCommandBufferBeginInfo begin_info{};
21376 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21377 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21378
21379 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 -070021380 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021381
21382 VkViewport viewport{};
21383 viewport.maxDepth = 1.0f;
21384 viewport.minDepth = 0.0f;
21385 viewport.width = 512;
21386 viewport.height = 512;
21387 viewport.x = 0;
21388 viewport.y = 0;
21389 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21390 vkEndCommandBuffer(command_buffer[0]);
21391 }
21392 {
21393 VkCommandBufferBeginInfo begin_info{};
21394 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21395 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21396
21397 VkViewport viewport{};
21398 viewport.maxDepth = 1.0f;
21399 viewport.minDepth = 0.0f;
21400 viewport.width = 512;
21401 viewport.height = 512;
21402 viewport.x = 0;
21403 viewport.y = 0;
21404 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21405 vkEndCommandBuffer(command_buffer[1]);
21406 }
21407 {
21408 VkSubmitInfo submit_info{};
21409 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21410 submit_info.commandBufferCount = 1;
21411 submit_info.pCommandBuffers = &command_buffer[0];
21412 submit_info.signalSemaphoreCount = 1;
21413 submit_info.pSignalSemaphores = &semaphore;
21414 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21415 }
21416 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021417 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021418 VkSubmitInfo submit_info{};
21419 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21420 submit_info.commandBufferCount = 1;
21421 submit_info.pCommandBuffers = &command_buffer[1];
21422 submit_info.waitSemaphoreCount = 1;
21423 submit_info.pWaitSemaphores = &semaphore;
21424 submit_info.pWaitDstStageMask = flags;
21425 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21426 }
21427
21428 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21429
21430 vkDestroyFence(m_device->device(), fence, nullptr);
21431 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21432 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21433 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21434
21435 m_errorMonitor->VerifyNotFound();
21436}
21437
21438// This is a positive test. No errors should be generated.
21439TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021440 TEST_DESCRIPTION(
21441 "Two command buffers, each in a separate QueueSubmit call "
21442 "on the same queue, sharing a signal/wait semaphore, the "
21443 "second having a fence, "
21444 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021445
21446 m_errorMonitor->ExpectSuccess();
21447
Tony Barbour1fa09702017-03-16 12:09:08 -060021448 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021449 VkFence fence;
21450 VkFenceCreateInfo fence_create_info{};
21451 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21452 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21453
21454 VkSemaphore semaphore;
21455 VkSemaphoreCreateInfo semaphore_create_info{};
21456 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21457 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21458
21459 VkCommandPool command_pool;
21460 VkCommandPoolCreateInfo pool_create_info{};
21461 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21462 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21463 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21464 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21465
21466 VkCommandBuffer command_buffer[2];
21467 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21468 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21469 command_buffer_allocate_info.commandPool = command_pool;
21470 command_buffer_allocate_info.commandBufferCount = 2;
21471 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21472 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21473
21474 {
21475 VkCommandBufferBeginInfo begin_info{};
21476 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21477 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21478
21479 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 -070021480 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021481
21482 VkViewport viewport{};
21483 viewport.maxDepth = 1.0f;
21484 viewport.minDepth = 0.0f;
21485 viewport.width = 512;
21486 viewport.height = 512;
21487 viewport.x = 0;
21488 viewport.y = 0;
21489 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21490 vkEndCommandBuffer(command_buffer[0]);
21491 }
21492 {
21493 VkCommandBufferBeginInfo begin_info{};
21494 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21495 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21496
21497 VkViewport viewport{};
21498 viewport.maxDepth = 1.0f;
21499 viewport.minDepth = 0.0f;
21500 viewport.width = 512;
21501 viewport.height = 512;
21502 viewport.x = 0;
21503 viewport.y = 0;
21504 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21505 vkEndCommandBuffer(command_buffer[1]);
21506 }
21507 {
21508 VkSubmitInfo submit_info{};
21509 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21510 submit_info.commandBufferCount = 1;
21511 submit_info.pCommandBuffers = &command_buffer[0];
21512 submit_info.signalSemaphoreCount = 1;
21513 submit_info.pSignalSemaphores = &semaphore;
21514 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21515 }
21516 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021517 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021518 VkSubmitInfo submit_info{};
21519 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21520 submit_info.commandBufferCount = 1;
21521 submit_info.pCommandBuffers = &command_buffer[1];
21522 submit_info.waitSemaphoreCount = 1;
21523 submit_info.pWaitSemaphores = &semaphore;
21524 submit_info.pWaitDstStageMask = flags;
21525 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21526 }
21527
21528 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21529
21530 vkDestroyFence(m_device->device(), fence, nullptr);
21531 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21532 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21533 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21534
21535 m_errorMonitor->VerifyNotFound();
21536}
21537
21538// This is a positive test. No errors should be generated.
21539TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021540 TEST_DESCRIPTION(
21541 "Two command buffers, each in a separate QueueSubmit call "
21542 "on the same queue, no fences, followed by a third QueueSubmit with NO "
21543 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021544
21545 m_errorMonitor->ExpectSuccess();
21546
Tony Barbour1fa09702017-03-16 12:09:08 -060021547 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021548 VkFence fence;
21549 VkFenceCreateInfo fence_create_info{};
21550 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21551 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21552
21553 VkCommandPool command_pool;
21554 VkCommandPoolCreateInfo pool_create_info{};
21555 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21556 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21557 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21558 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21559
21560 VkCommandBuffer command_buffer[2];
21561 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21562 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21563 command_buffer_allocate_info.commandPool = command_pool;
21564 command_buffer_allocate_info.commandBufferCount = 2;
21565 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21566 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21567
21568 {
21569 VkCommandBufferBeginInfo begin_info{};
21570 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21571 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21572
21573 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 -070021574 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021575
21576 VkViewport viewport{};
21577 viewport.maxDepth = 1.0f;
21578 viewport.minDepth = 0.0f;
21579 viewport.width = 512;
21580 viewport.height = 512;
21581 viewport.x = 0;
21582 viewport.y = 0;
21583 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21584 vkEndCommandBuffer(command_buffer[0]);
21585 }
21586 {
21587 VkCommandBufferBeginInfo begin_info{};
21588 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21589 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21590
21591 VkViewport viewport{};
21592 viewport.maxDepth = 1.0f;
21593 viewport.minDepth = 0.0f;
21594 viewport.width = 512;
21595 viewport.height = 512;
21596 viewport.x = 0;
21597 viewport.y = 0;
21598 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21599 vkEndCommandBuffer(command_buffer[1]);
21600 }
21601 {
21602 VkSubmitInfo submit_info{};
21603 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21604 submit_info.commandBufferCount = 1;
21605 submit_info.pCommandBuffers = &command_buffer[0];
21606 submit_info.signalSemaphoreCount = 0;
21607 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21608 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21609 }
21610 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021611 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021612 VkSubmitInfo submit_info{};
21613 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21614 submit_info.commandBufferCount = 1;
21615 submit_info.pCommandBuffers = &command_buffer[1];
21616 submit_info.waitSemaphoreCount = 0;
21617 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21618 submit_info.pWaitDstStageMask = flags;
21619 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21620 }
21621
21622 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
21623
21624 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21625 ASSERT_VK_SUCCESS(err);
21626
21627 vkDestroyFence(m_device->device(), fence, nullptr);
21628 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21629 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21630
21631 m_errorMonitor->VerifyNotFound();
21632}
21633
21634// This is a positive test. No errors should be generated.
21635TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021636 TEST_DESCRIPTION(
21637 "Two command buffers, each in a separate QueueSubmit call "
21638 "on the same queue, the second having a fence, followed "
21639 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021640
21641 m_errorMonitor->ExpectSuccess();
21642
Tony Barbour1fa09702017-03-16 12:09:08 -060021643 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021644 VkFence fence;
21645 VkFenceCreateInfo fence_create_info{};
21646 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21647 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21648
21649 VkCommandPool command_pool;
21650 VkCommandPoolCreateInfo pool_create_info{};
21651 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21652 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21653 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21654 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21655
21656 VkCommandBuffer command_buffer[2];
21657 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21658 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21659 command_buffer_allocate_info.commandPool = command_pool;
21660 command_buffer_allocate_info.commandBufferCount = 2;
21661 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21662 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21663
21664 {
21665 VkCommandBufferBeginInfo begin_info{};
21666 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21667 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21668
21669 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 -070021670 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021671
21672 VkViewport viewport{};
21673 viewport.maxDepth = 1.0f;
21674 viewport.minDepth = 0.0f;
21675 viewport.width = 512;
21676 viewport.height = 512;
21677 viewport.x = 0;
21678 viewport.y = 0;
21679 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21680 vkEndCommandBuffer(command_buffer[0]);
21681 }
21682 {
21683 VkCommandBufferBeginInfo begin_info{};
21684 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21685 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21686
21687 VkViewport viewport{};
21688 viewport.maxDepth = 1.0f;
21689 viewport.minDepth = 0.0f;
21690 viewport.width = 512;
21691 viewport.height = 512;
21692 viewport.x = 0;
21693 viewport.y = 0;
21694 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21695 vkEndCommandBuffer(command_buffer[1]);
21696 }
21697 {
21698 VkSubmitInfo submit_info{};
21699 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21700 submit_info.commandBufferCount = 1;
21701 submit_info.pCommandBuffers = &command_buffer[0];
21702 submit_info.signalSemaphoreCount = 0;
21703 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21704 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21705 }
21706 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021707 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021708 VkSubmitInfo submit_info{};
21709 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21710 submit_info.commandBufferCount = 1;
21711 submit_info.pCommandBuffers = &command_buffer[1];
21712 submit_info.waitSemaphoreCount = 0;
21713 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21714 submit_info.pWaitDstStageMask = flags;
21715 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21716 }
21717
21718 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21719
21720 vkDestroyFence(m_device->device(), fence, nullptr);
21721 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21722 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21723
21724 m_errorMonitor->VerifyNotFound();
21725}
21726
21727// This is a positive test. No errors should be generated.
21728TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021729 TEST_DESCRIPTION(
21730 "Two command buffers each in a separate SubmitInfo sent in a single "
21731 "QueueSubmit call followed by a WaitForFences call.");
Tony Barbour1fa09702017-03-16 12:09:08 -060021732 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021733
21734 m_errorMonitor->ExpectSuccess();
21735
21736 VkFence fence;
21737 VkFenceCreateInfo fence_create_info{};
21738 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21739 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21740
21741 VkSemaphore semaphore;
21742 VkSemaphoreCreateInfo semaphore_create_info{};
21743 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21744 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21745
21746 VkCommandPool command_pool;
21747 VkCommandPoolCreateInfo pool_create_info{};
21748 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21749 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21750 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21751 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21752
21753 VkCommandBuffer command_buffer[2];
21754 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21755 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21756 command_buffer_allocate_info.commandPool = command_pool;
21757 command_buffer_allocate_info.commandBufferCount = 2;
21758 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21759 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21760
21761 {
21762 VkCommandBufferBeginInfo begin_info{};
21763 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21764 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21765
21766 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 -070021767 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021768
21769 VkViewport viewport{};
21770 viewport.maxDepth = 1.0f;
21771 viewport.minDepth = 0.0f;
21772 viewport.width = 512;
21773 viewport.height = 512;
21774 viewport.x = 0;
21775 viewport.y = 0;
21776 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21777 vkEndCommandBuffer(command_buffer[0]);
21778 }
21779 {
21780 VkCommandBufferBeginInfo begin_info{};
21781 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21782 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21783
21784 VkViewport viewport{};
21785 viewport.maxDepth = 1.0f;
21786 viewport.minDepth = 0.0f;
21787 viewport.width = 512;
21788 viewport.height = 512;
21789 viewport.x = 0;
21790 viewport.y = 0;
21791 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21792 vkEndCommandBuffer(command_buffer[1]);
21793 }
21794 {
21795 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021796 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021797
21798 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21799 submit_info[0].pNext = NULL;
21800 submit_info[0].commandBufferCount = 1;
21801 submit_info[0].pCommandBuffers = &command_buffer[0];
21802 submit_info[0].signalSemaphoreCount = 1;
21803 submit_info[0].pSignalSemaphores = &semaphore;
21804 submit_info[0].waitSemaphoreCount = 0;
21805 submit_info[0].pWaitSemaphores = NULL;
21806 submit_info[0].pWaitDstStageMask = 0;
21807
21808 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21809 submit_info[1].pNext = NULL;
21810 submit_info[1].commandBufferCount = 1;
21811 submit_info[1].pCommandBuffers = &command_buffer[1];
21812 submit_info[1].waitSemaphoreCount = 1;
21813 submit_info[1].pWaitSemaphores = &semaphore;
21814 submit_info[1].pWaitDstStageMask = flags;
21815 submit_info[1].signalSemaphoreCount = 0;
21816 submit_info[1].pSignalSemaphores = NULL;
21817 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
21818 }
21819
21820 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21821
21822 vkDestroyFence(m_device->device(), fence, nullptr);
21823 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21824 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21825 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21826
21827 m_errorMonitor->VerifyNotFound();
21828}
21829
21830TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
21831 m_errorMonitor->ExpectSuccess();
21832
Tony Barbour1fa09702017-03-16 12:09:08 -060021833 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021834 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21835
Tony Barbour552f6c02016-12-21 14:34:07 -070021836 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021837
21838 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
21839 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
21840 m_errorMonitor->VerifyNotFound();
21841 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
21842 m_errorMonitor->VerifyNotFound();
21843 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
21844 m_errorMonitor->VerifyNotFound();
21845
21846 m_commandBuffer->EndCommandBuffer();
21847 m_errorMonitor->VerifyNotFound();
21848}
21849
21850TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021851 TEST_DESCRIPTION(
21852 "Positive test where we create a renderpass with an "
21853 "attachment that uses LOAD_OP_CLEAR, the first subpass "
21854 "has a valid layout, and a second subpass then uses a "
21855 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021856 m_errorMonitor->ExpectSuccess();
Tony Barbour1fa09702017-03-16 12:09:08 -060021857 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070021858 auto depth_format = find_depth_stencil_format(m_device);
21859 if (!depth_format) {
21860 printf(" No Depth + Stencil format found. Skipped.\n");
21861 return;
21862 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021863
21864 VkAttachmentReference attach[2] = {};
21865 attach[0].attachment = 0;
21866 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21867 attach[1].attachment = 0;
21868 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
21869 VkSubpassDescription subpasses[2] = {};
21870 // First subpass clears DS attach on load
21871 subpasses[0].pDepthStencilAttachment = &attach[0];
21872 // 2nd subpass reads in DS as input attachment
21873 subpasses[1].inputAttachmentCount = 1;
21874 subpasses[1].pInputAttachments = &attach[1];
21875 VkAttachmentDescription attach_desc = {};
Tony Barbourf887b162017-03-09 10:06:46 -070021876 attach_desc.format = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021877 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
21878 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
21879 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
21880 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21881 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21882 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21883 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
21884 VkRenderPassCreateInfo rpci = {};
21885 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
21886 rpci.attachmentCount = 1;
21887 rpci.pAttachments = &attach_desc;
21888 rpci.subpassCount = 2;
21889 rpci.pSubpasses = subpasses;
21890
21891 // Now create RenderPass and verify no errors
21892 VkRenderPass rp;
21893 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
21894 m_errorMonitor->VerifyNotFound();
21895
21896 vkDestroyRenderPass(m_device->device(), rp, NULL);
21897}
21898
Tobin Ehlis01103de2017-02-16 13:22:47 -070021899TEST_F(VkPositiveLayerTest, RenderPassDepthStencilLayoutTransition) {
21900 TEST_DESCRIPTION(
21901 "Create a render pass with depth-stencil attachment where layout transition "
21902 "from UNDEFINED TO DS_READ_ONLY_OPTIMAL is set by render pass and verify that "
21903 "transition has correctly occurred at queue submit time with no validation errors.");
21904
Tony Barbour1fa09702017-03-16 12:09:08 -060021905 ASSERT_NO_FATAL_FAILURE(Init());
Tony Barbourf887b162017-03-09 10:06:46 -070021906 auto depth_format = find_depth_stencil_format(m_device);
21907 if (!depth_format) {
21908 printf(" No Depth + Stencil format found. Skipped.\n");
21909 return;
21910 }
Tobin Ehlis01103de2017-02-16 13:22:47 -070021911 VkImageFormatProperties format_props;
Tony Barbourf887b162017-03-09 10:06:46 -070021912 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021913 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &format_props);
21914 if (format_props.maxExtent.width < 32 || format_props.maxExtent.height < 32) {
Tony Barbourf887b162017-03-09 10:06:46 -070021915 printf("Depth extent too small, RenderPassDepthStencilLayoutTransition skipped.\n");
Tobin Ehlis01103de2017-02-16 13:22:47 -070021916 return;
21917 }
21918
21919 m_errorMonitor->ExpectSuccess();
Tobin Ehlis01103de2017-02-16 13:22:47 -070021920 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21921
21922 // A renderpass with one depth/stencil attachment.
21923 VkAttachmentDescription attachment = {0,
Tony Barbourf887b162017-03-09 10:06:46 -070021924 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021925 VK_SAMPLE_COUNT_1_BIT,
21926 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21927 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21928 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21929 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21930 VK_IMAGE_LAYOUT_UNDEFINED,
21931 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
21932
21933 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
21934
21935 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
21936
21937 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
21938
21939 VkRenderPass rp;
21940 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21941 ASSERT_VK_SUCCESS(err);
21942 // A compatible ds image.
21943 VkImageObj image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -070021944 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 -070021945 ASSERT_TRUE(image.initialized());
21946
21947 VkImageViewCreateInfo ivci = {
21948 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21949 nullptr,
21950 0,
21951 image.handle(),
21952 VK_IMAGE_VIEW_TYPE_2D,
Tony Barbourf887b162017-03-09 10:06:46 -070021953 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021954 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
21955 VK_COMPONENT_SWIZZLE_IDENTITY},
21956 {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1},
21957 };
21958 VkImageView view;
21959 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21960 ASSERT_VK_SUCCESS(err);
21961
21962 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
21963 VkFramebuffer fb;
21964 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21965 ASSERT_VK_SUCCESS(err);
21966
21967 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
21968 m_commandBuffer->BeginCommandBuffer();
21969 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21970 vkCmdEndRenderPass(m_commandBuffer->handle());
21971 m_commandBuffer->EndCommandBuffer();
21972 QueueCommandBuffer(false);
21973 m_errorMonitor->VerifyNotFound();
21974
21975 // Cleanup
21976 vkDestroyImageView(m_device->device(), view, NULL);
21977 vkDestroyRenderPass(m_device->device(), rp, NULL);
21978 vkDestroyFramebuffer(m_device->device(), fb, NULL);
21979}
21980
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021981TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021982 TEST_DESCRIPTION(
21983 "Test that pipeline validation accepts matrices passed "
21984 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021985 m_errorMonitor->ExpectSuccess();
21986
Tony Barbour1fa09702017-03-16 12:09:08 -060021987 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021988 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21989
21990 VkVertexInputBindingDescription input_binding;
21991 memset(&input_binding, 0, sizeof(input_binding));
21992
21993 VkVertexInputAttributeDescription input_attribs[2];
21994 memset(input_attribs, 0, sizeof(input_attribs));
21995
21996 for (int i = 0; i < 2; i++) {
21997 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
21998 input_attribs[i].location = i;
21999 }
22000
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022001 char const *vsSource =
22002 "#version 450\n"
22003 "\n"
22004 "layout(location=0) in mat2x4 x;\n"
22005 "out gl_PerVertex {\n"
22006 " vec4 gl_Position;\n"
22007 "};\n"
22008 "void main(){\n"
22009 " gl_Position = x[0] + x[1];\n"
22010 "}\n";
22011 char const *fsSource =
22012 "#version 450\n"
22013 "\n"
22014 "layout(location=0) out vec4 color;\n"
22015 "void main(){\n"
22016 " color = vec4(1);\n"
22017 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022018
22019 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22020 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22021
22022 VkPipelineObj pipe(m_device);
22023 pipe.AddColorAttachment();
22024 pipe.AddShader(&vs);
22025 pipe.AddShader(&fs);
22026
22027 pipe.AddVertexInputBindings(&input_binding, 1);
22028 pipe.AddVertexInputAttribs(input_attribs, 2);
22029
22030 VkDescriptorSetObj descriptorSet(m_device);
22031 descriptorSet.AppendDummy();
22032 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22033
22034 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22035
22036 /* expect success */
22037 m_errorMonitor->VerifyNotFound();
22038}
22039
22040TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
22041 m_errorMonitor->ExpectSuccess();
22042
Tony Barbour1fa09702017-03-16 12:09:08 -060022043 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022044 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22045
22046 VkVertexInputBindingDescription input_binding;
22047 memset(&input_binding, 0, sizeof(input_binding));
22048
22049 VkVertexInputAttributeDescription input_attribs[2];
22050 memset(input_attribs, 0, sizeof(input_attribs));
22051
22052 for (int i = 0; i < 2; i++) {
22053 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22054 input_attribs[i].location = i;
22055 }
22056
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022057 char const *vsSource =
22058 "#version 450\n"
22059 "\n"
22060 "layout(location=0) in vec4 x[2];\n"
22061 "out gl_PerVertex {\n"
22062 " vec4 gl_Position;\n"
22063 "};\n"
22064 "void main(){\n"
22065 " gl_Position = x[0] + x[1];\n"
22066 "}\n";
22067 char const *fsSource =
22068 "#version 450\n"
22069 "\n"
22070 "layout(location=0) out vec4 color;\n"
22071 "void main(){\n"
22072 " color = vec4(1);\n"
22073 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022074
22075 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22076 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22077
22078 VkPipelineObj pipe(m_device);
22079 pipe.AddColorAttachment();
22080 pipe.AddShader(&vs);
22081 pipe.AddShader(&fs);
22082
22083 pipe.AddVertexInputBindings(&input_binding, 1);
22084 pipe.AddVertexInputAttribs(input_attribs, 2);
22085
22086 VkDescriptorSetObj descriptorSet(m_device);
22087 descriptorSet.AppendDummy();
22088 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22089
22090 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22091
22092 m_errorMonitor->VerifyNotFound();
22093}
22094
22095TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022096 TEST_DESCRIPTION(
22097 "Test that pipeline validation accepts consuming a vertex attribute "
22098 "through multiple vertex shader inputs, each consuming a different "
22099 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022100 m_errorMonitor->ExpectSuccess();
22101
Tony Barbour1fa09702017-03-16 12:09:08 -060022102 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022103 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22104
22105 VkVertexInputBindingDescription input_binding;
22106 memset(&input_binding, 0, sizeof(input_binding));
22107
22108 VkVertexInputAttributeDescription input_attribs[3];
22109 memset(input_attribs, 0, sizeof(input_attribs));
22110
22111 for (int i = 0; i < 3; i++) {
22112 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
22113 input_attribs[i].location = i;
22114 }
22115
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022116 char const *vsSource =
22117 "#version 450\n"
22118 "\n"
22119 "layout(location=0) in vec4 x;\n"
22120 "layout(location=1) in vec3 y1;\n"
22121 "layout(location=1, component=3) in float y2;\n"
22122 "layout(location=2) in vec4 z;\n"
22123 "out gl_PerVertex {\n"
22124 " vec4 gl_Position;\n"
22125 "};\n"
22126 "void main(){\n"
22127 " gl_Position = x + vec4(y1, y2) + z;\n"
22128 "}\n";
22129 char const *fsSource =
22130 "#version 450\n"
22131 "\n"
22132 "layout(location=0) out vec4 color;\n"
22133 "void main(){\n"
22134 " color = vec4(1);\n"
22135 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022136
22137 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22138 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22139
22140 VkPipelineObj pipe(m_device);
22141 pipe.AddColorAttachment();
22142 pipe.AddShader(&vs);
22143 pipe.AddShader(&fs);
22144
22145 pipe.AddVertexInputBindings(&input_binding, 1);
22146 pipe.AddVertexInputAttribs(input_attribs, 3);
22147
22148 VkDescriptorSetObj descriptorSet(m_device);
22149 descriptorSet.AppendDummy();
22150 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22151
22152 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22153
22154 m_errorMonitor->VerifyNotFound();
22155}
22156
22157TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
22158 m_errorMonitor->ExpectSuccess();
22159
Tony Barbour1fa09702017-03-16 12:09:08 -060022160 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022161 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22162
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022163 char const *vsSource =
22164 "#version 450\n"
22165 "out gl_PerVertex {\n"
22166 " vec4 gl_Position;\n"
22167 "};\n"
22168 "void main(){\n"
22169 " gl_Position = vec4(0);\n"
22170 "}\n";
22171 char const *fsSource =
22172 "#version 450\n"
22173 "\n"
22174 "layout(location=0) out vec4 color;\n"
22175 "void main(){\n"
22176 " color = vec4(1);\n"
22177 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022178
22179 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22180 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22181
22182 VkPipelineObj pipe(m_device);
22183 pipe.AddColorAttachment();
22184 pipe.AddShader(&vs);
22185 pipe.AddShader(&fs);
22186
22187 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, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022197 TEST_DESCRIPTION(
22198 "Test that pipeline validation accepts the relaxed type matching rules "
22199 "set out in 14.1.3: fundamental type must match, and producer side must "
22200 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022201 m_errorMonitor->ExpectSuccess();
22202
22203 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
22204
Tony Barbour1fa09702017-03-16 12:09:08 -060022205 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022206 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22207
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022208 char const *vsSource =
22209 "#version 450\n"
22210 "out gl_PerVertex {\n"
22211 " vec4 gl_Position;\n"
22212 "};\n"
22213 "layout(location=0) out vec3 x;\n"
22214 "layout(location=1) out ivec3 y;\n"
22215 "layout(location=2) out vec3 z;\n"
22216 "void main(){\n"
22217 " gl_Position = vec4(0);\n"
22218 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
22219 "}\n";
22220 char const *fsSource =
22221 "#version 450\n"
22222 "\n"
22223 "layout(location=0) out vec4 color;\n"
22224 "layout(location=0) in float x;\n"
22225 "layout(location=1) flat in int y;\n"
22226 "layout(location=2) in vec2 z;\n"
22227 "void main(){\n"
22228 " color = vec4(1 + x + y + z.x);\n"
22229 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022230
22231 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22232 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22233
22234 VkPipelineObj pipe(m_device);
22235 pipe.AddColorAttachment();
22236 pipe.AddShader(&vs);
22237 pipe.AddShader(&fs);
22238
22239 VkDescriptorSetObj descriptorSet(m_device);
22240 descriptorSet.AppendDummy();
22241 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22242
22243 VkResult err = VK_SUCCESS;
22244 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22245 ASSERT_VK_SUCCESS(err);
22246
22247 m_errorMonitor->VerifyNotFound();
22248}
22249
22250TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022251 TEST_DESCRIPTION(
22252 "Test that pipeline validation accepts per-vertex variables "
22253 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022254 m_errorMonitor->ExpectSuccess();
22255
Tony Barbour1fa09702017-03-16 12:09:08 -060022256 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022257 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22258
22259 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022260 printf(" Device does not support tessellation shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022261 return;
22262 }
22263
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022264 char const *vsSource =
22265 "#version 450\n"
22266 "void main(){}\n";
22267 char const *tcsSource =
22268 "#version 450\n"
22269 "layout(location=0) out int x[];\n"
22270 "layout(vertices=3) out;\n"
22271 "void main(){\n"
22272 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
22273 " gl_TessLevelInner[0] = 1;\n"
22274 " x[gl_InvocationID] = gl_InvocationID;\n"
22275 "}\n";
22276 char const *tesSource =
22277 "#version 450\n"
22278 "layout(triangles, equal_spacing, cw) in;\n"
22279 "layout(location=0) in int x[];\n"
22280 "out gl_PerVertex { vec4 gl_Position; };\n"
22281 "void main(){\n"
22282 " gl_Position.xyz = gl_TessCoord;\n"
22283 " gl_Position.w = x[0] + x[1] + x[2];\n"
22284 "}\n";
22285 char const *fsSource =
22286 "#version 450\n"
22287 "layout(location=0) out vec4 color;\n"
22288 "void main(){\n"
22289 " color = vec4(1);\n"
22290 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022291
22292 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22293 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
22294 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
22295 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22296
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022297 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
22298 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022299
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022300 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022301
22302 VkPipelineObj pipe(m_device);
22303 pipe.SetInputAssembly(&iasci);
22304 pipe.SetTessellation(&tsci);
22305 pipe.AddColorAttachment();
22306 pipe.AddShader(&vs);
22307 pipe.AddShader(&tcs);
22308 pipe.AddShader(&tes);
22309 pipe.AddShader(&fs);
22310
22311 VkDescriptorSetObj descriptorSet(m_device);
22312 descriptorSet.AppendDummy();
22313 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22314
22315 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22316
22317 m_errorMonitor->VerifyNotFound();
22318}
22319
22320TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022321 TEST_DESCRIPTION(
22322 "Test that pipeline validation accepts a user-defined "
22323 "interface block passed into the geometry shader. This "
22324 "is interesting because the 'extra' array level is not "
22325 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022326 m_errorMonitor->ExpectSuccess();
22327
Tony Barbour1fa09702017-03-16 12:09:08 -060022328 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022329 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22330
22331 if (!m_device->phy().features().geometryShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022332 printf(" Device does not support geometry shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022333 return;
22334 }
22335
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022336 char const *vsSource =
22337 "#version 450\n"
22338 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
22339 "void main(){\n"
22340 " vs_out.x = vec4(1);\n"
22341 "}\n";
22342 char const *gsSource =
22343 "#version 450\n"
22344 "layout(triangles) in;\n"
22345 "layout(triangle_strip, max_vertices=3) out;\n"
22346 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
22347 "out gl_PerVertex { vec4 gl_Position; };\n"
22348 "void main() {\n"
22349 " gl_Position = gs_in[0].x;\n"
22350 " EmitVertex();\n"
22351 "}\n";
22352 char const *fsSource =
22353 "#version 450\n"
22354 "layout(location=0) out vec4 color;\n"
22355 "void main(){\n"
22356 " color = vec4(1);\n"
22357 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022358
22359 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22360 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
22361 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22362
22363 VkPipelineObj pipe(m_device);
22364 pipe.AddColorAttachment();
22365 pipe.AddShader(&vs);
22366 pipe.AddShader(&gs);
22367 pipe.AddShader(&fs);
22368
22369 VkDescriptorSetObj descriptorSet(m_device);
22370 descriptorSet.AppendDummy();
22371 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22372
22373 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22374
22375 m_errorMonitor->VerifyNotFound();
22376}
22377
22378TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022379 TEST_DESCRIPTION(
22380 "Test that pipeline validation accepts basic use of 64bit vertex "
22381 "attributes. This is interesting because they consume multiple "
22382 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022383 m_errorMonitor->ExpectSuccess();
22384
Tony Barbour1fa09702017-03-16 12:09:08 -060022385 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022386 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22387
22388 if (!m_device->phy().features().shaderFloat64) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070022389 printf(" Device does not support 64bit vertex attributes; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022390 return;
22391 }
22392
22393 VkVertexInputBindingDescription input_bindings[1];
22394 memset(input_bindings, 0, sizeof(input_bindings));
22395
22396 VkVertexInputAttributeDescription input_attribs[4];
22397 memset(input_attribs, 0, sizeof(input_attribs));
22398 input_attribs[0].location = 0;
22399 input_attribs[0].offset = 0;
22400 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22401 input_attribs[1].location = 2;
22402 input_attribs[1].offset = 32;
22403 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22404 input_attribs[2].location = 4;
22405 input_attribs[2].offset = 64;
22406 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22407 input_attribs[3].location = 6;
22408 input_attribs[3].offset = 96;
22409 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22410
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022411 char const *vsSource =
22412 "#version 450\n"
22413 "\n"
22414 "layout(location=0) in dmat4 x;\n"
22415 "out gl_PerVertex {\n"
22416 " vec4 gl_Position;\n"
22417 "};\n"
22418 "void main(){\n"
22419 " gl_Position = vec4(x[0][0]);\n"
22420 "}\n";
22421 char const *fsSource =
22422 "#version 450\n"
22423 "\n"
22424 "layout(location=0) out vec4 color;\n"
22425 "void main(){\n"
22426 " color = vec4(1);\n"
22427 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022428
22429 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22430 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22431
22432 VkPipelineObj pipe(m_device);
22433 pipe.AddColorAttachment();
22434 pipe.AddShader(&vs);
22435 pipe.AddShader(&fs);
22436
22437 pipe.AddVertexInputBindings(input_bindings, 1);
22438 pipe.AddVertexInputAttribs(input_attribs, 4);
22439
22440 VkDescriptorSetObj descriptorSet(m_device);
22441 descriptorSet.AppendDummy();
22442 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22443
22444 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22445
22446 m_errorMonitor->VerifyNotFound();
22447}
22448
22449TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
22450 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
22451 m_errorMonitor->ExpectSuccess();
22452
Tony Barbour1fa09702017-03-16 12:09:08 -060022453 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022454
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022455 char const *vsSource =
22456 "#version 450\n"
22457 "\n"
22458 "out gl_PerVertex {\n"
22459 " vec4 gl_Position;\n"
22460 "};\n"
22461 "void main(){\n"
22462 " gl_Position = vec4(1);\n"
22463 "}\n";
22464 char const *fsSource =
22465 "#version 450\n"
22466 "\n"
22467 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
22468 "layout(location=0) out vec4 color;\n"
22469 "void main() {\n"
22470 " color = subpassLoad(x);\n"
22471 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022472
22473 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22474 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22475
22476 VkPipelineObj pipe(m_device);
22477 pipe.AddShader(&vs);
22478 pipe.AddShader(&fs);
22479 pipe.AddColorAttachment();
22480 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22481
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022482 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
22483 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022484 VkDescriptorSetLayout dsl;
22485 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22486 ASSERT_VK_SUCCESS(err);
22487
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022488 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022489 VkPipelineLayout pl;
22490 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22491 ASSERT_VK_SUCCESS(err);
22492
22493 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022494 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22495 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22496 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
22497 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22498 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 -060022499 };
22500 VkAttachmentReference color = {
22501 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22502 };
22503 VkAttachmentReference input = {
22504 1, VK_IMAGE_LAYOUT_GENERAL,
22505 };
22506
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022507 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022508
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022509 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022510 VkRenderPass rp;
22511 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22512 ASSERT_VK_SUCCESS(err);
22513
22514 // should be OK. would go wrong here if it's going to...
22515 pipe.CreateVKPipeline(pl, rp);
22516
22517 m_errorMonitor->VerifyNotFound();
22518
22519 vkDestroyRenderPass(m_device->device(), rp, nullptr);
22520 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22521 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22522}
22523
22524TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022525 TEST_DESCRIPTION(
22526 "Test that pipeline validation accepts a compute pipeline which declares a "
22527 "descriptor-backed resource which is not provided, but the shader does not "
22528 "statically use it. This is interesting because it requires compute pipelines "
22529 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022530 m_errorMonitor->ExpectSuccess();
22531
Tony Barbour1fa09702017-03-16 12:09:08 -060022532 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022533
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022534 char const *csSource =
22535 "#version 450\n"
22536 "\n"
22537 "layout(local_size_x=1) in;\n"
22538 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
22539 "void main(){\n"
22540 " // x is not used.\n"
22541 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022542
22543 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22544
22545 VkDescriptorSetObj descriptorSet(m_device);
22546 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22547
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022548 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22549 nullptr,
22550 0,
22551 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22552 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22553 descriptorSet.GetPipelineLayout(),
22554 VK_NULL_HANDLE,
22555 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022556
22557 VkPipeline pipe;
22558 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22559
22560 m_errorMonitor->VerifyNotFound();
22561
22562 if (err == VK_SUCCESS) {
22563 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22564 }
22565}
22566
22567TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022568 TEST_DESCRIPTION(
22569 "Test that pipeline validation accepts a shader consuming only the "
22570 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022571 m_errorMonitor->ExpectSuccess();
22572
Tony Barbour1fa09702017-03-16 12:09:08 -060022573 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022574
22575 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022576 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22577 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22578 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022579 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022580 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022581 VkDescriptorSetLayout dsl;
22582 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22583 ASSERT_VK_SUCCESS(err);
22584
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022585 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022586 VkPipelineLayout pl;
22587 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22588 ASSERT_VK_SUCCESS(err);
22589
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022590 char const *csSource =
22591 "#version 450\n"
22592 "\n"
22593 "layout(local_size_x=1) in;\n"
22594 "layout(set=0, binding=0) uniform sampler s;\n"
22595 "layout(set=0, binding=1) uniform texture2D t;\n"
22596 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22597 "void main() {\n"
22598 " x = texture(sampler2D(t, s), vec2(0));\n"
22599 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022600 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22601
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022602 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22603 nullptr,
22604 0,
22605 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22606 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22607 pl,
22608 VK_NULL_HANDLE,
22609 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022610
22611 VkPipeline pipe;
22612 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22613
22614 m_errorMonitor->VerifyNotFound();
22615
22616 if (err == VK_SUCCESS) {
22617 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22618 }
22619
22620 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22621 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22622}
22623
22624TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022625 TEST_DESCRIPTION(
22626 "Test that pipeline validation accepts a shader consuming only the "
22627 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022628 m_errorMonitor->ExpectSuccess();
22629
Tony Barbour1fa09702017-03-16 12:09:08 -060022630 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022631
22632 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022633 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22634 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22635 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022636 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022637 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022638 VkDescriptorSetLayout dsl;
22639 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22640 ASSERT_VK_SUCCESS(err);
22641
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022642 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022643 VkPipelineLayout pl;
22644 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22645 ASSERT_VK_SUCCESS(err);
22646
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022647 char const *csSource =
22648 "#version 450\n"
22649 "\n"
22650 "layout(local_size_x=1) in;\n"
22651 "layout(set=0, binding=0) uniform texture2D t;\n"
22652 "layout(set=0, binding=1) uniform sampler s;\n"
22653 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22654 "void main() {\n"
22655 " x = texture(sampler2D(t, s), vec2(0));\n"
22656 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022657 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22658
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022659 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22660 nullptr,
22661 0,
22662 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22663 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22664 pl,
22665 VK_NULL_HANDLE,
22666 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022667
22668 VkPipeline pipe;
22669 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22670
22671 m_errorMonitor->VerifyNotFound();
22672
22673 if (err == VK_SUCCESS) {
22674 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22675 }
22676
22677 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22678 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22679}
22680
22681TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022682 TEST_DESCRIPTION(
22683 "Test that pipeline validation accepts a shader consuming "
22684 "both the sampler and the image of a combined image+sampler "
22685 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022686 m_errorMonitor->ExpectSuccess();
22687
Tony Barbour1fa09702017-03-16 12:09:08 -060022688 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022689
22690 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022691 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22692 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022693 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022694 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022695 VkDescriptorSetLayout dsl;
22696 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22697 ASSERT_VK_SUCCESS(err);
22698
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022699 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022700 VkPipelineLayout pl;
22701 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22702 ASSERT_VK_SUCCESS(err);
22703
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022704 char const *csSource =
22705 "#version 450\n"
22706 "\n"
22707 "layout(local_size_x=1) in;\n"
22708 "layout(set=0, binding=0) uniform texture2D t;\n"
22709 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
22710 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
22711 "void main() {\n"
22712 " x = texture(sampler2D(t, s), vec2(0));\n"
22713 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022714 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22715
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022716 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22717 nullptr,
22718 0,
22719 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22720 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22721 pl,
22722 VK_NULL_HANDLE,
22723 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022724
22725 VkPipeline pipe;
22726 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22727
22728 m_errorMonitor->VerifyNotFound();
22729
22730 if (err == VK_SUCCESS) {
22731 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22732 }
22733
22734 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22735 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22736}
22737
Tony Barbour3ed87a02017-03-15 16:19:02 -060022738TEST_F(VkPositiveLayerTest, Maintenance1Tests) {
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022739 TEST_DESCRIPTION("Validate various special cases for the Maintenance1_KHR extension");
22740
Tony Barbour3ed87a02017-03-15 16:19:02 -060022741 device_extension_names.push_back(VK_KHR_MAINTENANCE1_EXTENSION_NAME);
Tony Barbour73c0f352017-03-16 15:55:38 -060022742 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour3ed87a02017-03-15 16:19:02 -060022743
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022744 // Ensure that extension is available and enabled.
22745 uint32_t extension_count = 0;
22746 bool supports_maintenance1_extension = false;
22747 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22748 ASSERT_VK_SUCCESS(err);
22749 if (extension_count > 0) {
22750 std::vector<VkExtensionProperties> available_extensions(extension_count);
22751
22752 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22753 ASSERT_VK_SUCCESS(err);
22754 for (const auto &extension_props : available_extensions) {
22755 if (strcmp(extension_props.extensionName, VK_KHR_MAINTENANCE1_EXTENSION_NAME) == 0) {
22756 supports_maintenance1_extension = true;
22757 }
22758 }
22759 }
22760
22761 // Proceed if extension is supported by hardware
22762 if (!supports_maintenance1_extension) {
22763 printf(" Maintenance1 Extension not supported, skipping tests\n");
22764 return;
22765 }
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022766
22767 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski77e590c2017-03-17 12:05:16 -060022768 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022769 VkCommandBuffer cmd_buf;
22770 VkCommandBufferAllocateInfo alloc_info;
22771 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
22772 alloc_info.pNext = NULL;
22773 alloc_info.commandBufferCount = 1;
Mike Schuchardt06304c22017-03-01 17:09:09 -070022774 alloc_info.commandPool = m_commandPool->handle();
Mark Lobodzinskidf784fc2017-03-14 09:18:40 -060022775 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
22776 vkAllocateCommandBuffers(m_device->device(), &alloc_info, &cmd_buf);
22777
22778 VkCommandBufferBeginInfo cb_binfo;
22779 cb_binfo.pNext = NULL;
22780 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
22781 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
22782 cb_binfo.flags = 0;
22783 vkBeginCommandBuffer(cmd_buf, &cb_binfo);
22784 // Set Negative height, should give error if Maintenance 1 is not enabled
22785 VkViewport viewport = {0, 0, 16, -16, 0, 1};
22786 vkCmdSetViewport(cmd_buf, 0, 1, &viewport);
22787 vkEndCommandBuffer(cmd_buf);
22788
22789 m_errorMonitor->VerifyNotFound();
22790}
22791
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022792TEST_F(VkPositiveLayerTest, ValidStructPNext) {
22793 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
22794
Tony Barbour1fa09702017-03-16 12:09:08 -060022795 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022796
22797 // Positive test to check parameter_validation and unique_objects support
22798 // for NV_dedicated_allocation
22799 uint32_t extension_count = 0;
22800 bool supports_nv_dedicated_allocation = false;
22801 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22802 ASSERT_VK_SUCCESS(err);
22803
22804 if (extension_count > 0) {
22805 std::vector<VkExtensionProperties> available_extensions(extension_count);
22806
22807 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22808 ASSERT_VK_SUCCESS(err);
22809
22810 for (const auto &extension_props : available_extensions) {
22811 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
22812 supports_nv_dedicated_allocation = true;
22813 }
22814 }
22815 }
22816
22817 if (supports_nv_dedicated_allocation) {
22818 m_errorMonitor->ExpectSuccess();
22819
22820 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
22821 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
22822 dedicated_buffer_create_info.pNext = nullptr;
22823 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
22824
22825 uint32_t queue_family_index = 0;
22826 VkBufferCreateInfo buffer_create_info = {};
22827 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
22828 buffer_create_info.pNext = &dedicated_buffer_create_info;
22829 buffer_create_info.size = 1024;
22830 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
22831 buffer_create_info.queueFamilyIndexCount = 1;
22832 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
22833
22834 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070022835 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022836 ASSERT_VK_SUCCESS(err);
22837
22838 VkMemoryRequirements memory_reqs;
22839 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
22840
22841 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
22842 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
22843 dedicated_memory_info.pNext = nullptr;
22844 dedicated_memory_info.buffer = buffer;
22845 dedicated_memory_info.image = VK_NULL_HANDLE;
22846
22847 VkMemoryAllocateInfo memory_info = {};
22848 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
22849 memory_info.pNext = &dedicated_memory_info;
22850 memory_info.allocationSize = memory_reqs.size;
22851
22852 bool pass;
22853 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
22854 ASSERT_TRUE(pass);
22855
22856 VkDeviceMemory buffer_memory;
22857 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
22858 ASSERT_VK_SUCCESS(err);
22859
22860 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
22861 ASSERT_VK_SUCCESS(err);
22862
22863 vkDestroyBuffer(m_device->device(), buffer, NULL);
22864 vkFreeMemory(m_device->device(), buffer_memory, NULL);
22865
22866 m_errorMonitor->VerifyNotFound();
22867 }
22868}
22869
22870TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
22871 VkResult err;
22872
22873 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
22874
Tony Barbour1fa09702017-03-16 12:09:08 -060022875 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022876 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22877
22878 std::vector<const char *> device_extension_names;
22879 auto features = m_device->phy().features();
22880 // Artificially disable support for non-solid fill modes
22881 features.fillModeNonSolid = false;
22882 // The sacrificial device object
22883 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
22884
22885 VkRenderpassObj render_pass(&test_device);
22886
22887 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
22888 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
22889 pipeline_layout_ci.setLayoutCount = 0;
22890 pipeline_layout_ci.pSetLayouts = NULL;
22891
22892 VkPipelineLayout pipeline_layout;
22893 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
22894 ASSERT_VK_SUCCESS(err);
22895
22896 VkPipelineRasterizationStateCreateInfo rs_ci = {};
22897 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
22898 rs_ci.pNext = nullptr;
22899 rs_ci.lineWidth = 1.0f;
22900 rs_ci.rasterizerDiscardEnable = true;
22901
22902 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
22903 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22904
22905 // Set polygonMode=FILL. No error is expected
22906 m_errorMonitor->ExpectSuccess();
22907 {
22908 VkPipelineObj pipe(&test_device);
22909 pipe.AddShader(&vs);
22910 pipe.AddShader(&fs);
22911 pipe.AddColorAttachment();
22912 // Set polygonMode to a good value
22913 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
22914 pipe.SetRasterization(&rs_ci);
22915 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
22916 }
22917 m_errorMonitor->VerifyNotFound();
22918
22919 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
22920}
22921
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022922#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022923TEST_F(VkPositiveLayerTest, LongFenceChain)
22924{
22925 m_errorMonitor->ExpectSuccess();
22926
Tony Barbour1fa09702017-03-16 12:09:08 -060022927 ASSERT_NO_FATAL_FAILURE(Init());
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022928 VkResult err;
22929
22930 std::vector<VkFence> fences;
22931
22932 const int chainLength = 32768;
22933
22934 for (int i = 0; i < chainLength; i++) {
22935 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
22936 VkFence fence;
22937 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
22938 ASSERT_VK_SUCCESS(err);
22939
22940 fences.push_back(fence);
22941
22942 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
22943 0, nullptr, 0, nullptr };
22944 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
22945 ASSERT_VK_SUCCESS(err);
22946
22947 }
22948
22949 // BOOM, stack overflow.
22950 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
22951
22952 for (auto fence : fences)
22953 vkDestroyFence(m_device->device(), fence, nullptr);
22954
22955 m_errorMonitor->VerifyNotFound();
22956}
22957#endif
22958
Cody Northrop1242dfd2016-07-13 17:24:59 -060022959#if defined(ANDROID) && defined(VALIDATION_APK)
22960static bool initialized = false;
22961static bool active = false;
22962
22963// Convert Intents to argv
22964// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022965std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060022966 std::vector<std::string> args;
22967 JavaVM &vm = *app.activity->vm;
22968 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022969 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060022970
22971 JNIEnv &env = *p_env;
22972 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022973 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060022974 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022975 jmethodID get_string_extra_method =
22976 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060022977 jvalue get_string_extra_args;
22978 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022979 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060022980
22981 std::string args_str;
22982 if (extra_str) {
22983 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
22984 args_str = extra_utf;
22985 env.ReleaseStringUTFChars(extra_str, extra_utf);
22986 env.DeleteLocalRef(extra_str);
22987 }
22988
22989 env.DeleteLocalRef(get_string_extra_args.l);
22990 env.DeleteLocalRef(intent);
22991 vm.DetachCurrentThread();
22992
22993 // split args_str
22994 std::stringstream ss(args_str);
22995 std::string arg;
22996 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022997 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060022998 }
22999
23000 return args;
23001}
23002
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023003static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023004
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023005static void processCommand(struct android_app *app, int32_t cmd) {
23006 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023007 case APP_CMD_INIT_WINDOW: {
23008 if (app->window) {
23009 initialized = true;
23010 }
23011 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023012 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023013 case APP_CMD_GAINED_FOCUS: {
23014 active = true;
23015 break;
23016 }
23017 case APP_CMD_LOST_FOCUS: {
23018 active = false;
23019 break;
23020 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023021 }
23022}
23023
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023024void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023025 app_dummy();
23026
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023027 const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060023028
23029 int vulkanSupport = InitVulkan();
23030 if (vulkanSupport == 0) {
23031 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
23032 return;
23033 }
23034
23035 app->onAppCmd = processCommand;
23036 app->onInputEvent = processInput;
23037
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023038 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023039 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023040 struct android_poll_source *source;
23041 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060023042 if (source) {
23043 source->process(app, source);
23044 }
23045
23046 if (app->destroyRequested != 0) {
23047 VkTestFramework::Finish();
23048 return;
23049 }
23050 }
23051
23052 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023053 // Use the following key to send arguments to gtest, i.e.
23054 // --es args "--gtest_filter=-VkLayerTest.foo"
23055 const char key[] = "args";
23056 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023057
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023058 std::string filter = "";
23059 if (args.size() > 0) {
23060 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
23061 filter += args[0];
23062 } else {
23063 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
23064 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023065
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023066 int argc = 2;
23067 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
23068 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023069
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023070 // Route output to files until we can override the gtest output
23071 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
23072 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023073
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023074 ::testing::InitGoogleTest(&argc, argv);
23075 VkTestFramework::InitArgs(&argc, argv);
23076 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023077
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023078 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023079
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023080 if (result != 0) {
23081 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
23082 } else {
23083 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
23084 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060023085
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023086 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060023087
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023088 fclose(stdout);
23089 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060023090
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023091 ANativeActivity_finish(app->activity);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060023092 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060023093 }
23094 }
23095}
23096#endif
23097
Tony Barbour300a6082015-04-07 13:44:53 -060023098int main(int argc, char **argv) {
23099 int result;
23100
Cody Northrop8e54a402016-03-08 22:25:52 -070023101#ifdef ANDROID
23102 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070023103 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070023104#endif
23105
Tony Barbour300a6082015-04-07 13:44:53 -060023106 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060023107 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060023108
23109 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
23110
23111 result = RUN_ALL_TESTS();
23112
Tony Barbour6918cd52015-04-09 12:58:51 -060023113 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060023114 return result;
23115}