blob: 4df1361fb6025c58826c25f7b4672dc0be1aaf4a [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) {
232 printf("Unexpected: %s\n", msgString);
233 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 Hayesf967b0e2017-01-27 11:59:02 -0700241 vector<string> GetOtherFailureMsgs(void) const { return other_messages_; }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600242
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 Hayesf967b0e2017-01-27 11:59:02 -0700251 void DumpFailureMsgs(void) const {
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -0600252 vector<string> otherMsgs = GetOtherFailureMsgs();
Tony Barbour59b42282016-11-03 13:31:28 -0600253 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;
257 }
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()) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200273 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()) {
Chris Forbes8f36a8a2016-04-07 13:21:07 +1200287 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 }
354
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700355 protected:
Karl Schultz6addd812016-02-02 17:17:23 -0700356 ErrorMonitor *m_errorMonitor;
Ian Elliott2c1daf52016-05-12 09:41:46 -0600357 bool m_enableWSI;
Tony Barbour300a6082015-04-07 13:44:53 -0600358
359 virtual void SetUp() {
Courtney Goeltzenleuchtercd69eee2015-07-06 09:10:47 -0600360 std::vector<const char *> instance_layer_names;
Courtney Goeltzenleuchterf579fa62015-06-10 17:39:03 -0600361 std::vector<const char *> instance_extension_names;
362 std::vector<const char *> device_extension_names;
Tony Barbour3fdff9e2015-04-23 12:55:36 -0600363
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -0700364 instance_extension_names.push_back(VK_EXT_DEBUG_REPORT_EXTENSION_NAME);
Courtney Goeltzenleuchterc2b06fe2015-06-16 15:59:11 -0600365 /*
366 * Since CreateDbgMsgCallback is an instance level extension call
367 * any extension / layer that utilizes that feature also needs
368 * to be enabled at create instance time.
369 */
Karl Schultz6addd812016-02-02 17:17:23 -0700370 // Use Threading layer first to protect others from
371 // ThreadCommandBufferCollision test
Courtney Goeltzenleuchter76885322016-02-06 17:11:22 -0700372 instance_layer_names.push_back("VK_LAYER_GOOGLE_threading");
Tobin Ehlis24aab042016-03-24 10:54:18 -0600373 instance_layer_names.push_back("VK_LAYER_LUNARG_parameter_validation");
Michael Lentine03107b42015-12-11 10:49:51 -0800374 instance_layer_names.push_back("VK_LAYER_LUNARG_object_tracker");
Tobin Ehlisc96f8062016-03-09 16:12:48 -0700375 instance_layer_names.push_back("VK_LAYER_LUNARG_core_validation");
Ian Elliotte48a1382016-04-28 14:22:58 -0600376 instance_layer_names.push_back("VK_LAYER_LUNARG_swapchain");
Dustin Graveseaa78cd2016-01-26 16:30:22 -0700377 instance_layer_names.push_back("VK_LAYER_GOOGLE_unique_objects");
Courtney Goeltzenleuchterd971b612015-06-17 20:51:59 -0600378
Ian Elliott2c1daf52016-05-12 09:41:46 -0600379 if (m_enableWSI) {
380 instance_extension_names.push_back(VK_KHR_SURFACE_EXTENSION_NAME);
381 device_extension_names.push_back(VK_KHR_SWAPCHAIN_EXTENSION_NAME);
382#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
383#if defined(VK_USE_PLATFORM_ANDROID_KHR)
384 instance_extension_names.push_back(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700385#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600386#if defined(VK_USE_PLATFORM_MIR_KHR)
387 instance_extension_names.push_back(VK_KHR_MIR_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700388#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600389#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
390 instance_extension_names.push_back(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700391#endif // VK_USE_PLATFORM_WAYLAND_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600392#if defined(VK_USE_PLATFORM_WIN32_KHR)
393 instance_extension_names.push_back(VK_KHR_WIN32_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700394#endif // VK_USE_PLATFORM_WIN32_KHR
395#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott2c1daf52016-05-12 09:41:46 -0600396#if defined(VK_USE_PLATFORM_XCB_KHR)
397 instance_extension_names.push_back(VK_KHR_XCB_SURFACE_EXTENSION_NAME);
398#elif defined(VK_USE_PLATFORM_XLIB_KHR)
399 instance_extension_names.push_back(VK_KHR_XLIB_SURFACE_EXTENSION_NAME);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700400#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott2c1daf52016-05-12 09:41:46 -0600401 }
402
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -0600403 this->app_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
Tony Barbour300a6082015-04-07 13:44:53 -0600404 this->app_info.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800405 this->app_info.pApplicationName = "layer_tests";
406 this->app_info.applicationVersion = 1;
Tony Barbour300a6082015-04-07 13:44:53 -0600407 this->app_info.pEngineName = "unittest";
408 this->app_info.engineVersion = 1;
Jon Ashburnc5012ff2016-03-22 13:57:46 -0600409 this->app_info.apiVersion = VK_API_VERSION_1_0;
Tony Barbour300a6082015-04-07 13:44:53 -0600410
Tony Barbour15524c32015-04-29 17:34:29 -0600411 m_errorMonitor = new ErrorMonitor;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600412 InitFramework(instance_layer_names, instance_extension_names, device_extension_names, myDbgFunc, m_errorMonitor);
Tony Barbour300a6082015-04-07 13:44:53 -0600413 }
414
415 virtual void TearDown() {
416 // Clean up resources before we reset
Tony Barbour300a6082015-04-07 13:44:53 -0600417 ShutdownFramework();
Tony Barbour0b4d9562015-04-09 10:48:04 -0600418 delete m_errorMonitor;
Tony Barbour300a6082015-04-07 13:44:53 -0600419 }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600420
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600421 VkLayerTest() { m_enableWSI = false; }
Tony Barbour300a6082015-04-07 13:44:53 -0600422};
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500423
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600424void VkLayerTest::VKTriangleTest(const char *vertShaderText, const char *fragShaderText, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500425 // Create identity matrix
426 int i;
427 struct vktriangle_vs_uniform data;
428
429 glm::mat4 Projection = glm::mat4(1.0f);
Karl Schultz6addd812016-02-02 17:17:23 -0700430 glm::mat4 View = glm::mat4(1.0f);
431 glm::mat4 Model = glm::mat4(1.0f);
432 glm::mat4 MVP = Projection * View * Model;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500433 const int matrixSize = sizeof(MVP);
Karl Schultz6addd812016-02-02 17:17:23 -0700434 const int bufSize = sizeof(vktriangle_vs_uniform) / sizeof(float);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500435
436 memcpy(&data.mvp, &MVP[0][0], matrixSize);
437
Karl Schultz6addd812016-02-02 17:17:23 -0700438 static const Vertex tri_data[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600439 {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 -0500440 };
441
Karl Schultz6addd812016-02-02 17:17:23 -0700442 for (i = 0; i < 3; i++) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500443 data.position[i][0] = tri_data[i].posX;
444 data.position[i][1] = tri_data[i].posY;
445 data.position[i][2] = tri_data[i].posZ;
446 data.position[i][3] = tri_data[i].posW;
Karl Schultz6addd812016-02-02 17:17:23 -0700447 data.color[i][0] = tri_data[i].r;
448 data.color[i][1] = tri_data[i].g;
449 data.color[i][2] = tri_data[i].b;
450 data.color[i][3] = tri_data[i].a;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500451 }
452
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500453 ASSERT_NO_FATAL_FAILURE(InitViewport());
454
Chris Forbesbcfaadd2016-09-16 14:13:53 +1200455 VkConstantBufferObj constantBuffer(m_device, bufSize * 2, sizeof(float), (const void *)&data,
456 VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500457
Karl Schultz6addd812016-02-02 17:17:23 -0700458 VkShaderObj vs(m_device, vertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600459 VkShaderObj ps(m_device, fragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500460
461 VkPipelineObj pipelineobj(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +0800462 pipelineobj.AddColorAttachment();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500463 pipelineobj.AddShader(&vs);
464 pipelineobj.AddShader(&ps);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600465 if (failMask & BsoFailLineWidth) {
466 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_LINE_WIDTH);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600467 VkPipelineInputAssemblyStateCreateInfo ia_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600468 ia_state.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600469 ia_state.topology = VK_PRIMITIVE_TOPOLOGY_LINE_LIST;
470 pipelineobj.SetInputAssembly(&ia_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600471 }
472 if (failMask & BsoFailDepthBias) {
473 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BIAS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600474 VkPipelineRasterizationStateCreateInfo rs_state = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600475 rs_state.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600476 rs_state.depthBiasEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -0600477 rs_state.lineWidth = 1.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600478 pipelineobj.SetRasterization(&rs_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600479 }
Rene Lindsayacbf5e62016-12-15 18:47:11 -0700480 // Viewport and scissors must stay in sync or other errors will occur than
Karl Schultz6addd812016-02-02 17:17:23 -0700481 // the ones we want
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600482 if (failMask & BsoFailViewport) {
483 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_VIEWPORT);
484 }
485 if (failMask & BsoFailScissor) {
486 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_SCISSOR);
487 }
488 if (failMask & BsoFailBlend) {
489 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_BLEND_CONSTANTS);
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600490 VkPipelineColorBlendAttachmentState att_state = {};
491 att_state.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
492 att_state.blendEnable = VK_TRUE;
493 pipelineobj.AddColorAttachment(0, &att_state);
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600494 }
495 if (failMask & BsoFailDepthBounds) {
496 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_DEPTH_BOUNDS);
497 }
498 if (failMask & BsoFailStencilReadMask) {
499 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK);
500 }
501 if (failMask & BsoFailStencilWriteMask) {
502 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK);
503 }
504 if (failMask & BsoFailStencilReference) {
505 pipelineobj.MakeDynamic(VK_DYNAMIC_STATE_STENCIL_REFERENCE);
506 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500507
508 VkDescriptorSetObj descriptorSet(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600509 descriptorSet.AppendBuffer(VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER, constantBuffer);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500510
511 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barbour552f6c02016-12-21 14:34:07 -0700512 m_commandBuffer->BeginCommandBuffer();
513 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500514
Tony Barbourfe3351b2015-07-28 10:17:20 -0600515 GenericDrawPreparation(pipelineobj, descriptorSet, failMask);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500516
517 // render triangle
Tobin Ehlis379ba3b2016-07-19 11:22:29 -0600518 if (failMask & BsoFailIndexBuffer) {
519 // Use DrawIndexed w/o an index buffer bound
520 DrawIndexed(3, 1, 0, 0, 0);
521 } else {
522 Draw(3, 1, 0, 0);
523 }
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500524
Mark Muellerd4914412016-06-13 17:52:06 -0600525 if (failMask & BsoFailCmdClearAttachments) {
526 VkClearAttachment color_attachment = {};
527 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700528 color_attachment.colorAttachment = 1; // Someone who knew what they were doing would use 0 for the index;
Mark Muellerd4914412016-06-13 17:52:06 -0600529 VkClearRect clear_rect = {{{0, 0}, {static_cast<uint32_t>(m_width), static_cast<uint32_t>(m_height)}}, 0, 0};
530
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600531 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Muellerd4914412016-06-13 17:52:06 -0600532 }
533
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500534 // finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -0700535 m_commandBuffer->EndRenderPass();
536 m_commandBuffer->EndCommandBuffer();
Tony Barbourfe3351b2015-07-28 10:17:20 -0600537 QueueCommandBuffer();
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500538}
539
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600540void VkLayerTest::GenericDrawPreparation(VkCommandBufferObj *commandBuffer, VkPipelineObj &pipelineobj,
541 VkDescriptorSetObj &descriptorSet, BsoFailSelect failMask) {
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500542 if (m_depthStencil->Initialized()) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600543 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, m_depthStencil);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500544 } else {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600545 commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500546 }
547
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800548 commandBuffer->PrepareAttachments();
Karl Schultz6addd812016-02-02 17:17:23 -0700549 // Make sure depthWriteEnable is set so that Depth fail test will work
550 // correctly
551 // Make sure stencilTestEnable is set so that Stencil fail test will work
552 // correctly
Tony Barboureb254902015-07-15 12:50:33 -0600553 VkStencilOpState stencil = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +0800554 stencil.failOp = VK_STENCIL_OP_KEEP;
555 stencil.passOp = VK_STENCIL_OP_KEEP;
556 stencil.depthFailOp = VK_STENCIL_OP_KEEP;
557 stencil.compareOp = VK_COMPARE_OP_NEVER;
Tony Barboureb254902015-07-15 12:50:33 -0600558
559 VkPipelineDepthStencilStateCreateInfo ds_ci = {};
560 ds_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DEPTH_STENCIL_STATE_CREATE_INFO;
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600561 ds_ci.pNext = NULL;
562 ds_ci.depthTestEnable = VK_FALSE;
563 ds_ci.depthWriteEnable = VK_TRUE;
564 ds_ci.depthCompareOp = VK_COMPARE_OP_NEVER;
565 ds_ci.depthBoundsTestEnable = VK_FALSE;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600566 if (failMask & BsoFailDepthBounds) {
567 ds_ci.depthBoundsTestEnable = VK_TRUE;
Tobin Ehlis21c88352016-05-26 06:15:45 -0600568 ds_ci.maxDepthBounds = 0.0f;
569 ds_ci.minDepthBounds = 0.0f;
Tobin Ehlis7a1d2352016-03-28 11:18:19 -0600570 }
Courtney Goeltzenleuchter507ba972015-09-30 16:16:57 -0600571 ds_ci.stencilTestEnable = VK_TRUE;
572 ds_ci.front = stencil;
573 ds_ci.back = stencil;
Tony Barboureb254902015-07-15 12:50:33 -0600574
Tobin Ehlis4bf96d12015-06-25 11:58:41 -0600575 pipelineobj.SetDepthStencil(&ds_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -0600576 pipelineobj.SetViewport(m_viewports);
577 pipelineobj.SetScissor(m_scissors);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800578 descriptorSet.CreateVKDescriptorSet(commandBuffer);
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600579 VkResult err = pipelineobj.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Cody Northrop29a08f22015-08-27 10:20:35 -0600580 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +0800581 commandBuffer->BindPipeline(pipelineobj);
582 commandBuffer->BindDescriptorSet(descriptorSet);
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500583}
584
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600585class VkPositiveLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700586 public:
587 protected:
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600588};
589
Ian Elliott2c1daf52016-05-12 09:41:46 -0600590class VkWsiEnabledLayerTest : public VkLayerTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700591 public:
592 protected:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600593 VkWsiEnabledLayerTest() { m_enableWSI = true; }
Ian Elliott2c1daf52016-05-12 09:41:46 -0600594};
595
Mark Muellerdfe37552016-07-07 14:47:42 -0600596class VkBufferTest {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700597 public:
Mark Muellerdfe37552016-07-07 14:47:42 -0600598 enum eTestEnFlags {
599 eDoubleDelete,
600 eInvalidDeviceOffset,
601 eInvalidMemoryOffset,
602 eBindNullBuffer,
603 eFreeInvalidHandle,
Mark Mueller4042b652016-09-05 22:52:21 -0600604 eNone,
Mark Muellerdfe37552016-07-07 14:47:42 -0600605 };
606
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600607 enum eTestConditions { eOffsetAlignment = 1 };
Mark Muellerdfe37552016-07-07 14:47:42 -0600608
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600609 static bool GetTestConditionValid(VkDeviceObj *aVulkanDevice, eTestEnFlags aTestFlag, VkBufferUsageFlags aBufferUsage = 0) {
610 if (eInvalidDeviceOffset != aTestFlag && eInvalidMemoryOffset != aTestFlag) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600611 return true;
612 }
613 VkDeviceSize offset_limit = 0;
614 if (eInvalidMemoryOffset == aTestFlag) {
615 VkBuffer vulkanBuffer;
616 VkBufferCreateInfo buffer_create_info = {};
617 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
618 buffer_create_info.size = 32;
619 buffer_create_info.usage = aBufferUsage;
620
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600621 vkCreateBuffer(aVulkanDevice->device(), &buffer_create_info, nullptr, &vulkanBuffer);
Mark Mueller4042b652016-09-05 22:52:21 -0600622 VkMemoryRequirements memory_reqs = {};
Mark Muellerdfe37552016-07-07 14:47:42 -0600623
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600624 vkGetBufferMemoryRequirements(aVulkanDevice->device(), vulkanBuffer, &memory_reqs);
Mark Muellerdfe37552016-07-07 14:47:42 -0600625 vkDestroyBuffer(aVulkanDevice->device(), vulkanBuffer, nullptr);
626 offset_limit = memory_reqs.alignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600627 } else if ((VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT | VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT) & aBufferUsage) {
628 offset_limit = aVulkanDevice->props.limits.minTexelBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600629 } else if (VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600630 offset_limit = aVulkanDevice->props.limits.minUniformBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600631 } else if (VK_BUFFER_USAGE_STORAGE_BUFFER_BIT & aBufferUsage) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600632 offset_limit = aVulkanDevice->props.limits.minStorageBufferOffsetAlignment;
Mark Muellerdfe37552016-07-07 14:47:42 -0600633 }
634 if (eOffsetAlignment < offset_limit) {
635 return true;
636 }
637 return false;
638 }
639
640 // A constructor which performs validation tests within construction.
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600641 VkBufferTest(VkDeviceObj *aVulkanDevice, VkBufferUsageFlags aBufferUsage, eTestEnFlags aTestFlag = eNone)
642 : AllocateCurrent(false), BoundCurrent(false), CreateCurrent(false), VulkanDevice(aVulkanDevice->device()) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600643 if (eBindNullBuffer == aTestFlag) {
644 VulkanMemory = 0;
645 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, 0);
646 } else {
647 VkBufferCreateInfo buffer_create_info = {};
648 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
649 buffer_create_info.size = 32;
650 buffer_create_info.usage = aBufferUsage;
651
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600652 vkCreateBuffer(VulkanDevice, &buffer_create_info, nullptr, &VulkanBuffer);
Mark Muellerdfe37552016-07-07 14:47:42 -0600653
654 CreateCurrent = true;
655
656 VkMemoryRequirements memory_requirements;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600657 vkGetBufferMemoryRequirements(VulkanDevice, VulkanBuffer, &memory_requirements);
Mark Muellerdfe37552016-07-07 14:47:42 -0600658
659 VkMemoryAllocateInfo memory_allocate_info = {};
660 memory_allocate_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Stratton77a0d592017-02-17 13:14:13 -0800661 memory_allocate_info.allocationSize = memory_requirements.size + eOffsetAlignment;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600662 bool pass = aVulkanDevice->phy().set_memory_type(memory_requirements.memoryTypeBits, &memory_allocate_info,
663 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
Mark Muellerdfe37552016-07-07 14:47:42 -0600664 if (!pass) {
665 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
666 return;
667 }
668
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600669 vkAllocateMemory(VulkanDevice, &memory_allocate_info, NULL, &VulkanMemory);
Mark Muellerdfe37552016-07-07 14:47:42 -0600670 AllocateCurrent = true;
671 // NB: 1 is intentionally an invalid offset value
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600672 const bool offset_en = eInvalidDeviceOffset == aTestFlag || eInvalidMemoryOffset == aTestFlag;
673 vkBindBufferMemory(VulkanDevice, VulkanBuffer, VulkanMemory, offset_en ? eOffsetAlignment : 0);
Mark Muellerdfe37552016-07-07 14:47:42 -0600674 BoundCurrent = true;
675
676 InvalidDeleteEn = (eFreeInvalidHandle == aTestFlag);
677 }
678 }
679
680 ~VkBufferTest() {
681 if (CreateCurrent) {
682 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
683 }
684 if (AllocateCurrent) {
685 if (InvalidDeleteEn) {
686 union {
687 VkDeviceMemory device_memory;
688 unsigned long long index_access;
689 } bad_index;
690
691 bad_index.device_memory = VulkanMemory;
692 bad_index.index_access++;
693
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600694 vkFreeMemory(VulkanDevice, bad_index.device_memory, nullptr);
Mark Muellerdfe37552016-07-07 14:47:42 -0600695 }
696 vkFreeMemory(VulkanDevice, VulkanMemory, nullptr);
697 }
698 }
699
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600700 bool GetBufferCurrent() { return AllocateCurrent && BoundCurrent && CreateCurrent; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600701
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600702 const VkBuffer &GetBuffer() { return VulkanBuffer; }
Mark Muellerdfe37552016-07-07 14:47:42 -0600703
704 void TestDoubleDestroy() {
705 // Destroy the buffer but leave the flag set, which will cause
706 // the buffer to be destroyed again in the destructor.
707 vkDestroyBuffer(VulkanDevice, VulkanBuffer, nullptr);
708 }
709
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700710 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600711 bool AllocateCurrent;
712 bool BoundCurrent;
713 bool CreateCurrent;
714 bool InvalidDeleteEn;
715
716 VkBuffer VulkanBuffer;
717 VkDevice VulkanDevice;
718 VkDeviceMemory VulkanMemory;
Mark Muellerdfe37552016-07-07 14:47:42 -0600719};
720
721class VkVerticesObj {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700722 public:
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600723 VkVerticesObj(VkDeviceObj *aVulkanDevice, unsigned aAttributeCount, unsigned aBindingCount, unsigned aByteStride,
Mark Muellerdfe37552016-07-07 14:47:42 -0600724 VkDeviceSize aVertexCount, const float *aVerticies)
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700725 : BoundCurrent(false),
726 AttributeCount(aAttributeCount),
727 BindingCount(aBindingCount),
728 BindId(BindIdGenerator),
Mark Muellerdfe37552016-07-07 14:47:42 -0600729 PipelineVertexInputStateCreateInfo(),
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600730 VulkanMemoryBuffer(aVulkanDevice, 1, static_cast<int>(aByteStride * aVertexCount),
731 reinterpret_cast<const void *>(aVerticies), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700732 BindIdGenerator++; // NB: This can wrap w/misuse
Mark Muellerdfe37552016-07-07 14:47:42 -0600733
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600734 VertexInputAttributeDescription = new VkVertexInputAttributeDescription[AttributeCount];
735 VertexInputBindingDescription = new VkVertexInputBindingDescription[BindingCount];
Mark Muellerdfe37552016-07-07 14:47:42 -0600736
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600737 PipelineVertexInputStateCreateInfo.pVertexAttributeDescriptions = VertexInputAttributeDescription;
738 PipelineVertexInputStateCreateInfo.vertexAttributeDescriptionCount = AttributeCount;
739 PipelineVertexInputStateCreateInfo.pVertexBindingDescriptions = VertexInputBindingDescription;
740 PipelineVertexInputStateCreateInfo.vertexBindingDescriptionCount = BindingCount;
741 PipelineVertexInputStateCreateInfo.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -0600742
743 unsigned i = 0;
744 do {
745 VertexInputAttributeDescription[i].binding = BindId;
746 VertexInputAttributeDescription[i].location = i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600747 VertexInputAttributeDescription[i].format = VK_FORMAT_R32G32B32_SFLOAT;
748 VertexInputAttributeDescription[i].offset = sizeof(float) * aByteStride;
Mark Muellerdfe37552016-07-07 14:47:42 -0600749 i++;
750 } while (AttributeCount < i);
751
752 i = 0;
753 do {
754 VertexInputBindingDescription[i].binding = BindId;
755 VertexInputBindingDescription[i].stride = aByteStride;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600756 VertexInputBindingDescription[i].inputRate = VK_VERTEX_INPUT_RATE_VERTEX;
Mark Muellerdfe37552016-07-07 14:47:42 -0600757 i++;
758 } while (BindingCount < i);
759 }
760
761 ~VkVerticesObj() {
762 if (VertexInputAttributeDescription) {
763 delete[] VertexInputAttributeDescription;
764 }
765 if (VertexInputBindingDescription) {
766 delete[] VertexInputBindingDescription;
767 }
768 }
769
770 bool AddVertexInputToPipe(VkPipelineObj &aPipelineObj) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600771 aPipelineObj.AddVertexInputAttribs(VertexInputAttributeDescription, AttributeCount);
772 aPipelineObj.AddVertexInputBindings(VertexInputBindingDescription, BindingCount);
Mark Muellerdfe37552016-07-07 14:47:42 -0600773 return true;
774 }
775
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600776 void BindVertexBuffers(VkCommandBuffer aCommandBuffer, unsigned aOffsetCount = 0, VkDeviceSize *aOffsetList = nullptr) {
Mark Muellerdfe37552016-07-07 14:47:42 -0600777 VkDeviceSize *offsetList;
778 unsigned offsetCount;
779
780 if (aOffsetCount) {
781 offsetList = aOffsetList;
782 offsetCount = aOffsetCount;
783 } else {
784 offsetList = new VkDeviceSize[1]();
785 offsetCount = 1;
786 }
787
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600788 vkCmdBindVertexBuffers(aCommandBuffer, BindId, offsetCount, &VulkanMemoryBuffer.handle(), offsetList);
Mark Muellerdfe37552016-07-07 14:47:42 -0600789 BoundCurrent = true;
790
791 if (!aOffsetCount) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600792 delete[] offsetList;
Mark Muellerdfe37552016-07-07 14:47:42 -0600793 }
794 }
795
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700796 protected:
Mark Muellerdfe37552016-07-07 14:47:42 -0600797 static uint32_t BindIdGenerator;
798
799 bool BoundCurrent;
800 unsigned AttributeCount;
801 unsigned BindingCount;
802 uint32_t BindId;
803
804 VkPipelineVertexInputStateCreateInfo PipelineVertexInputStateCreateInfo;
805 VkVertexInputAttributeDescription *VertexInputAttributeDescription;
806 VkVertexInputBindingDescription *VertexInputBindingDescription;
807 VkConstantBufferObj VulkanMemoryBuffer;
808};
809
810uint32_t VkVerticesObj::BindIdGenerator;
Mark Lobodzinski3780e142015-05-14 15:08:13 -0500811// ********************************************************************************************************************
812// ********************************************************************************************************************
813// ********************************************************************************************************************
814// ********************************************************************************************************************
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600815TEST_F(VkLayerTest, RequiredParameter) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700816 TEST_DESCRIPTION(
817 "Specify VK_NULL_HANDLE, NULL, and 0 for required handle, "
818 "pointer, array, and array count parameters");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600819
820 ASSERT_NO_FATAL_FAILURE(InitState());
821
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600822 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pFeatures specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600823 // Specify NULL for a pointer to a handle
824 // Expected to trigger an error with
825 // parameter_validation::validate_required_pointer
826 vkGetPhysicalDeviceFeatures(gpu(), NULL);
827 m_errorMonitor->VerifyFound();
828
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600829 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
830 "required parameter pQueueFamilyPropertyCount specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600831 // Specify NULL for pointer to array count
832 // Expected to trigger an error with parameter_validation::validate_array
Dustin Gravesa4bb8c12016-05-16 17:22:51 -0600833 vkGetPhysicalDeviceQueueFamilyProperties(gpu(), NULL, NULL);
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600834 m_errorMonitor->VerifyFound();
835
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600836 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter viewportCount must be greater than 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600837 // Specify 0 for a required array count
838 // Expected to trigger an error with parameter_validation::validate_array
839 VkViewport view_port = {};
840 m_commandBuffer->SetViewport(0, 0, &view_port);
841 m_errorMonitor->VerifyFound();
842
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600843 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pViewports specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600844 // Specify NULL for a required array
845 // Expected to trigger an error with parameter_validation::validate_array
846 m_commandBuffer->SetViewport(0, 1, NULL);
847 m_errorMonitor->VerifyFound();
848
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600849 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter memory specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600850 // Specify VK_NULL_HANDLE for a required handle
851 // Expected to trigger an error with
852 // parameter_validation::validate_required_handle
853 vkUnmapMemory(device(), VK_NULL_HANDLE);
854 m_errorMonitor->VerifyFound();
855
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
857 "required parameter pFences[0] specified as VK_NULL_HANDLE");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600858 // Specify VK_NULL_HANDLE for a required handle array entry
859 // Expected to trigger an error with
860 // parameter_validation::validate_required_handle_array
861 VkFence fence = VK_NULL_HANDLE;
862 vkResetFences(device(), 1, &fence);
863 m_errorMonitor->VerifyFound();
864
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600865 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pAllocateInfo specified as NULL");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600866 // Specify NULL for a required struct pointer
867 // Expected to trigger an error with
868 // parameter_validation::validate_struct_type
869 VkDeviceMemory memory = VK_NULL_HANDLE;
870 vkAllocateMemory(device(), NULL, NULL, &memory);
871 m_errorMonitor->VerifyFound();
872
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600873 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "value of faceMask must not be 0");
Dustin Gravesffa90fa2016-05-06 11:20:38 -0600874 // Specify 0 for a required VkFlags parameter
875 // Expected to trigger an error with parameter_validation::validate_flags
876 m_commandBuffer->SetStencilReference(0, 0);
877 m_errorMonitor->VerifyFound();
878
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600879 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 -0600880 // Specify 0 for a required VkFlags array entry
881 // Expected to trigger an error with
882 // parameter_validation::validate_flags_array
883 VkSemaphore semaphore = VK_NULL_HANDLE;
884 VkPipelineStageFlags stageFlags = 0;
885 VkSubmitInfo submitInfo = {};
886 submitInfo.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
887 submitInfo.waitSemaphoreCount = 1;
888 submitInfo.pWaitSemaphores = &semaphore;
889 submitInfo.pWaitDstStageMask = &stageFlags;
890 vkQueueSubmit(m_device->m_queue, 1, &submitInfo, VK_NULL_HANDLE);
891 m_errorMonitor->VerifyFound();
892}
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600893
Dustin Gravesfce74c02016-05-10 11:42:58 -0600894TEST_F(VkLayerTest, ReservedParameter) {
895 TEST_DESCRIPTION("Specify a non-zero value for a reserved parameter");
896
897 ASSERT_NO_FATAL_FAILURE(InitState());
898
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600899 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " must be 0");
Dustin Gravesfce74c02016-05-10 11:42:58 -0600900 // Specify 0 for a reserved VkFlags parameter
901 // Expected to trigger an error with
902 // parameter_validation::validate_reserved_flags
903 VkEvent event_handle = VK_NULL_HANDLE;
904 VkEventCreateInfo event_info = {};
905 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
906 event_info.flags = 1;
907 vkCreateEvent(device(), &event_info, NULL, &event_handle);
908 m_errorMonitor->VerifyFound();
909}
910
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600911TEST_F(VkLayerTest, InvalidStructSType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700912 TEST_DESCRIPTION(
913 "Specify an invalid VkStructureType for a Vulkan "
914 "structure's sType field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600915
916 ASSERT_NO_FATAL_FAILURE(InitState());
917
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600918 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pAllocateInfo->sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600919 // Zero struct memory, effectively setting sType to
920 // VK_STRUCTURE_TYPE_APPLICATION_INFO
921 // Expected to trigger an error with
922 // parameter_validation::validate_struct_type
923 VkMemoryAllocateInfo alloc_info = {};
924 VkDeviceMemory memory = VK_NULL_HANDLE;
925 vkAllocateMemory(device(), &alloc_info, NULL, &memory);
926 m_errorMonitor->VerifyFound();
927
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600928 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pSubmits[0].sType must be");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600929 // Zero struct memory, effectively setting sType to
930 // VK_STRUCTURE_TYPE_APPLICATION_INFO
931 // Expected to trigger an error with
932 // parameter_validation::validate_struct_type_array
933 VkSubmitInfo submit_info = {};
934 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
935 m_errorMonitor->VerifyFound();
936}
937
938TEST_F(VkLayerTest, InvalidStructPNext) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600939 TEST_DESCRIPTION("Specify an invalid value for a Vulkan structure's pNext field");
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600940
941 ASSERT_NO_FATAL_FAILURE(InitState());
942
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600943 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "value of pCreateInfo->pNext must be NULL");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600944 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, when pNext must be NULL.
Karl Schultz38b50992016-07-11 16:09:09 -0600945 // Need to pick a function that has no allowed pNext structure types.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600946 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Karl Schultz38b50992016-07-11 16:09:09 -0600947 VkEvent event = VK_NULL_HANDLE;
Karl Schultz70db3902016-07-11 16:22:10 -0600948 VkEventCreateInfo event_alloc_info = {};
Karl Schultz38b50992016-07-11 16:09:09 -0600949 // Zero-initialization will provide the correct sType
950 VkApplicationInfo app_info = {};
951 event_alloc_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
952 event_alloc_info.pNext = &app_info;
953 vkCreateEvent(device(), &event_alloc_info, NULL, &event);
954 m_errorMonitor->VerifyFound();
955
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600956 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
957 " chain includes a structure with unexpected VkStructureType ");
Karl Schultz38b50992016-07-11 16:09:09 -0600958 // Set VkMemoryAllocateInfo::pNext to a non-NULL value, but use
959 // a function that has allowed pNext structure types and specify
960 // a structure type that is not allowed.
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -0600961 // Expected to trigger an error with parameter_validation::validate_struct_pnext
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600962 VkDeviceMemory memory = VK_NULL_HANDLE;
Dustin Graves47b6cba2016-05-10 17:34:38 -0600963 VkMemoryAllocateInfo memory_alloc_info = {};
964 memory_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
965 memory_alloc_info.pNext = &app_info;
966 vkAllocateMemory(device(), &memory_alloc_info, NULL, &memory);
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600967 m_errorMonitor->VerifyFound();
Dustin Gravesc99cf5a2016-05-09 14:40:29 -0600968}
Dustin Graves5d33d532016-05-09 16:21:12 -0600969
970TEST_F(VkLayerTest, UnrecognizedValue) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600971 TEST_DESCRIPTION("Specify unrecognized Vulkan enumeration, flags, and VkBool32 values");
Dustin Graves5d33d532016-05-09 16:21:12 -0600972
973 ASSERT_NO_FATAL_FAILURE(InitState());
974
Mark Lobodzinski64318ba2017-01-26 13:34:13 -0700975 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
976 "does not fall within the begin..end "
977 "range of the core VkFormat "
978 "enumeration tokens");
Dustin Graves5d33d532016-05-09 16:21:12 -0600979 // Specify an invalid VkFormat value
980 // Expected to trigger an error with
981 // parameter_validation::validate_ranged_enum
982 VkFormatProperties format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600983 vkGetPhysicalDeviceFormatProperties(gpu(), static_cast<VkFormat>(8000), &format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -0600984 m_errorMonitor->VerifyFound();
985
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600986 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 -0600987 // Specify an invalid VkFlags bitmask value
988 // Expected to trigger an error with parameter_validation::validate_flags
989 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600990 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
991 static_cast<VkImageUsageFlags>(1 << 25), 0, &image_format_properties);
Dustin Graves5d33d532016-05-09 16:21:12 -0600992 m_errorMonitor->VerifyFound();
993
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600994 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 -0600995 // Specify an invalid VkFlags array entry
996 // Expected to trigger an error with
997 // parameter_validation::validate_flags_array
998 VkSemaphore semaphore = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -0600999 VkPipelineStageFlags stage_flags = static_cast<VkPipelineStageFlags>(1 << 25);
Dustin Graves5d33d532016-05-09 16:21:12 -06001000 VkSubmitInfo submit_info = {};
1001 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1002 submit_info.waitSemaphoreCount = 1;
1003 submit_info.pWaitSemaphores = &semaphore;
1004 submit_info.pWaitDstStageMask = &stage_flags;
1005 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
1006 m_errorMonitor->VerifyFound();
1007
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001008 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is neither VK_TRUE nor VK_FALSE");
Dustin Graves5d33d532016-05-09 16:21:12 -06001009 // Specify an invalid VkBool32 value
1010 // Expected to trigger a warning with
1011 // parameter_validation::validate_bool32
1012 VkSampler sampler = VK_NULL_HANDLE;
1013 VkSamplerCreateInfo sampler_info = {};
1014 sampler_info.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
1015 sampler_info.pNext = NULL;
1016 sampler_info.magFilter = VK_FILTER_NEAREST;
1017 sampler_info.minFilter = VK_FILTER_NEAREST;
1018 sampler_info.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
1019 sampler_info.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1020 sampler_info.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1021 sampler_info.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
1022 sampler_info.mipLodBias = 1.0;
1023 sampler_info.maxAnisotropy = 1;
1024 sampler_info.compareEnable = VK_FALSE;
1025 sampler_info.compareOp = VK_COMPARE_OP_NEVER;
1026 sampler_info.minLod = 1.0;
1027 sampler_info.maxLod = 1.0;
1028 sampler_info.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
1029 sampler_info.unnormalizedCoordinates = VK_FALSE;
1030 // Not VK_TRUE or VK_FALSE
1031 sampler_info.anisotropyEnable = 3;
1032 vkCreateSampler(m_device->device(), &sampler_info, NULL, &sampler);
1033 m_errorMonitor->VerifyFound();
1034}
Dustin Gravesfce74c02016-05-10 11:42:58 -06001035
1036TEST_F(VkLayerTest, FailedReturnValue) {
1037 TEST_DESCRIPTION("Check for a message describing a VkResult failure code");
1038
1039 ASSERT_NO_FATAL_FAILURE(InitState());
1040
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001041 // Find an unsupported image format
1042 VkFormat unsupported = VK_FORMAT_UNDEFINED;
1043 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
1044 VkFormat format = static_cast<VkFormat>(f);
1045 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001046 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001047 unsupported = format;
1048 break;
1049 }
1050 }
1051
1052 if (unsupported != VK_FORMAT_UNDEFINED) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001053 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
1054 "the requested format is not supported on this device");
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001055 // Specify an unsupported VkFormat value to generate a
1056 // VK_ERROR_FORMAT_NOT_SUPPORTED return code
1057 // Expected to trigger a warning from
1058 // parameter_validation::validate_result
1059 VkImageFormatProperties image_format_properties;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001060 VkResult err = vkGetPhysicalDeviceImageFormatProperties(gpu(), unsupported, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
1061 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, 0, &image_format_properties);
Dustin Graves13c1e2b2016-05-16 15:31:02 -06001062 ASSERT_TRUE(err == VK_ERROR_FORMAT_NOT_SUPPORTED);
1063 m_errorMonitor->VerifyFound();
1064 }
Dustin Gravesfce74c02016-05-10 11:42:58 -06001065}
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001066
1067TEST_F(VkLayerTest, UpdateBufferAlignment) {
1068 TEST_DESCRIPTION("Check alignment parameters for vkCmdUpdateBuffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001069 uint32_t updateData[] = {1, 2, 3, 4, 5, 6, 7, 8};
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001070
1071 ASSERT_NO_FATAL_FAILURE(InitState());
1072
1073 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1074 vk_testing::Buffer buffer;
1075 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1076
Tony Barbour552f6c02016-12-21 14:34:07 -07001077 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001078 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001079 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001080 m_commandBuffer->UpdateBuffer(buffer.handle(), 1, 4, updateData);
1081 m_errorMonitor->VerifyFound();
1082
1083 // Introduce failure by using dataSize that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001084 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001085 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 6, updateData);
1086 m_errorMonitor->VerifyFound();
1087
1088 // Introduce failure by using dataSize that is < 0
1089 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001090 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001091 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, -44, updateData);
1092 m_errorMonitor->VerifyFound();
1093
1094 // Introduce failure by using dataSize that is > 65536
1095 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001096 "must be greater than zero and less than or equal to 65536");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001097 m_commandBuffer->UpdateBuffer(buffer.handle(), 0, 80000, updateData);
1098 m_errorMonitor->VerifyFound();
1099
Tony Barbour552f6c02016-12-21 14:34:07 -07001100 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001101}
1102
1103TEST_F(VkLayerTest, FillBufferAlignment) {
1104 TEST_DESCRIPTION("Check alignment parameters for vkCmdFillBuffer");
1105
1106 ASSERT_NO_FATAL_FAILURE(InitState());
1107
1108 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1109 vk_testing::Buffer buffer;
1110 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
1111
Tony Barbour552f6c02016-12-21 14:34:07 -07001112 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001113
1114 // Introduce failure by using dstOffset that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001115 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001116 m_commandBuffer->FillBuffer(buffer.handle(), 1, 4, 0x11111111);
1117 m_errorMonitor->VerifyFound();
1118
1119 // Introduce failure by using size that is not multiple of 4
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001120 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is not a multiple of 4");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001121 m_commandBuffer->FillBuffer(buffer.handle(), 0, 6, 0x11111111);
1122 m_errorMonitor->VerifyFound();
1123
1124 // Introduce failure by using size that is zero
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001125 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must be greater than zero");
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001126 m_commandBuffer->FillBuffer(buffer.handle(), 0, 0, 0x11111111);
1127 m_errorMonitor->VerifyFound();
1128
Tony Barbour552f6c02016-12-21 14:34:07 -07001129 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskie090fef2016-06-09 17:04:56 -06001130}
Dustin Graves40f35822016-06-23 11:12:53 -06001131
Cortd889ff92016-07-27 09:51:27 -07001132TEST_F(VkLayerTest, PSOPolygonModeInvalid) {
1133 VkResult err;
1134
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001135 TEST_DESCRIPTION(
1136 "Attempt to use a non-solid polygon fill mode in a "
1137 "pipeline when this feature is not enabled.");
Cortd889ff92016-07-27 09:51:27 -07001138
1139 ASSERT_NO_FATAL_FAILURE(InitState());
1140 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1141
1142 std::vector<const char *> device_extension_names;
1143 auto features = m_device->phy().features();
1144 // Artificially disable support for non-solid fill modes
1145 features.fillModeNonSolid = false;
1146 // The sacrificial device object
1147 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
1148
1149 VkRenderpassObj render_pass(&test_device);
1150
1151 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
1152 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
1153 pipeline_layout_ci.setLayoutCount = 0;
1154 pipeline_layout_ci.pSetLayouts = NULL;
1155
1156 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001157 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Cortd889ff92016-07-27 09:51:27 -07001158 ASSERT_VK_SUCCESS(err);
1159
1160 VkPipelineRasterizationStateCreateInfo rs_ci = {};
1161 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
1162 rs_ci.pNext = nullptr;
1163 rs_ci.lineWidth = 1.0f;
1164 rs_ci.rasterizerDiscardEnable = true;
1165
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001166 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
1167 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Cortd889ff92016-07-27 09:51:27 -07001168
Mark Lobodzinski5e644732016-08-15 16:51:19 -06001169 // Set polygonMode to unsupported value POINT, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001170 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1171 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001172 {
1173 VkPipelineObj pipe(&test_device);
1174 pipe.AddShader(&vs);
1175 pipe.AddShader(&fs);
1176 pipe.AddColorAttachment();
1177 // Introduce failure by setting unsupported polygon mode
1178 rs_ci.polygonMode = VK_POLYGON_MODE_POINT;
1179 pipe.SetRasterization(&rs_ci);
1180 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1181 }
1182 m_errorMonitor->VerifyFound();
1183
1184 // Try again with polygonMode=LINE, should fail
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001185 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1186 "polygonMode cannot be VK_POLYGON_MODE_POINT or VK_POLYGON_MODE_LINE");
Cortd889ff92016-07-27 09:51:27 -07001187 {
1188 VkPipelineObj pipe(&test_device);
1189 pipe.AddShader(&vs);
1190 pipe.AddShader(&fs);
1191 pipe.AddColorAttachment();
1192 // Introduce failure by setting unsupported polygon mode
1193 rs_ci.polygonMode = VK_POLYGON_MODE_LINE;
1194 pipe.SetRasterization(&rs_ci);
1195 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
1196 }
1197 m_errorMonitor->VerifyFound();
1198
Cortd889ff92016-07-27 09:51:27 -07001199 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
1200}
1201
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001202#if 0
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001203TEST_F(VkLayerTest, CallResetCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001204{
1205 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001206 VkFenceCreateInfo fenceInfo = {};
1207 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1208 fenceInfo.pNext = NULL;
1209 fenceInfo.flags = 0;
1210
Mike Weiblencce7ec72016-10-17 19:33:05 -06001211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Resetting command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001212
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001213 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourc1eb1a52015-07-20 13:00:10 -06001214
1215 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
1216 vk_testing::Buffer buffer;
1217 buffer.init_as_dst(*m_device, (VkDeviceSize)20, reqs);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001218
Tony Barbourfe3351b2015-07-28 10:17:20 -06001219 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001220 m_commandBuffer->FillBuffer(buffer.handle(), 0, 4, 0x11111111);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001221 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001222
1223 testFence.init(*m_device, fenceInfo);
1224
1225 // Bypass framework since it does the waits automatically
1226 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001227 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001228 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1229 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001230 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001231 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001232 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001233 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001234 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001235 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001236 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001237
1238 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001239 ASSERT_VK_SUCCESS( err );
1240
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001241 // Introduce failure by calling begin again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001242 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001243
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001244 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001245}
1246
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001247TEST_F(VkLayerTest, CallBeginCommandBufferBeforeCompletion)
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001248{
1249 vk_testing::Fence testFence;
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001250 VkFenceCreateInfo fenceInfo = {};
1251 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
1252 fenceInfo.pNext = NULL;
1253 fenceInfo.flags = 0;
1254
Mike Weiblencce7ec72016-10-17 19:33:05 -06001255 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Calling vkBeginCommandBuffer() on active command buffer");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001256
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001257 ASSERT_NO_FATAL_FAILURE(InitState());
1258 ASSERT_NO_FATAL_FAILURE(InitViewport());
1259 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
1260
Tony Barbourfe3351b2015-07-28 10:17:20 -06001261 BeginCommandBuffer();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001262 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbourfe3351b2015-07-28 10:17:20 -06001263 EndCommandBuffer();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001264
1265 testFence.init(*m_device, fenceInfo);
1266
1267 // Bypass framework since it does the waits automatically
1268 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001269 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08001270 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
1271 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001272 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001273 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07001274 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08001275 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001276 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08001277 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06001278 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06001279
1280 err = vkQueueSubmit( m_device->m_queue, 1, &submit_info, testFence.handle());
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001281 ASSERT_VK_SUCCESS( err );
1282
Jon Ashburnf19916e2016-01-11 13:12:43 -07001283 VkCommandBufferInheritanceInfo hinfo = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001284 VkCommandBufferBeginInfo info = {};
1285 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
1286 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001287 info.renderPass = VK_NULL_HANDLE;
1288 info.subpass = 0;
1289 info.framebuffer = VK_NULL_HANDLE;
Chia-I Wub8d47ae2015-11-11 10:18:12 +08001290 info.occlusionQueryEnable = VK_FALSE;
1291 info.queryFlags = 0;
1292 info.pipelineStatistics = 0;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06001293
1294 // Introduce failure by calling BCB again before checking fence
Chia-I Wu3432a0c2015-10-27 18:04:07 +08001295 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001296
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001297 m_errorMonitor->VerifyFound();
Mark Lobodzinskiccb2b042015-05-19 10:28:29 -05001298}
Tobin Ehlis8fab6562015-12-01 09:57:09 -07001299#endif
Chris Forbes8f36a8a2016-04-07 13:21:07 +12001300
Mark Lobodzinski833bb552016-12-15 07:41:13 -07001301TEST_F(VkLayerTest, SparseBindingImageBufferCreate) {
1302 TEST_DESCRIPTION("Create buffer/image with sparse attributes but without the sparse_binding bit set");
1303
1304 ASSERT_NO_FATAL_FAILURE(InitState());
1305
1306 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00669);
1307 VkBuffer buffer;
1308 VkBufferCreateInfo buf_info = {};
1309 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1310 buf_info.pNext = NULL;
1311 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
1312 buf_info.size = 2048;
1313 buf_info.queueFamilyIndexCount = 0;
1314 buf_info.pQueueFamilyIndices = NULL;
1315 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1316 buf_info.flags = VK_BUFFER_CREATE_SPARSE_RESIDENCY_BIT;
1317 vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1318 m_errorMonitor->VerifyFound();
1319
1320 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02160);
1321 VkImage image;
1322 VkImageCreateInfo image_create_info = {};
1323 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1324 image_create_info.pNext = NULL;
1325 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1326 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1327 image_create_info.extent.width = 512;
1328 image_create_info.extent.height = 64;
1329 image_create_info.extent.depth = 1;
1330 image_create_info.mipLevels = 1;
1331 image_create_info.arrayLayers = 1;
1332 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1333 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1334 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1335 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1336 image_create_info.queueFamilyIndexCount = 0;
1337 image_create_info.pQueueFamilyIndices = NULL;
1338 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1339 image_create_info.flags = VK_BUFFER_CREATE_SPARSE_ALIASED_BIT;
1340 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1341 m_errorMonitor->VerifyFound();
1342}
1343
Dave Houlton829c0d82017-01-24 15:09:17 -07001344TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedTypes) {
1345 TEST_DESCRIPTION("Create images with sparse residency with unsupported types");
1346
1347 // Determine which device feature are available
1348 VkPhysicalDeviceFeatures available_features;
1349 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&available_features));
1350
1351 // Mask out device features we don't want
1352 VkPhysicalDeviceFeatures desired_features = available_features;
1353 desired_features.sparseResidencyImage2D = VK_FALSE;
1354 desired_features.sparseResidencyImage3D = VK_FALSE;
1355 ASSERT_NO_FATAL_FAILURE(InitState(&desired_features));
1356
1357 VkImage image = VK_NULL_HANDLE;
1358 VkResult result = VK_RESULT_MAX_ENUM;
1359 VkImageCreateInfo image_create_info = {};
1360 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1361 image_create_info.pNext = NULL;
1362 image_create_info.imageType = VK_IMAGE_TYPE_1D;
1363 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1364 image_create_info.extent.width = 512;
1365 image_create_info.extent.height = 1;
1366 image_create_info.extent.depth = 1;
1367 image_create_info.mipLevels = 1;
1368 image_create_info.arrayLayers = 1;
1369 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1370 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1371 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1372 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1373 image_create_info.queueFamilyIndexCount = 0;
1374 image_create_info.pQueueFamilyIndices = NULL;
1375 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1376 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1377
1378 // 1D image w/ sparse residency is an error
1379 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02352);
1380 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1381 m_errorMonitor->VerifyFound();
1382 if (VK_SUCCESS == result) {
1383 vkDestroyImage(m_device->device(), image, NULL);
1384 image = VK_NULL_HANDLE;
1385 }
1386
1387 // 2D image w/ sparse residency when feature isn't available
1388 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1389 image_create_info.extent.height = 64;
1390 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02144);
1391 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1392 m_errorMonitor->VerifyFound();
1393 if (VK_SUCCESS == result) {
1394 vkDestroyImage(m_device->device(), image, NULL);
1395 image = VK_NULL_HANDLE;
1396 }
1397
1398 // 3D image w/ sparse residency when feature isn't available
1399 image_create_info.imageType = VK_IMAGE_TYPE_3D;
1400 image_create_info.extent.depth = 8;
1401 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02145);
1402 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1403 m_errorMonitor->VerifyFound();
1404 if (VK_SUCCESS == result) {
1405 vkDestroyImage(m_device->device(), image, NULL);
1406 image = VK_NULL_HANDLE;
1407 }
1408}
1409
1410TEST_F(VkLayerTest, SparseResidencyImageCreateUnsupportedSamples) {
1411 TEST_DESCRIPTION("Create images with sparse residency with unsupported tiling or sample counts");
1412
1413 // Determine which device feature are available
1414 VkPhysicalDeviceFeatures available_features;
1415 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&available_features));
1416
1417 // These tests all require that the device support sparse residency for 2D images
1418 if (VK_TRUE != available_features.sparseResidencyImage2D) {
1419 return;
1420 }
1421
1422 // Mask out device features we don't want
1423 VkPhysicalDeviceFeatures desired_features = available_features;
1424 desired_features.sparseResidency2Samples = VK_FALSE;
1425 desired_features.sparseResidency4Samples = VK_FALSE;
1426 desired_features.sparseResidency8Samples = VK_FALSE;
1427 desired_features.sparseResidency16Samples = VK_FALSE;
1428 ASSERT_NO_FATAL_FAILURE(InitState(&desired_features));
1429
1430 VkImage image = VK_NULL_HANDLE;
1431 VkResult result = VK_RESULT_MAX_ENUM;
1432 VkImageCreateInfo image_create_info = {};
1433 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1434 image_create_info.pNext = NULL;
1435 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1436 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1437 image_create_info.extent.width = 64;
1438 image_create_info.extent.height = 64;
1439 image_create_info.extent.depth = 1;
1440 image_create_info.mipLevels = 1;
1441 image_create_info.arrayLayers = 1;
1442 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
1443 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
1444 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1445 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1446 image_create_info.queueFamilyIndexCount = 0;
1447 image_create_info.pQueueFamilyIndices = NULL;
1448 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1449 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT | VK_BUFFER_CREATE_SPARSE_BINDING_BIT;
1450
1451 // 2D image w/ sparse residency and linear tiling is an error
1452 m_errorMonitor->SetDesiredFailureMsg(
1453 VK_DEBUG_REPORT_ERROR_BIT_EXT,
1454 "VK_IMAGE_CREATE_SPARSE_RESIDENCY_BIT then image tiling of VK_IMAGE_TILING_LINEAR is not supported");
1455 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1456 m_errorMonitor->VerifyFound();
1457 if (VK_SUCCESS == result) {
1458 vkDestroyImage(m_device->device(), image, NULL);
1459 image = VK_NULL_HANDLE;
1460 }
1461 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
1462
1463 // Multi-sample image w/ sparse residency when feature isn't available (4 flavors)
1464 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
1465 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02146);
1466 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1467 m_errorMonitor->VerifyFound();
1468 if (VK_SUCCESS == result) {
1469 vkDestroyImage(m_device->device(), image, NULL);
1470 image = VK_NULL_HANDLE;
1471 }
1472
1473 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
1474 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02147);
1475 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1476 m_errorMonitor->VerifyFound();
1477 if (VK_SUCCESS == result) {
1478 vkDestroyImage(m_device->device(), image, NULL);
1479 image = VK_NULL_HANDLE;
1480 }
1481
1482 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
1483 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02148);
1484 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1485 m_errorMonitor->VerifyFound();
1486 if (VK_SUCCESS == result) {
1487 vkDestroyImage(m_device->device(), image, NULL);
1488 image = VK_NULL_HANDLE;
1489 }
1490
1491 image_create_info.samples = VK_SAMPLE_COUNT_16_BIT;
1492 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02149);
1493 result = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1494 m_errorMonitor->VerifyFound();
1495 if (VK_SUCCESS == result) {
1496 vkDestroyImage(m_device->device(), image, NULL);
1497 image = VK_NULL_HANDLE;
1498 }
1499}
1500
Tobin Ehlisf11be982016-05-11 13:52:53 -06001501TEST_F(VkLayerTest, InvalidMemoryAliasing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001502 TEST_DESCRIPTION(
1503 "Create a buffer and image, allocate memory, and bind the "
1504 "buffer and image to memory such that they will alias.");
Tobin Ehlisf11be982016-05-11 13:52:53 -06001505 VkResult err;
1506 bool pass;
1507 ASSERT_NO_FATAL_FAILURE(InitState());
1508
Tobin Ehlis077ded32016-05-12 17:39:13 -06001509 VkBuffer buffer, buffer2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001510 VkImage image;
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001511 VkImage image2;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001512 VkDeviceMemory mem; // buffer will be bound first
1513 VkDeviceMemory mem_img; // image bound first
Tobin Ehlis077ded32016-05-12 17:39:13 -06001514 VkMemoryRequirements buff_mem_reqs, img_mem_reqs;
Rene Lindsayd14f5572016-12-16 14:57:18 -07001515 VkMemoryRequirements buff_mem_reqs2, img_mem_reqs2;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001516
1517 VkBufferCreateInfo buf_info = {};
1518 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1519 buf_info.pNext = NULL;
1520 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1521 buf_info.size = 256;
1522 buf_info.queueFamilyIndexCount = 0;
1523 buf_info.pQueueFamilyIndices = NULL;
1524 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1525 buf_info.flags = 0;
1526 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1527 ASSERT_VK_SUCCESS(err);
1528
Tobin Ehlis077ded32016-05-12 17:39:13 -06001529 vkGetBufferMemoryRequirements(m_device->device(), buffer, &buff_mem_reqs);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001530
1531 VkImageCreateInfo image_create_info = {};
1532 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
1533 image_create_info.pNext = NULL;
1534 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1535 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
1536 image_create_info.extent.width = 64;
1537 image_create_info.extent.height = 64;
1538 image_create_info.extent.depth = 1;
1539 image_create_info.mipLevels = 1;
1540 image_create_info.arrayLayers = 1;
1541 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis12a4b5e2016-08-08 12:33:11 -06001542 // Image tiling must be optimal to trigger error when aliasing linear buffer
1543 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisf11be982016-05-11 13:52:53 -06001544 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
1545 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
1546 image_create_info.queueFamilyIndexCount = 0;
1547 image_create_info.pQueueFamilyIndices = NULL;
1548 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1549 image_create_info.flags = 0;
1550
Tobin Ehlisf11be982016-05-11 13:52:53 -06001551 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
1552 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001553 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
1554 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001555
Tobin Ehlis077ded32016-05-12 17:39:13 -06001556 vkGetImageMemoryRequirements(m_device->device(), image, &img_mem_reqs);
1557
1558 VkMemoryAllocateInfo alloc_info = {};
1559 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1560 alloc_info.pNext = NULL;
1561 alloc_info.memoryTypeIndex = 0;
1562 // Ensure memory is big enough for both bindings
1563 alloc_info.allocationSize = buff_mem_reqs.size + img_mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001564 pass = m_device->phy().set_memory_type(buff_mem_reqs.memoryTypeBits & img_mem_reqs.memoryTypeBits, &alloc_info,
1565 VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001566 if (!pass) {
Tobin Ehlis077ded32016-05-12 17:39:13 -06001567 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001568 vkDestroyImage(m_device->device(), image, NULL);
Mark Lobodzinskid2d2d4c2017-02-16 11:51:58 -07001569 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001570 return;
1571 }
Tobin Ehlis077ded32016-05-12 17:39:13 -06001572 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1573 ASSERT_VK_SUCCESS(err);
1574 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
1575 ASSERT_VK_SUCCESS(err);
1576
Rene Lindsayd14f5572016-12-16 14:57:18 -07001577 vkGetImageMemoryRequirements(m_device->device(), image2, &img_mem_reqs2);
1578
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001579 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " is aliased with linear buffer 0x");
Tobin Ehlis077ded32016-05-12 17:39:13 -06001580 // VALIDATION FAILURE due to image mapping overlapping buffer mapping
Tobin Ehlisf11be982016-05-11 13:52:53 -06001581 err = vkBindImageMemory(m_device->device(), image, mem, 0);
1582 m_errorMonitor->VerifyFound();
1583
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001584 // Now correctly bind image2 to second mem allocation before incorrectly
Tobin Ehlis077ded32016-05-12 17:39:13 -06001585 // aliasing buffer2
1586 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer2);
1587 ASSERT_VK_SUCCESS(err);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001588 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem_img);
1589 ASSERT_VK_SUCCESS(err);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001590 err = vkBindImageMemory(m_device->device(), image2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001591 ASSERT_VK_SUCCESS(err);
Tobin Ehlis32b2bbc2016-12-13 17:33:41 -07001592 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "is aliased with non-linear image 0x");
Rene Lindsayd14f5572016-12-16 14:57:18 -07001593 vkGetBufferMemoryRequirements(m_device->device(), buffer2, &buff_mem_reqs2);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001594 err = vkBindBufferMemory(m_device->device(), buffer2, mem_img, 0);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001595 m_errorMonitor->VerifyFound();
1596
1597 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tobin Ehlis077ded32016-05-12 17:39:13 -06001598 vkDestroyBuffer(m_device->device(), buffer2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001599 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlis6cd67182016-09-21 18:32:11 -06001600 vkDestroyImage(m_device->device(), image2, NULL);
Tobin Ehlisf11be982016-05-11 13:52:53 -06001601 vkFreeMemory(m_device->device(), mem, NULL);
1602 vkFreeMemory(m_device->device(), mem_img, NULL);
1603}
1604
Tobin Ehlis35372522016-05-12 08:32:31 -06001605TEST_F(VkLayerTest, InvalidMemoryMapping) {
1606 TEST_DESCRIPTION("Attempt to map memory in a number of incorrect ways");
1607 VkResult err;
1608 bool pass;
1609 ASSERT_NO_FATAL_FAILURE(InitState());
1610
1611 VkBuffer buffer;
1612 VkDeviceMemory mem;
1613 VkMemoryRequirements mem_reqs;
1614
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001615 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
1616
Tobin Ehlis35372522016-05-12 08:32:31 -06001617 VkBufferCreateInfo buf_info = {};
1618 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
1619 buf_info.pNext = NULL;
1620 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
1621 buf_info.size = 256;
1622 buf_info.queueFamilyIndexCount = 0;
1623 buf_info.pQueueFamilyIndices = NULL;
1624 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
1625 buf_info.flags = 0;
1626 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
1627 ASSERT_VK_SUCCESS(err);
1628
1629 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
1630 VkMemoryAllocateInfo alloc_info = {};
1631 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
1632 alloc_info.pNext = NULL;
1633 alloc_info.memoryTypeIndex = 0;
1634
1635 // Ensure memory is big enough for both bindings
1636 static const VkDeviceSize allocation_size = 0x10000;
1637 alloc_info.allocationSize = allocation_size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001638 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 -06001639 if (!pass) {
1640 vkDestroyBuffer(m_device->device(), buffer, NULL);
1641 return;
1642 }
1643 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
1644 ASSERT_VK_SUCCESS(err);
1645
1646 uint8_t *pData;
1647 // Attempt to map memory size 0 is invalid
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001648 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 -06001649 err = vkMapMemory(m_device->device(), mem, 0, 0, 0, (void **)&pData);
1650 m_errorMonitor->VerifyFound();
1651 // Map memory twice
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001652 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001653 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001654 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1655 "VkMapMemory: Attempting to map memory on an already-mapped object ");
1656 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001657 m_errorMonitor->VerifyFound();
1658
1659 // Unmap the memory to avoid re-map error
1660 vkUnmapMemory(m_device->device(), mem);
1661 // overstep allocation with VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001662 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1663 " with size of VK_WHOLE_SIZE oversteps total array size 0x");
1664 err = vkMapMemory(m_device->device(), mem, allocation_size + 1, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001665 m_errorMonitor->VerifyFound();
1666 // overstep allocation w/o VK_WHOLE_SIZE
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001667 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " oversteps total array size 0x");
1668 err = vkMapMemory(m_device->device(), mem, 1, allocation_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001669 m_errorMonitor->VerifyFound();
1670 // Now error due to unmapping memory that's not mapped
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001671 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Unmapping Memory without memory being mapped: ");
Tobin Ehlis35372522016-05-12 08:32:31 -06001672 vkUnmapMemory(m_device->device(), mem);
1673 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001674
Tobin Ehlis35372522016-05-12 08:32:31 -06001675 // Now map memory and cause errors due to flushing invalid ranges
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001676 err = vkMapMemory(m_device->device(), mem, 4 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001677 ASSERT_VK_SUCCESS(err);
1678 VkMappedMemoryRange mmr = {};
Chris Forbes3aec0892016-06-13 10:29:26 +12001679 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
Tobin Ehlis35372522016-05-12 08:32:31 -06001680 mmr.memory = mem;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001681 mmr.offset = atom_size; // Error b/c offset less than offset of mapped mem
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001682 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
Tobin Ehlis35372522016-05-12 08:32:31 -06001683 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1684 m_errorMonitor->VerifyFound();
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001685
Tobin Ehlis35372522016-05-12 08:32:31 -06001686 // Now flush range that oversteps mapped range
1687 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001688 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
Tobin Ehlis35372522016-05-12 08:32:31 -06001689 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001690 mmr.offset = atom_size;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001691 mmr.size = 4 * atom_size; // Flushing bounds exceed mapped bounds
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001692 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00642);
1693 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1694 m_errorMonitor->VerifyFound();
1695
1696 // Now flush range with VK_WHOLE_SIZE that oversteps offset
1697 vkUnmapMemory(m_device->device(), mem);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001698 err = vkMapMemory(m_device->device(), mem, 2 * atom_size, 4 * atom_size, 0, (void **)&pData);
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001699 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski65741a42016-11-15 09:14:24 -07001700 mmr.offset = atom_size;
Mark Lobodzinskib3c675e2016-11-15 08:56:03 -07001701 mmr.size = VK_WHOLE_SIZE;
1702 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00643);
Tobin Ehlis35372522016-05-12 08:32:31 -06001703 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1704 m_errorMonitor->VerifyFound();
1705
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001706#if 0 // Planning discussion with working group on this validation check.
Mark Lobodzinski3826a4f2016-11-15 09:38:51 -07001707 // Some platforms have an atomsize of 1 which makes the test meaningless
1708 if (atom_size > 3) {
1709 // Now with an offset NOT a multiple of the device limit
1710 vkUnmapMemory(m_device->device(), mem);
1711 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1712 ASSERT_VK_SUCCESS(err);
1713 mmr.offset = 3; // Not a multiple of atom_size
1714 mmr.size = VK_WHOLE_SIZE;
1715 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00644);
1716 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1717 m_errorMonitor->VerifyFound();
1718
1719 // Now with a size NOT a multiple of the device limit
1720 vkUnmapMemory(m_device->device(), mem);
1721 err = vkMapMemory(m_device->device(), mem, 0, 4 * atom_size, 0, (void **)&pData);
1722 ASSERT_VK_SUCCESS(err);
1723 mmr.offset = atom_size;
1724 mmr.size = 2 * atom_size + 1; // Not a multiple of atom_size
1725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00645);
1726 vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
1727 m_errorMonitor->VerifyFound();
1728 }
Tony Barboure3975eb2016-12-15 14:52:44 -07001729#endif
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001730 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT,
1731 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Tobin Ehlis35372522016-05-12 08:32:31 -06001732 if (!pass) {
1733 vkFreeMemory(m_device->device(), mem, NULL);
1734 vkDestroyBuffer(m_device->device(), buffer, NULL);
1735 return;
1736 }
1737 // TODO : If we can get HOST_VISIBLE w/o HOST_COHERENT we can test cases of
1738 // MEMTRACK_INVALID_MAP in validateAndCopyNoncoherentMemoryToDriver()
1739
1740 vkDestroyBuffer(m_device->device(), buffer, NULL);
1741 vkFreeMemory(m_device->device(), mem, NULL);
1742}
1743
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001744#if 0 // disabled until PV gets real extension enable checks
Ian Elliott1c32c772016-04-28 14:47:13 -06001745TEST_F(VkLayerTest, EnableWsiBeforeUse) {
1746 VkResult err;
1747 bool pass;
1748
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001749 // FIXME: After we turn on this code for non-Linux platforms, uncomment the
1750 // following declaration (which is temporarily being moved below):
1751 // VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott1c32c772016-04-28 14:47:13 -06001752 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001753 VkSwapchainCreateInfoKHR swapchain_create_info = {VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR};
Ian Elliott1c32c772016-04-28 14:47:13 -06001754 uint32_t swapchain_image_count = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001755 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
Ian Elliott1c32c772016-04-28 14:47:13 -06001756 uint32_t image_index = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001757 // VkPresentInfoKHR present_info = {};
Ian Elliott1c32c772016-04-28 14:47:13 -06001758
1759 ASSERT_NO_FATAL_FAILURE(InitState());
1760
Ian Elliott3f06ce52016-04-29 14:46:21 -06001761#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
1762#if defined(VK_USE_PLATFORM_ANDROID_KHR)
1763 // Use the functions from the VK_KHR_android_surface extension without
1764 // enabling that extension:
1765
1766 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001767 VkAndroidSurfaceCreateInfoKHR android_create_info = {VK_STRUCTURE_TYPE_ANDROID_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001768 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1769 err = vkCreateAndroidSurfaceKHR(instance(), &android_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001770 pass = (err != VK_SUCCESS);
1771 ASSERT_TRUE(pass);
1772 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001773#endif // VK_USE_PLATFORM_ANDROID_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001774
Ian Elliott3f06ce52016-04-29 14:46:21 -06001775#if defined(VK_USE_PLATFORM_MIR_KHR)
1776 // Use the functions from the VK_KHR_mir_surface extension without enabling
1777 // that extension:
1778
1779 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001780 VkMirSurfaceCreateInfoKHR mir_create_info = {VK_STRUCTURE_TYPE_MIR_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001781 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott3f06ce52016-04-29 14:46:21 -06001782 err = vkCreateMirSurfaceKHR(instance(), &mir_create_info, NULL, &surface);
1783 pass = (err != VK_SUCCESS);
1784 ASSERT_TRUE(pass);
1785 m_errorMonitor->VerifyFound();
1786
1787 // Tell whether an mir_connection supports presentation:
1788 MirConnection *mir_connection = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001789 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1790 vkGetPhysicalDeviceMirPresentationSupportKHR(gpu(), 0, mir_connection, visual_id);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001791 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001792#endif // VK_USE_PLATFORM_MIR_KHR
Ian Elliott3f06ce52016-04-29 14:46:21 -06001793
Ian Elliott3f06ce52016-04-29 14:46:21 -06001794#if defined(VK_USE_PLATFORM_WAYLAND_KHR)
1795 // Use the functions from the VK_KHR_wayland_surface extension without
1796 // enabling that extension:
1797
1798 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001799 VkWaylandSurfaceCreateInfoKHR wayland_create_info = {VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001800 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1801 err = vkCreateWaylandSurfaceKHR(instance(), &wayland_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001802 pass = (err != VK_SUCCESS);
1803 ASSERT_TRUE(pass);
1804 m_errorMonitor->VerifyFound();
1805
1806 // Tell whether an wayland_display supports presentation:
1807 struct wl_display wayland_display = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001808 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1809 vkGetPhysicalDeviceWaylandPresentationSupportKHR(gpu(), 0, &wayland_display);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001810 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001811#endif // VK_USE_PLATFORM_WAYLAND_KHR
1812#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott3f06ce52016-04-29 14:46:21 -06001813
Ian Elliott3f06ce52016-04-29 14:46:21 -06001814#if defined(VK_USE_PLATFORM_WIN32_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001815 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1816 // TO NON-LINUX PLATFORMS:
1817 VkSurfaceKHR surface = VK_NULL_HANDLE;
Ian Elliott3f06ce52016-04-29 14:46:21 -06001818 // Use the functions from the VK_KHR_win32_surface extension without
1819 // enabling that extension:
1820
1821 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001822 VkWin32SurfaceCreateInfoKHR win32_create_info = {VK_STRUCTURE_TYPE_WIN32_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001823 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1824 err = vkCreateWin32SurfaceKHR(instance(), &win32_create_info, NULL, &surface);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001825 pass = (err != VK_SUCCESS);
1826 ASSERT_TRUE(pass);
1827 m_errorMonitor->VerifyFound();
1828
1829 // Tell whether win32 supports presentation:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001830 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott489eec02016-05-05 14:12:44 -06001831 vkGetPhysicalDeviceWin32PresentationSupportKHR(gpu(), 0);
Ian Elliott3f06ce52016-04-29 14:46:21 -06001832 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001833// Set this (for now, until all platforms are supported and tested):
1834#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001835#endif // VK_USE_PLATFORM_WIN32_KHR
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07001836#if defined(VK_USE_PLATFORM_XCB_KHR) || defined(VK_USE_PLATFORM_XLIB_KHR)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001837 // FIXME: REMOVE THIS HERE, AND UNCOMMENT ABOVE, WHEN THIS TEST HAS BEEN PORTED
1838 // TO NON-LINUX PLATFORMS:
1839 VkSurfaceKHR surface = VK_NULL_HANDLE;
Tony Barbour2e7bd402016-11-14 14:46:33 -07001840#endif
1841#if defined(VK_USE_PLATFORM_XCB_KHR)
Ian Elliott1c32c772016-04-28 14:47:13 -06001842 // Use the functions from the VK_KHR_xcb_surface extension without enabling
1843 // that extension:
1844
1845 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001846 VkXcbSurfaceCreateInfoKHR xcb_create_info = {VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001847 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001848 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
1849 pass = (err != VK_SUCCESS);
1850 ASSERT_TRUE(pass);
1851 m_errorMonitor->VerifyFound();
1852
1853 // Tell whether an xcb_visualid_t supports presentation:
Ian Elliott3f06ce52016-04-29 14:46:21 -06001854 xcb_connection_t *xcb_connection = NULL;
Ian Elliott1c32c772016-04-28 14:47:13 -06001855 xcb_visualid_t visual_id = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1857 vkGetPhysicalDeviceXcbPresentationSupportKHR(gpu(), 0, xcb_connection, visual_id);
Ian Elliott1c32c772016-04-28 14:47:13 -06001858 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001859// Set this (for now, until all platforms are supported and tested):
1860#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001861#endif // VK_USE_PLATFORM_XCB_KHR
Ian Elliott1c32c772016-04-28 14:47:13 -06001862
Ian Elliott12630812016-04-29 14:35:43 -06001863#if defined(VK_USE_PLATFORM_XLIB_KHR)
1864 // Use the functions from the VK_KHR_xlib_surface extension without enabling
1865 // that extension:
1866
1867 // Create a surface:
Chris Forbes0ad0ee12016-11-02 17:25:01 +13001868 VkXlibSurfaceCreateInfoKHR xlib_create_info = {VK_STRUCTURE_TYPE_XLIB_SURFACE_CREATE_INFO_KHR};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001869 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001870 err = vkCreateXlibSurfaceKHR(instance(), &xlib_create_info, NULL, &surface);
1871 pass = (err != VK_SUCCESS);
1872 ASSERT_TRUE(pass);
1873 m_errorMonitor->VerifyFound();
1874
1875 // Tell whether an Xlib VisualID supports presentation:
1876 Display *dpy = NULL;
1877 VisualID visual = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001878 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott12630812016-04-29 14:35:43 -06001879 vkGetPhysicalDeviceXlibPresentationSupportKHR(gpu(), 0, dpy, visual);
1880 m_errorMonitor->VerifyFound();
Ian Elliott489eec02016-05-05 14:12:44 -06001881// Set this (for now, until all platforms are supported and tested):
1882#define NEED_TO_TEST_THIS_ON_PLATFORM
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001883#endif // VK_USE_PLATFORM_XLIB_KHR
Ian Elliott12630812016-04-29 14:35:43 -06001884
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001885// Use the functions from the VK_KHR_surface extension without enabling
1886// that extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001887
Ian Elliott489eec02016-05-05 14:12:44 -06001888#ifdef NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001889 // Destroy a surface:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001890 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001891 vkDestroySurfaceKHR(instance(), surface, NULL);
1892 m_errorMonitor->VerifyFound();
1893
1894 // Check if surface supports presentation:
1895 VkBool32 supported = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001896 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001897 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
1898 pass = (err != VK_SUCCESS);
1899 ASSERT_TRUE(pass);
1900 m_errorMonitor->VerifyFound();
1901
1902 // Check surface capabilities:
1903 VkSurfaceCapabilitiesKHR capabilities = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001904 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1905 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &capabilities);
Ian Elliott1c32c772016-04-28 14:47:13 -06001906 pass = (err != VK_SUCCESS);
1907 ASSERT_TRUE(pass);
1908 m_errorMonitor->VerifyFound();
1909
1910 // Check surface formats:
1911 uint32_t format_count = 0;
1912 VkSurfaceFormatKHR *formats = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001913 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1914 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &format_count, formats);
Ian Elliott1c32c772016-04-28 14:47:13 -06001915 pass = (err != VK_SUCCESS);
1916 ASSERT_TRUE(pass);
1917 m_errorMonitor->VerifyFound();
1918
1919 // Check surface present modes:
1920 uint32_t present_mode_count = 0;
1921 VkSurfaceFormatKHR *present_modes = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001922 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1923 err = vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &present_mode_count, present_modes);
Ian Elliott1c32c772016-04-28 14:47:13 -06001924 pass = (err != VK_SUCCESS);
1925 ASSERT_TRUE(pass);
1926 m_errorMonitor->VerifyFound();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07001927#endif // NEED_TO_TEST_THIS_ON_PLATFORM
Ian Elliott1c32c772016-04-28 14:47:13 -06001928
Ian Elliott1c32c772016-04-28 14:47:13 -06001929 // Use the functions from the VK_KHR_swapchain extension without enabling
1930 // that extension:
1931
1932 // Create a swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001933 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001934 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
1935 swapchain_create_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001936 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
Ian Elliott1c32c772016-04-28 14:47:13 -06001937 pass = (err != VK_SUCCESS);
1938 ASSERT_TRUE(pass);
1939 m_errorMonitor->VerifyFound();
1940
1941 // Get the images from the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001942 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
1943 err = vkGetSwapchainImagesKHR(m_device->device(), swapchain, &swapchain_image_count, NULL);
Ian Elliott1c32c772016-04-28 14:47:13 -06001944 pass = (err != VK_SUCCESS);
1945 ASSERT_TRUE(pass);
1946 m_errorMonitor->VerifyFound();
1947
Chris Forbeseb7d5502016-09-13 18:19:21 +12001948 // Add a fence to avoid (justifiable) error about not providing fence OR semaphore
1949 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
1950 VkFence fence;
1951 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
1952
Ian Elliott1c32c772016-04-28 14:47:13 -06001953 // Try to acquire an image:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001954 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Chris Forbeseb7d5502016-09-13 18:19:21 +12001955 err = vkAcquireNextImageKHR(m_device->device(), swapchain, 0, VK_NULL_HANDLE, fence, &image_index);
Ian Elliott1c32c772016-04-28 14:47:13 -06001956 pass = (err != VK_SUCCESS);
1957 ASSERT_TRUE(pass);
1958 m_errorMonitor->VerifyFound();
1959
Chris Forbeseb7d5502016-09-13 18:19:21 +12001960 vkDestroyFence(m_device->device(), fence, nullptr);
1961
Ian Elliott1c32c772016-04-28 14:47:13 -06001962 // Try to present an image:
Ian Elliott2c1daf52016-05-12 09:41:46 -06001963 //
1964 // NOTE: Currently can't test this because a real swapchain is needed (as
1965 // opposed to the fake one we created) in order for the layer to lookup the
1966 // VkDevice used to enable the extension:
Ian Elliott1c32c772016-04-28 14:47:13 -06001967
1968 // Destroy the swapchain:
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001969 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "extension was not enabled for this");
Ian Elliott1c32c772016-04-28 14:47:13 -06001970 vkDestroySwapchainKHR(m_device->device(), swapchain, NULL);
1971 m_errorMonitor->VerifyFound();
1972}
Chris Forbes09368e42016-10-13 11:59:22 +13001973#endif
Ian Elliott1c32c772016-04-28 14:47:13 -06001974
Karl Schultz6addd812016-02-02 17:17:23 -07001975TEST_F(VkLayerTest, MapMemWithoutHostVisibleBit) {
1976 VkResult err;
1977 bool pass;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001978
Mark Lobodzinskice751c62016-09-08 10:45:35 -06001979 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
1980 "Mapping Memory without VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06001981
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001982 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001983
1984 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07001985 VkImage image;
1986 VkDeviceMemory mem;
1987 VkMemoryRequirements mem_reqs;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001988
Karl Schultz6addd812016-02-02 17:17:23 -07001989 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
1990 const int32_t tex_width = 32;
1991 const int32_t tex_height = 32;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05001992
Tony Barboureb254902015-07-15 12:50:33 -06001993 VkImageCreateInfo image_create_info = {};
1994 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07001995 image_create_info.pNext = NULL;
1996 image_create_info.imageType = VK_IMAGE_TYPE_2D;
1997 image_create_info.format = tex_format;
1998 image_create_info.extent.width = tex_width;
1999 image_create_info.extent.height = tex_height;
2000 image_create_info.extent.depth = 1;
2001 image_create_info.mipLevels = 1;
2002 image_create_info.arrayLayers = 1;
2003 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2004 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2005 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2006 image_create_info.flags = 0;
Chris Forbese65e4d02016-09-13 17:39:18 +12002007 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002008
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002009 VkMemoryAllocateInfo mem_alloc = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002010 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -07002011 mem_alloc.pNext = NULL;
2012 mem_alloc.allocationSize = 0;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002013
Chia-I Wuf7458c52015-10-26 21:10:41 +08002014 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002015 ASSERT_VK_SUCCESS(err);
2016
Karl Schultz6addd812016-02-02 17:17:23 -07002017 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002018
Mark Lobodzinski23065352015-05-29 09:32:35 -05002019 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002020
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002021 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 -07002022 if (!pass) { // If we can't find any unmappable memory this test doesn't
2023 // make sense
Chia-I Wuf7458c52015-10-26 21:10:41 +08002024 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbour02fdc7d2015-08-04 16:13:01 -06002025 return;
Mike Stroyand1c84a52015-08-18 14:40:24 -06002026 }
Mike Stroyan713b2d72015-08-04 10:49:29 -06002027
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002028 // allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002029 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002030 ASSERT_VK_SUCCESS(err);
2031
2032 // Try to bind free memory that has been freed
Tony Barbour67e99152015-07-10 14:10:27 -06002033 err = vkBindImageMemory(m_device->device(), image, mem, 0);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002034 ASSERT_VK_SUCCESS(err);
2035
2036 // Map memory as if to initialize the image
2037 void *mappedAddress = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002038 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, &mappedAddress);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002039
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002040 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002041
Chia-I Wuf7458c52015-10-26 21:10:41 +08002042 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06002043 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002044}
2045
Karl Schultz6addd812016-02-02 17:17:23 -07002046TEST_F(VkLayerTest, RebindMemory) {
2047 VkResult err;
2048 bool pass;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002049
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002050 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which has already been bound to mem object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002051
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002052 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002053
2054 // Create an image, allocate memory, free it, and then try to bind it
Karl Schultz6addd812016-02-02 17:17:23 -07002055 VkImage image;
2056 VkDeviceMemory mem1;
2057 VkDeviceMemory mem2;
2058 VkMemoryRequirements mem_reqs;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002059
Karl Schultz6addd812016-02-02 17:17:23 -07002060 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2061 const int32_t tex_width = 32;
2062 const int32_t tex_height = 32;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002063
Tony Barboureb254902015-07-15 12:50:33 -06002064 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002065 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2066 image_create_info.pNext = NULL;
2067 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2068 image_create_info.format = tex_format;
2069 image_create_info.extent.width = tex_width;
2070 image_create_info.extent.height = tex_height;
2071 image_create_info.extent.depth = 1;
2072 image_create_info.mipLevels = 1;
2073 image_create_info.arrayLayers = 1;
2074 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2075 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2076 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2077 image_create_info.flags = 0;
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002078
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002079 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002080 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2081 mem_alloc.pNext = NULL;
2082 mem_alloc.allocationSize = 0;
2083 mem_alloc.memoryTypeIndex = 0;
Tony Barboureb254902015-07-15 12:50:33 -06002084
Karl Schultz6addd812016-02-02 17:17:23 -07002085 // Introduce failure, do NOT set memProps to
2086 // VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT
Tony Barboureb254902015-07-15 12:50:33 -06002087 mem_alloc.memoryTypeIndex = 1;
Chia-I Wuf7458c52015-10-26 21:10:41 +08002088 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002089 ASSERT_VK_SUCCESS(err);
2090
Karl Schultz6addd812016-02-02 17:17:23 -07002091 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002092
2093 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002094 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002095 ASSERT_TRUE(pass);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002096
2097 // allocate 2 memory objects
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002098 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem1);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002099 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002100 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem2);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002101 ASSERT_VK_SUCCESS(err);
2102
2103 // Bind first memory object to Image object
Tony Barbour67e99152015-07-10 14:10:27 -06002104 err = vkBindImageMemory(m_device->device(), image, mem1, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002105 ASSERT_VK_SUCCESS(err);
2106
Karl Schultz6addd812016-02-02 17:17:23 -07002107 // Introduce validation failure, try to bind a different memory object to
2108 // the same image object
Tony Barbour67e99152015-07-10 14:10:27 -06002109 err = vkBindImageMemory(m_device->device(), image, mem2, 0);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002110
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002111 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002112
Chia-I Wuf7458c52015-10-26 21:10:41 +08002113 vkDestroyImage(m_device->device(), image, NULL);
2114 vkFreeMemory(m_device->device(), mem1, NULL);
2115 vkFreeMemory(m_device->device(), mem2, NULL);
Mark Lobodzinski944aab12015-06-05 13:59:04 -05002116}
Mark Lobodzinski3780e142015-05-14 15:08:13 -05002117
Karl Schultz6addd812016-02-02 17:17:23 -07002118TEST_F(VkLayerTest, SubmitSignaledFence) {
Courtney Goeltzenleuchterd8e229c2015-04-08 15:36:08 -06002119 vk_testing::Fence testFence;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002120
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002121 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
2122 "submitted in SIGNALED state. Fences "
2123 "must be reset before being submitted");
Courtney Goeltzenleuchterfb4efc62015-04-10 08:34:15 -06002124
2125 VkFenceCreateInfo fenceInfo = {};
Tony Barbour0b4d9562015-04-09 10:48:04 -06002126 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2127 fenceInfo.pNext = NULL;
2128 fenceInfo.flags = VK_FENCE_CREATE_SIGNALED_BIT;
Tony Barbour300a6082015-04-07 13:44:53 -06002129
Tony Barbour300a6082015-04-07 13:44:53 -06002130 ASSERT_NO_FATAL_FAILURE(InitState());
2131 ASSERT_NO_FATAL_FAILURE(InitViewport());
2132 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2133
Tony Barbour552f6c02016-12-21 14:34:07 -07002134 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002135 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07002136 m_commandBuffer->EndCommandBuffer();
Tony Barbour300a6082015-04-07 13:44:53 -06002137
2138 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002139
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002140 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08002141 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
2142 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002143 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002144 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07002145 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08002146 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002147 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08002148 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06002149 submit_info.pSignalSemaphores = NULL;
Courtney Goeltzenleuchter646b9072015-10-20 18:04:07 -06002150
2151 vkQueueSubmit(m_device->m_queue, 1, &submit_info, testFence.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07002152 vkQueueWaitIdle(m_device->m_queue);
Mark Lobodzinski5fcc4212015-09-14 17:43:42 -06002153
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002154 m_errorMonitor->VerifyFound();
Tony Barbour0b4d9562015-04-09 10:48:04 -06002155}
Chris Forbes4e44c912016-06-16 10:20:00 +12002156
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002157TEST_F(VkLayerTest, InvalidUsageBits) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002158 TEST_DESCRIPTION(
2159 "Specify wrong usage for image then create conflicting view of image "
2160 "Initialize buffer with wrong usage then perform copy expecting errors "
2161 "from both the image and the buffer (2 calls)");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002162 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid usage flag for image ");
Tobin Ehlis41376e12015-07-03 08:45:14 -06002163
2164 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002165
Tony Barbourf887b162017-03-09 10:06:46 -07002166 auto format = find_depth_stencil_format(m_device);
2167 if (!format) {
2168 printf(" No Depth + Stencil format found. Skipped.\n");
2169 return;
2170 }
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002171
Tony Barbourf92621a2016-05-02 14:28:12 -06002172 VkImageObj image(m_device);
Tony Barbour75d79f02016-08-30 09:39:07 -06002173 // Initialize image with USAGE_TRANSIENT_ATTACHMENT
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002174 image.init(128, 128, format, VK_IMAGE_USAGE_TRANSIENT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Karl Schultzb5bc11e2016-05-04 08:36:08 -06002175 ASSERT_TRUE(image.initialized());
Tobin Ehlis41376e12015-07-03 08:45:14 -06002176
Tony Barbourf92621a2016-05-02 14:28:12 -06002177 VkImageView dsv;
2178 VkImageViewCreateInfo dsvci = {};
2179 dsvci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
2180 dsvci.image = image.handle();
2181 dsvci.viewType = VK_IMAGE_VIEW_TYPE_2D;
Chris Forbesd2b5fe42016-11-28 18:00:00 +13002182 dsvci.format = format;
Tony Barbourf92621a2016-05-02 14:28:12 -06002183 dsvci.subresourceRange.layerCount = 1;
2184 dsvci.subresourceRange.baseMipLevel = 0;
2185 dsvci.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002186 dsvci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis41376e12015-07-03 08:45:14 -06002187
Tony Barbourf92621a2016-05-02 14:28:12 -06002188 // Create a view with depth / stencil aspect for image with different usage
2189 vkCreateImageView(m_device->device(), &dsvci, NULL, &dsv);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002190
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002191 m_errorMonitor->VerifyFound();
Tony Barbourf92621a2016-05-02 14:28:12 -06002192
2193 // Initialize buffer with TRANSFER_DST usage
2194 vk_testing::Buffer buffer;
2195 VkMemoryPropertyFlags reqs = 0;
2196 buffer.init_as_dst(*m_device, 128 * 128, reqs);
2197 VkBufferImageCopy region = {};
2198 region.bufferRowLength = 128;
2199 region.bufferImageHeight = 128;
Mark Lobodzinski80871462017-02-16 10:37:27 -07002200 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Tony Barbourf92621a2016-05-02 14:28:12 -06002201 region.imageSubresource.layerCount = 1;
2202 region.imageExtent.height = 16;
2203 region.imageExtent.width = 16;
2204 region.imageExtent.depth = 1;
2205
Mark Lobodzinski80871462017-02-16 10:37:27 -07002206 // Buffer usage not set to TRANSFER_SRC and image usage not set to TRANSFER_DST
Tony Barbour552f6c02016-12-21 14:34:07 -07002207 m_commandBuffer->BeginCommandBuffer();
Tony Barbourf92621a2016-05-02 14:28:12 -06002208
Chris Forbesda581202016-10-06 18:25:26 +13002209 // two separate errors from this call:
2210 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "image should have VK_IMAGE_USAGE_TRANSFER_DST_BIT");
2211 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "buffer should have VK_BUFFER_USAGE_TRANSFER_SRC_BIT");
2212
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002213 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
2214 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Tony Barbourf92621a2016-05-02 14:28:12 -06002215 m_errorMonitor->VerifyFound();
Tobin Ehlis41376e12015-07-03 08:45:14 -06002216}
Tony Barbour75d79f02016-08-30 09:39:07 -06002217
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002218TEST_F(VkLayerTest, LeakAnObject) {
2219 VkResult err;
2220
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002221 TEST_DESCRIPTION("Create a fence and destroy its device without first destroying the fence.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002222
2223 // Note that we have to create a new device since destroying the
2224 // framework's device causes Teardown() to fail and just calling Teardown
2225 // will destroy the errorMonitor.
2226
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002227 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "has not been destroyed.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002228
2229 ASSERT_NO_FATAL_FAILURE(InitState());
2230
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002231 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002232 std::vector<VkDeviceQueueCreateInfo> queue_info;
2233 queue_info.reserve(queue_props.size());
2234 std::vector<std::vector<float>> queue_priorities;
2235 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
2236 VkDeviceQueueCreateInfo qi = {};
2237 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2238 qi.pNext = NULL;
2239 qi.queueFamilyIndex = i;
2240 qi.queueCount = queue_props[i].queueCount;
2241 queue_priorities.emplace_back(qi.queueCount, 0.0f);
2242 qi.pQueuePriorities = queue_priorities[i].data();
2243 queue_info.push_back(qi);
2244 }
2245
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002246 std::vector<const char *> device_extension_names;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002247
2248 // The sacrificial device object
2249 VkDevice testDevice;
2250 VkDeviceCreateInfo device_create_info = {};
2251 auto features = m_device->phy().features();
2252 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2253 device_create_info.pNext = NULL;
2254 device_create_info.queueCreateInfoCount = queue_info.size();
2255 device_create_info.pQueueCreateInfos = queue_info.data();
Tony Barbour4c70d102016-08-08 16:06:56 -06002256 device_create_info.enabledLayerCount = 0;
2257 device_create_info.ppEnabledLayerNames = NULL;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002258 device_create_info.pEnabledFeatures = &features;
2259 err = vkCreateDevice(gpu(), &device_create_info, NULL, &testDevice);
2260 ASSERT_VK_SUCCESS(err);
2261
2262 VkFence fence;
2263 VkFenceCreateInfo fence_create_info = {};
2264 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
2265 fence_create_info.pNext = NULL;
2266 fence_create_info.flags = 0;
2267 err = vkCreateFence(testDevice, &fence_create_info, NULL, &fence);
2268 ASSERT_VK_SUCCESS(err);
2269
2270 // Induce failure by not calling vkDestroyFence
2271 vkDestroyDevice(testDevice, NULL);
2272 m_errorMonitor->VerifyFound();
2273}
2274
2275TEST_F(VkLayerTest, InvalidCommandPoolConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002276 TEST_DESCRIPTION(
2277 "Allocate command buffers from one command pool and "
2278 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002279
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002280 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeCommandBuffers is attempting to free Command Buffer");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002281
Cody Northropc31a84f2016-08-22 10:41:47 -06002282 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002283 VkCommandPool command_pool_one;
2284 VkCommandPool command_pool_two;
2285
2286 VkCommandPoolCreateInfo pool_create_info{};
2287 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
2288 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
2289 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
2290
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002291 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002292
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002293 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002294
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002295 VkCommandBuffer cb;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002296 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002297 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002298 command_buffer_allocate_info.commandPool = command_pool_one;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002299 command_buffer_allocate_info.commandBufferCount = 1;
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002300 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002301 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002302
Chris Forbes5ab04ec2016-11-28 18:03:11 +13002303 vkFreeCommandBuffers(m_device->device(), command_pool_two, 1, &cb);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002304
2305 m_errorMonitor->VerifyFound();
2306
2307 vkDestroyCommandPool(m_device->device(), command_pool_one, NULL);
2308 vkDestroyCommandPool(m_device->device(), command_pool_two, NULL);
2309}
2310
2311TEST_F(VkLayerTest, InvalidDescriptorPoolConsistency) {
2312 VkResult err;
2313
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002314 TEST_DESCRIPTION(
2315 "Allocate descriptor sets from one DS pool and "
2316 "attempt to delete them from another.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002317
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002318 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "FreeDescriptorSets is attempting to free descriptorSet");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002319
2320 ASSERT_NO_FATAL_FAILURE(InitState());
2321 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2322
2323 VkDescriptorPoolSize ds_type_count = {};
2324 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
2325 ds_type_count.descriptorCount = 1;
2326
2327 VkDescriptorPoolCreateInfo ds_pool_ci = {};
2328 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2329 ds_pool_ci.pNext = NULL;
2330 ds_pool_ci.flags = 0;
2331 ds_pool_ci.maxSets = 1;
2332 ds_pool_ci.poolSizeCount = 1;
2333 ds_pool_ci.pPoolSizes = &ds_type_count;
2334
2335 VkDescriptorPool ds_pool_one;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002336 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_one);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002337 ASSERT_VK_SUCCESS(err);
2338
2339 // Create a second descriptor pool
2340 VkDescriptorPool ds_pool_two;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002341 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool_two);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002342 ASSERT_VK_SUCCESS(err);
2343
2344 VkDescriptorSetLayoutBinding dsl_binding = {};
2345 dsl_binding.binding = 0;
2346 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
2347 dsl_binding.descriptorCount = 1;
2348 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2349 dsl_binding.pImmutableSamplers = NULL;
2350
2351 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
2352 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2353 ds_layout_ci.pNext = NULL;
2354 ds_layout_ci.bindingCount = 1;
2355 ds_layout_ci.pBindings = &dsl_binding;
2356
2357 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002358 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002359 ASSERT_VK_SUCCESS(err);
2360
2361 VkDescriptorSet descriptorSet;
2362 VkDescriptorSetAllocateInfo alloc_info = {};
2363 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
2364 alloc_info.descriptorSetCount = 1;
2365 alloc_info.descriptorPool = ds_pool_one;
2366 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002367 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002368 ASSERT_VK_SUCCESS(err);
2369
2370 err = vkFreeDescriptorSets(m_device->device(), ds_pool_two, 1, &descriptorSet);
2371
2372 m_errorMonitor->VerifyFound();
2373
2374 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2375 vkDestroyDescriptorPool(m_device->device(), ds_pool_one, NULL);
2376 vkDestroyDescriptorPool(m_device->device(), ds_pool_two, NULL);
2377}
2378
2379TEST_F(VkLayerTest, CreateUnknownObject) {
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002380 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00788);
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002381
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002382 TEST_DESCRIPTION("Pass an invalid image object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002383
2384 ASSERT_NO_FATAL_FAILURE(InitState());
2385
2386 // Pass bogus handle into GetImageMemoryRequirements
2387 VkMemoryRequirements mem_reqs;
2388 uint64_t fakeImageHandle = 0xCADECADE;
2389 VkImage fauxImage = reinterpret_cast<VkImage &>(fakeImageHandle);
2390
2391 vkGetImageMemoryRequirements(m_device->device(), fauxImage, &mem_reqs);
2392
2393 m_errorMonitor->VerifyFound();
2394}
2395
Mike Schuchardt17838902017-02-21 09:48:06 -07002396TEST_F(VkLayerTest, UseObjectWithWrongDevice) {
2397 TEST_DESCRIPTION(
2398 "Try to destroy a render pass object using a device other than the one it was created on. "
2399 "This should generate a distinct error from the invalid handle error.");
2400 // Create first device and renderpass
2401 ASSERT_NO_FATAL_FAILURE(InitState());
2402 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
2403
2404 // Create second device
2405 float priorities[] = {1.0f};
2406 VkDeviceQueueCreateInfo queue_info{};
2407 queue_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
2408 queue_info.pNext = NULL;
2409 queue_info.flags = 0;
2410 queue_info.queueFamilyIndex = 0;
2411 queue_info.queueCount = 1;
2412 queue_info.pQueuePriorities = &priorities[0];
2413
2414 VkDeviceCreateInfo device_create_info = {};
2415 auto features = m_device->phy().features();
2416 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
2417 device_create_info.pNext = NULL;
2418 device_create_info.queueCreateInfoCount = 1;
2419 device_create_info.pQueueCreateInfos = &queue_info;
2420 device_create_info.enabledLayerCount = 0;
2421 device_create_info.ppEnabledLayerNames = NULL;
2422 device_create_info.pEnabledFeatures = &features;
2423
2424 VkDevice second_device;
2425 ASSERT_VK_SUCCESS(vkCreateDevice(gpu(), &device_create_info, NULL, &second_device));
2426
2427 // Try to destroy the renderpass from the first device using the second device
2428 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00399);
2429 vkDestroyRenderPass(second_device, m_renderPass, NULL);
2430 m_errorMonitor->VerifyFound();
2431
2432 vkDestroyDevice(second_device, NULL);
2433}
2434
Karl Schultz6addd812016-02-02 17:17:23 -07002435TEST_F(VkLayerTest, PipelineNotBound) {
2436 VkResult err;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002437
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002438 TEST_DESCRIPTION("Pass in an invalid pipeline object handle into a Vulkan API call.");
Mark Lobodzinskifc5cc662016-05-02 17:17:41 -06002439
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002440 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002441
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002442 ASSERT_NO_FATAL_FAILURE(InitState());
2443 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002444
Chia-I Wu1b99bb22015-10-27 19:25:11 +08002445 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002446 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2447 ds_type_count.descriptorCount = 1;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002448
2449 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002450 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
2451 ds_pool_ci.pNext = NULL;
2452 ds_pool_ci.maxSets = 1;
2453 ds_pool_ci.poolSizeCount = 1;
2454 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002455
2456 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002457 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002458 ASSERT_VK_SUCCESS(err);
2459
2460 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002461 dsl_binding.binding = 0;
2462 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
2463 dsl_binding.descriptorCount = 1;
2464 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
2465 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002466
2467 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002468 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
2469 ds_layout_ci.pNext = NULL;
2470 ds_layout_ci.bindingCount = 1;
2471 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002472
2473 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002474 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002475 ASSERT_VK_SUCCESS(err);
2476
2477 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002478 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08002479 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07002480 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06002481 alloc_info.descriptorPool = ds_pool;
2482 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002483 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002484 ASSERT_VK_SUCCESS(err);
2485
2486 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002487 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
2488 pipeline_layout_ci.pNext = NULL;
2489 pipeline_layout_ci.setLayoutCount = 1;
2490 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002491
2492 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002493 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002494 ASSERT_VK_SUCCESS(err);
2495
Mark Youngad779052016-01-06 14:26:04 -07002496 VkPipeline badPipeline = (VkPipeline)((size_t)0xbaadb1be);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002497
Tony Barbour552f6c02016-12-21 14:34:07 -07002498 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002499 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, badPipeline);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002500
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002501 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002502
Chia-I Wuf7458c52015-10-26 21:10:41 +08002503 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
2504 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
2505 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002506}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002507
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002508TEST_F(VkLayerTest, BindImageInvalidMemoryType) {
2509 VkResult err;
2510
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07002511 TEST_DESCRIPTION(
2512 "Test validation check for an invalid memory type index "
2513 "during bind[Buffer|Image]Memory time");
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002514
Mark Lobodzinskibc185762016-06-15 16:28:53 -06002515 ASSERT_NO_FATAL_FAILURE(InitState());
2516
2517 // Create an image, allocate memory, set a bad typeIndex and then try to
2518 // bind it
2519 VkImage image;
2520 VkDeviceMemory mem;
2521 VkMemoryRequirements mem_reqs;
2522 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2523 const int32_t tex_width = 32;
2524 const int32_t tex_height = 32;
2525
2526 VkImageCreateInfo image_create_info = {};
2527 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2528 image_create_info.pNext = NULL;
2529 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2530 image_create_info.format = tex_format;
2531 image_create_info.extent.width = tex_width;
2532 image_create_info.extent.height = tex_height;
2533 image_create_info.extent.depth = 1;
2534 image_create_info.mipLevels = 1;
2535 image_create_info.arrayLayers = 1;
2536 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2537 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
2538 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2539 image_create_info.flags = 0;
2540
2541 VkMemoryAllocateInfo mem_alloc = {};
2542 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2543 mem_alloc.pNext = NULL;
2544 mem_alloc.allocationSize = 0;
2545 mem_alloc.memoryTypeIndex = 0;
2546
2547 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
2548 ASSERT_VK_SUCCESS(err);
2549
2550 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
2551 mem_alloc.allocationSize = mem_reqs.size;
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002552
2553 // Introduce Failure, select invalid TypeIndex
2554 VkPhysicalDeviceMemoryProperties memory_info;
2555
2556 vkGetPhysicalDeviceMemoryProperties(gpu(), &memory_info);
2557 unsigned int i;
2558 for (i = 0; i < memory_info.memoryTypeCount; i++) {
2559 if ((mem_reqs.memoryTypeBits & (1 << i)) == 0) {
2560 mem_alloc.memoryTypeIndex = i;
2561 break;
2562 }
2563 }
2564 if (i >= memory_info.memoryTypeCount) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002565 printf(" No invalid memory type index could be found; skipped.\n");
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002566 vkDestroyImage(m_device->device(), image, NULL);
2567 return;
2568 }
2569
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002570 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 -06002571
2572 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
2573 ASSERT_VK_SUCCESS(err);
2574
2575 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2576 (void)err;
2577
2578 m_errorMonitor->VerifyFound();
2579
2580 vkDestroyImage(m_device->device(), image, NULL);
2581 vkFreeMemory(m_device->device(), mem, NULL);
2582}
Mike Stroyan80fc6c32016-06-20 15:42:29 -06002583
Karl Schultz6addd812016-02-02 17:17:23 -07002584TEST_F(VkLayerTest, BindInvalidMemory) {
2585 VkResult err;
2586 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002587
2588 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06002589
Cortf801b982017-01-17 18:10:21 -08002590 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
Cort Strattonde748202017-02-17 12:50:01 -08002591 const int32_t tex_width = 256;
2592 const int32_t tex_height = 256;
Tobin Ehlisec598302015-09-15 15:02:17 -06002593
2594 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002595 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2596 image_create_info.pNext = NULL;
2597 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2598 image_create_info.format = tex_format;
2599 image_create_info.extent.width = tex_width;
2600 image_create_info.extent.height = tex_height;
2601 image_create_info.extent.depth = 1;
2602 image_create_info.mipLevels = 1;
2603 image_create_info.arrayLayers = 1;
2604 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002605 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Karl Schultz6addd812016-02-02 17:17:23 -07002606 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2607 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002608
Cortf801b982017-01-17 18:10:21 -08002609 VkBufferCreateInfo buffer_create_info = {};
2610 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
2611 buffer_create_info.pNext = NULL;
2612 buffer_create_info.flags = 0;
Cort Strattonde748202017-02-17 12:50:01 -08002613 buffer_create_info.size = 4 * 1024 * 1024;
2614 buffer_create_info.usage = VK_BUFFER_USAGE_VERTEX_BUFFER_BIT;
Cortf801b982017-01-17 18:10:21 -08002615 buffer_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tobin Ehlisec598302015-09-15 15:02:17 -06002616
Cortf801b982017-01-17 18:10:21 -08002617 // Create an image/buffer, allocate memory, free it, and then try to bind it
2618 {
2619 VkImage image = VK_NULL_HANDLE;
2620 VkBuffer buffer = VK_NULL_HANDLE;
2621 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2622 ASSERT_VK_SUCCESS(err);
2623 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2624 ASSERT_VK_SUCCESS(err);
2625 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2626 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2627 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002628
Cortf801b982017-01-17 18:10:21 -08002629 VkMemoryAllocateInfo image_mem_alloc = {}, buffer_mem_alloc = {};
2630 image_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2631 image_mem_alloc.allocationSize = image_mem_reqs.size;
2632 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_mem_alloc, 0);
2633 ASSERT_TRUE(pass);
2634 buffer_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2635 buffer_mem_alloc.allocationSize = buffer_mem_reqs.size;
2636 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_mem_alloc, 0);
2637 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002638
Cortf801b982017-01-17 18:10:21 -08002639 VkDeviceMemory image_mem = VK_NULL_HANDLE, buffer_mem = VK_NULL_HANDLE;
2640 err = vkAllocateMemory(device(), &image_mem_alloc, NULL, &image_mem);
2641 ASSERT_VK_SUCCESS(err);
2642 err = vkAllocateMemory(device(), &buffer_mem_alloc, NULL, &buffer_mem);
2643 ASSERT_VK_SUCCESS(err);
Tobin Ehlisec598302015-09-15 15:02:17 -06002644
Cortf801b982017-01-17 18:10:21 -08002645 vkFreeMemory(device(), image_mem, NULL);
2646 vkFreeMemory(device(), buffer_mem, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002647
Cortf801b982017-01-17 18:10:21 -08002648 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00809);
2649 err = vkBindImageMemory(device(), image, image_mem, 0);
2650 (void)err; // This may very well return an error.
2651 m_errorMonitor->VerifyFound();
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_00800);
2654 err = vkBindBufferMemory(device(), buffer, buffer_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 vkDestroyImage(m_device->device(), image, NULL);
2659 vkDestroyBuffer(m_device->device(), buffer, NULL);
2660 }
Cort Strattonc21601b2017-01-28 14:16:16 -08002661
2662 // Try to bind memory to an object that already has a memory binding
2663 {
2664 VkImage image = VK_NULL_HANDLE;
2665 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2666 ASSERT_VK_SUCCESS(err);
2667 VkBuffer buffer = VK_NULL_HANDLE;
2668 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2669 ASSERT_VK_SUCCESS(err);
2670 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2671 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2672 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2673 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2674 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2675 image_alloc_info.allocationSize = image_mem_reqs.size;
2676 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2677 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
2678 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2679 ASSERT_TRUE(pass);
2680 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2681 ASSERT_TRUE(pass);
2682 VkDeviceMemory image_mem, buffer_mem;
2683 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2684 ASSERT_VK_SUCCESS(err);
2685 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2686 ASSERT_VK_SUCCESS(err);
2687
2688 err = vkBindImageMemory(device(), image, image_mem, 0);
2689 ASSERT_VK_SUCCESS(err);
2690 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00803);
2691 err = vkBindImageMemory(device(), image, image_mem, 0);
2692 (void)err; // This may very well return an error.
2693 m_errorMonitor->VerifyFound();
2694
2695 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2696 ASSERT_VK_SUCCESS(err);
2697 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00791);
2698 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2699 (void)err; // This may very well return an error.
2700 m_errorMonitor->VerifyFound();
2701
2702 vkFreeMemory(device(), image_mem, NULL);
2703 vkFreeMemory(device(), buffer_mem, NULL);
2704 vkDestroyImage(device(), image, NULL);
2705 vkDestroyBuffer(device(), buffer, NULL);
2706 }
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002707
Cort Strattonde748202017-02-17 12:50:01 -08002708 // Try to bind memory to an object with an invalid memoryOffset
Cort6c7dff72017-01-27 18:34:50 -08002709 {
2710 VkImage image = VK_NULL_HANDLE;
2711 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2712 ASSERT_VK_SUCCESS(err);
2713 VkBuffer buffer = VK_NULL_HANDLE;
2714 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2715 ASSERT_VK_SUCCESS(err);
2716 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2717 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2718 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2719 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2720 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002721 // Leave some extra space for alignment wiggle room
2722 image_alloc_info.allocationSize = image_mem_reqs.size + image_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002723 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Cort Strattonde748202017-02-17 12:50:01 -08002724 buffer_alloc_info.allocationSize = buffer_mem_reqs.size + buffer_mem_reqs.alignment;
Cort6c7dff72017-01-27 18:34:50 -08002725 pass = m_device->phy().set_memory_type(image_mem_reqs.memoryTypeBits, &image_alloc_info, 0);
2726 ASSERT_TRUE(pass);
2727 pass = m_device->phy().set_memory_type(buffer_mem_reqs.memoryTypeBits, &buffer_alloc_info, 0);
2728 ASSERT_TRUE(pass);
2729 VkDeviceMemory image_mem, buffer_mem;
2730 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2731 ASSERT_VK_SUCCESS(err);
2732 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2733 ASSERT_VK_SUCCESS(err);
2734
Cort Strattonde748202017-02-17 12:50:01 -08002735 // Test unaligned memory offset
2736 {
2737 if (image_mem_reqs.alignment > 1) {
2738 VkDeviceSize image_offset = 1;
2739 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02178);
2740 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2741 (void)err; // This may very well return an error.
2742 m_errorMonitor->VerifyFound();
2743 }
Cort6c7dff72017-01-27 18:34:50 -08002744
Cort Strattonde748202017-02-17 12:50:01 -08002745 if (buffer_mem_reqs.alignment > 1) {
2746 VkDeviceSize buffer_offset = 1;
2747 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02174);
2748 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2749 (void)err; // This may very well return an error.
2750 m_errorMonitor->VerifyFound();
2751 }
2752 }
2753
2754 // Test memory offsets outside the memory allocation
2755 {
2756 VkDeviceSize image_offset =
2757 (image_alloc_info.allocationSize + image_mem_reqs.alignment) & ~(image_mem_reqs.alignment - 1);
2758 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00805);
2759 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2760 (void)err; // This may very well return an error.
2761 m_errorMonitor->VerifyFound();
2762
2763 VkDeviceSize buffer_offset =
2764 (buffer_alloc_info.allocationSize + buffer_mem_reqs.alignment) & ~(buffer_mem_reqs.alignment - 1);
2765 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00793);
2766 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2767 (void)err; // This may very well return an error.
2768 m_errorMonitor->VerifyFound();
2769 }
2770
2771 // Test memory offsets within the memory allocation, but which leave too little memory for
2772 // the resource.
2773 {
2774 VkDeviceSize image_offset = (image_mem_reqs.size - 1) & ~(image_mem_reqs.alignment - 1);
2775 if (image_offset > 0) {
2776 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02179);
2777 err = vkBindImageMemory(device(), image, image_mem, image_offset);
2778 (void)err; // This may very well return an error.
2779 m_errorMonitor->VerifyFound();
2780 }
2781
2782 VkDeviceSize buffer_offset = (buffer_mem_reqs.size - 1) & ~(buffer_mem_reqs.alignment - 1);
2783 if (buffer_offset > 0) {
2784 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02175);
2785 err = vkBindBufferMemory(device(), buffer, buffer_mem, buffer_offset);
2786 (void)err; // This may very well return an error.
2787 m_errorMonitor->VerifyFound();
2788 }
2789 }
Cort6c7dff72017-01-27 18:34:50 -08002790
2791 vkFreeMemory(device(), image_mem, NULL);
2792 vkFreeMemory(device(), buffer_mem, NULL);
2793 vkDestroyImage(device(), image, NULL);
2794 vkDestroyBuffer(device(), buffer, NULL);
2795 }
2796
Cort Stratton4c38bb52017-01-28 13:33:10 -08002797 // Try to bind memory to an object with an invalid memory type
2798 {
2799 VkImage image = VK_NULL_HANDLE;
2800 err = vkCreateImage(device(), &image_create_info, NULL, &image);
2801 ASSERT_VK_SUCCESS(err);
2802 VkBuffer buffer = VK_NULL_HANDLE;
2803 err = vkCreateBuffer(device(), &buffer_create_info, NULL, &buffer);
2804 ASSERT_VK_SUCCESS(err);
2805 VkMemoryRequirements image_mem_reqs = {}, buffer_mem_reqs = {};
2806 vkGetImageMemoryRequirements(device(), image, &image_mem_reqs);
2807 vkGetBufferMemoryRequirements(device(), buffer, &buffer_mem_reqs);
2808 VkMemoryAllocateInfo image_alloc_info = {}, buffer_alloc_info = {};
2809 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2810 image_alloc_info.allocationSize = image_mem_reqs.size;
2811 buffer_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2812 buffer_alloc_info.allocationSize = buffer_mem_reqs.size;
Cort Strattonccc90e32017-02-04 13:47:42 -08002813 // Create a mask of available memory types *not* supported by these resources,
2814 // and try to use one of them.
Cort Stratton4c38bb52017-01-28 13:33:10 -08002815 VkPhysicalDeviceMemoryProperties memory_properties = {};
2816 vkGetPhysicalDeviceMemoryProperties(m_device->phy().handle(), &memory_properties);
Cort Strattonccc90e32017-02-04 13:47:42 -08002817 VkDeviceMemory image_mem, buffer_mem;
2818
Cort Stratton4c38bb52017-01-28 13:33:10 -08002819 uint32_t image_unsupported_mem_type_bits = ((1 << memory_properties.memoryTypeCount) - 1) & ~image_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002820 if (image_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002821 pass = m_device->phy().set_memory_type(image_unsupported_mem_type_bits, &image_alloc_info, 0);
2822 ASSERT_TRUE(pass);
2823 err = vkAllocateMemory(device(), &image_alloc_info, NULL, &image_mem);
2824 ASSERT_VK_SUCCESS(err);
2825 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00806);
2826 err = vkBindImageMemory(device(), image, image_mem, 0);
2827 (void)err; // This may very well return an error.
2828 m_errorMonitor->VerifyFound();
2829 vkFreeMemory(device(), image_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002830 }
2831
Cort Stratton4c38bb52017-01-28 13:33:10 -08002832 uint32_t buffer_unsupported_mem_type_bits =
2833 ((1 << memory_properties.memoryTypeCount) - 1) & ~buffer_mem_reqs.memoryTypeBits;
Cort Strattonccc90e32017-02-04 13:47:42 -08002834 if (buffer_unsupported_mem_type_bits != 0) {
Dave Houlton584d51e2017-02-16 12:52:54 -07002835 pass = m_device->phy().set_memory_type(buffer_unsupported_mem_type_bits, &buffer_alloc_info, 0);
2836 ASSERT_TRUE(pass);
2837 err = vkAllocateMemory(device(), &buffer_alloc_info, NULL, &buffer_mem);
2838 ASSERT_VK_SUCCESS(err);
2839 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00797);
2840 err = vkBindBufferMemory(device(), buffer, buffer_mem, 0);
2841 (void)err; // This may very well return an error.
2842 m_errorMonitor->VerifyFound();
2843 vkFreeMemory(device(), buffer_mem, NULL);
Cort Strattonccc90e32017-02-04 13:47:42 -08002844 }
Cort Stratton4c38bb52017-01-28 13:33:10 -08002845
Cort Stratton4c38bb52017-01-28 13:33:10 -08002846 vkDestroyImage(device(), image, NULL);
2847 vkDestroyBuffer(device(), buffer, NULL);
2848 }
2849
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002850 // Try to bind memory to an image created with sparse memory flags
2851 {
2852 VkImageCreateInfo sparse_image_create_info = image_create_info;
2853 sparse_image_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2854 VkImageFormatProperties image_format_properties = {};
2855 err = vkGetPhysicalDeviceImageFormatProperties(m_device->phy().handle(), sparse_image_create_info.format,
2856 sparse_image_create_info.imageType, sparse_image_create_info.tiling,
2857 sparse_image_create_info.usage, sparse_image_create_info.flags,
2858 &image_format_properties);
2859 if (!m_device->phy().features().sparseResidencyImage2D || err == VK_ERROR_FORMAT_NOT_SUPPORTED) {
2860 // most likely means sparse formats aren't supported here; skip this test.
2861 } else {
2862 ASSERT_VK_SUCCESS(err);
2863 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07002864 printf(" Sparse image format not supported; skipped.\n");
Cort Strattonf1d8a4a2017-01-28 14:17:04 -08002865 return;
2866 } else {
2867 VkImage sparse_image = VK_NULL_HANDLE;
2868 err = vkCreateImage(m_device->device(), &sparse_image_create_info, NULL, &sparse_image);
2869 ASSERT_VK_SUCCESS(err);
2870 VkMemoryRequirements sparse_mem_reqs = {};
2871 vkGetImageMemoryRequirements(m_device->device(), sparse_image, &sparse_mem_reqs);
2872 if (sparse_mem_reqs.memoryTypeBits != 0) {
2873 VkMemoryAllocateInfo sparse_mem_alloc = {};
2874 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2875 sparse_mem_alloc.pNext = NULL;
2876 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2877 sparse_mem_alloc.memoryTypeIndex = 0;
2878 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2879 ASSERT_TRUE(pass);
2880 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2881 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2882 ASSERT_VK_SUCCESS(err);
2883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00804);
2884 err = vkBindImageMemory(m_device->device(), sparse_image, sparse_mem, 0);
2885 // This may very well return an error.
2886 (void)err;
2887 m_errorMonitor->VerifyFound();
2888 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2889 }
2890 vkDestroyImage(m_device->device(), sparse_image, NULL);
2891 }
2892 }
2893 }
2894
2895 // Try to bind memory to a buffer created with sparse memory flags
2896 {
2897 VkBufferCreateInfo sparse_buffer_create_info = buffer_create_info;
2898 sparse_buffer_create_info.flags |= VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
2899 if (!m_device->phy().features().sparseResidencyBuffer) {
2900 // most likely means sparse formats aren't supported here; skip this test.
2901 } else {
2902 VkBuffer sparse_buffer = VK_NULL_HANDLE;
2903 err = vkCreateBuffer(m_device->device(), &sparse_buffer_create_info, NULL, &sparse_buffer);
2904 ASSERT_VK_SUCCESS(err);
2905 VkMemoryRequirements sparse_mem_reqs = {};
2906 vkGetBufferMemoryRequirements(m_device->device(), sparse_buffer, &sparse_mem_reqs);
2907 if (sparse_mem_reqs.memoryTypeBits != 0) {
2908 VkMemoryAllocateInfo sparse_mem_alloc = {};
2909 sparse_mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2910 sparse_mem_alloc.pNext = NULL;
2911 sparse_mem_alloc.allocationSize = sparse_mem_reqs.size;
2912 sparse_mem_alloc.memoryTypeIndex = 0;
2913 pass = m_device->phy().set_memory_type(sparse_mem_reqs.memoryTypeBits, &sparse_mem_alloc, 0);
2914 ASSERT_TRUE(pass);
2915 VkDeviceMemory sparse_mem = VK_NULL_HANDLE;
2916 err = vkAllocateMemory(m_device->device(), &sparse_mem_alloc, NULL, &sparse_mem);
2917 ASSERT_VK_SUCCESS(err);
2918 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00792);
2919 err = vkBindBufferMemory(m_device->device(), sparse_buffer, sparse_mem, 0);
2920 // This may very well return an error.
2921 (void)err;
2922 m_errorMonitor->VerifyFound();
2923 vkFreeMemory(m_device->device(), sparse_mem, NULL);
2924 }
2925 vkDestroyBuffer(m_device->device(), sparse_buffer, NULL);
2926 }
2927 }
Tobin Ehlisec598302015-09-15 15:02:17 -06002928}
2929
Karl Schultz6addd812016-02-02 17:17:23 -07002930TEST_F(VkLayerTest, BindMemoryToDestroyedObject) {
2931 VkResult err;
2932 bool pass;
Tobin Ehlisec598302015-09-15 15:02:17 -06002933
Karl Schultzf78bcdd2016-11-30 12:36:01 -07002934 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00808);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06002935
Tobin Ehlisec598302015-09-15 15:02:17 -06002936 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisec598302015-09-15 15:02:17 -06002937
Karl Schultz6addd812016-02-02 17:17:23 -07002938 // Create an image object, allocate memory, destroy the object and then try
2939 // to bind it
2940 VkImage image;
2941 VkDeviceMemory mem;
2942 VkMemoryRequirements mem_reqs;
Tobin Ehlisec598302015-09-15 15:02:17 -06002943
Karl Schultz6addd812016-02-02 17:17:23 -07002944 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
2945 const int32_t tex_width = 32;
2946 const int32_t tex_height = 32;
Tobin Ehlisec598302015-09-15 15:02:17 -06002947
2948 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002949 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
2950 image_create_info.pNext = NULL;
2951 image_create_info.imageType = VK_IMAGE_TYPE_2D;
2952 image_create_info.format = tex_format;
2953 image_create_info.extent.width = tex_width;
2954 image_create_info.extent.height = tex_height;
2955 image_create_info.extent.depth = 1;
2956 image_create_info.mipLevels = 1;
2957 image_create_info.arrayLayers = 1;
2958 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
2959 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
2960 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
2961 image_create_info.flags = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002962
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002963 VkMemoryAllocateInfo mem_alloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -07002964 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
2965 mem_alloc.pNext = NULL;
2966 mem_alloc.allocationSize = 0;
2967 mem_alloc.memoryTypeIndex = 0;
Tobin Ehlisec598302015-09-15 15:02:17 -06002968
Chia-I Wuf7458c52015-10-26 21:10:41 +08002969 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlisec598302015-09-15 15:02:17 -06002970 ASSERT_VK_SUCCESS(err);
2971
Karl Schultz6addd812016-02-02 17:17:23 -07002972 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
Tobin Ehlisec598302015-09-15 15:02:17 -06002973
2974 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06002975 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -06002976 ASSERT_TRUE(pass);
Tobin Ehlisec598302015-09-15 15:02:17 -06002977
2978 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +08002979 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlisec598302015-09-15 15:02:17 -06002980 ASSERT_VK_SUCCESS(err);
2981
2982 // Introduce validation failure, destroy Image object before binding
Chia-I Wuf7458c52015-10-26 21:10:41 +08002983 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehlisec598302015-09-15 15:02:17 -06002984 ASSERT_VK_SUCCESS(err);
2985
2986 // Now Try to bind memory to this destroyed object
2987 err = vkBindImageMemory(m_device->device(), image, mem, 0);
2988 // This may very well return an error.
Karl Schultz6addd812016-02-02 17:17:23 -07002989 (void)err;
Tobin Ehlisec598302015-09-15 15:02:17 -06002990
Chris Forbes8f36a8a2016-04-07 13:21:07 +12002991 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06002992
Chia-I Wuf7458c52015-10-26 21:10:41 +08002993 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06002994}
Tobin Ehlisa1c28562015-10-23 16:00:08 -06002995
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07002996TEST_F(VkLayerTest, CreatePipelineBadVertexAttributeFormat) {
2997 TEST_DESCRIPTION("Test that pipeline validation catches invalid vertex attribute formats");
2998
2999 ASSERT_NO_FATAL_FAILURE(InitState());
3000 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3001
3002 VkVertexInputBindingDescription input_binding;
3003 memset(&input_binding, 0, sizeof(input_binding));
3004
3005 VkVertexInputAttributeDescription input_attribs;
3006 memset(&input_attribs, 0, sizeof(input_attribs));
3007
3008 // Pick a really bad format for this purpose and make sure it should fail
3009 input_attribs.format = VK_FORMAT_BC2_UNORM_BLOCK;
3010 VkFormatProperties format_props = m_device->format_properties(input_attribs.format);
3011 if ((format_props.bufferFeatures & VK_FORMAT_FEATURE_VERTEX_BUFFER_BIT) != 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07003012 printf(" Format unsuitable for test; skipped.\n");
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003013 return;
3014 }
3015
3016 input_attribs.location = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003017 char const *vsSource =
3018 "#version 450\n"
3019 "\n"
3020 "out gl_PerVertex {\n"
3021 " vec4 gl_Position;\n"
3022 "};\n"
3023 "void main(){\n"
3024 " gl_Position = vec4(1);\n"
3025 "}\n";
3026 char const *fsSource =
3027 "#version 450\n"
3028 "\n"
3029 "layout(location=0) out vec4 color;\n"
3030 "void main(){\n"
3031 " color = vec4(1);\n"
3032 "}\n";
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -07003033
3034 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01413);
3035 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3036 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3037
3038 VkPipelineObj pipe(m_device);
3039 pipe.AddColorAttachment();
3040 pipe.AddShader(&vs);
3041 pipe.AddShader(&fs);
3042
3043 pipe.AddVertexInputBindings(&input_binding, 1);
3044 pipe.AddVertexInputAttribs(&input_attribs, 1);
3045
3046 VkDescriptorSetObj descriptorSet(m_device);
3047 descriptorSet.AppendDummy();
3048 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
3049
3050 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
3051
3052 m_errorMonitor->VerifyFound();
3053}
3054
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003055TEST_F(VkLayerTest, ImageSampleCounts) {
Jeremy Hayes0d104082017-02-21 10:24:16 -07003056 TEST_DESCRIPTION("Use bad sample counts in image transfer calls to trigger validation errors.");
3057 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003058
3059 VkMemoryPropertyFlags reqs = 0;
3060 VkImageCreateInfo image_create_info = {};
3061 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3062 image_create_info.pNext = NULL;
3063 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3064 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3065 image_create_info.extent.width = 256;
3066 image_create_info.extent.height = 256;
3067 image_create_info.extent.depth = 1;
3068 image_create_info.mipLevels = 1;
3069 image_create_info.arrayLayers = 1;
3070 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3071 image_create_info.flags = 0;
3072
3073 VkImageBlit blit_region = {};
3074 blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3075 blit_region.srcSubresource.baseArrayLayer = 0;
3076 blit_region.srcSubresource.layerCount = 1;
3077 blit_region.srcSubresource.mipLevel = 0;
3078 blit_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3079 blit_region.dstSubresource.baseArrayLayer = 0;
3080 blit_region.dstSubresource.layerCount = 1;
3081 blit_region.dstSubresource.mipLevel = 0;
3082
3083 // Create two images, the source with sampleCount = 2, and attempt to blit
3084 // between them
3085 {
3086 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003087 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003088 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003089 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003090 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003091 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003092 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003093 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003094 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003095 m_errorMonitor->SetDesiredFailureMsg(
3096 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3097 "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 -06003098 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3099 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003100 m_errorMonitor->VerifyFound();
3101 m_commandBuffer->EndCommandBuffer();
3102 }
3103
3104 // Create two images, the dest with sampleCount = 4, and attempt to blit
3105 // between them
3106 {
3107 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003108 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003109 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003110 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003111 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003112 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003113 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003114 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003115 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003116 m_errorMonitor->SetDesiredFailureMsg(
3117 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3118 "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 -06003119 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3120 dst_image.handle(), VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 1, &blit_region, VK_FILTER_NEAREST);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003121 m_errorMonitor->VerifyFound();
3122 m_commandBuffer->EndCommandBuffer();
3123 }
3124
3125 VkBufferImageCopy copy_region = {};
3126 copy_region.bufferRowLength = 128;
3127 copy_region.bufferImageHeight = 128;
3128 copy_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3129 copy_region.imageSubresource.layerCount = 1;
3130 copy_region.imageExtent.height = 64;
3131 copy_region.imageExtent.width = 64;
3132 copy_region.imageExtent.depth = 1;
3133
3134 // Create src buffer and dst image with sampleCount = 4 and attempt to copy
3135 // buffer to image
3136 {
3137 vk_testing::Buffer src_buffer;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003138 src_buffer.init_as_src(*m_device, 128 * 128 * 4, reqs);
3139 image_create_info.samples = VK_SAMPLE_COUNT_8_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003140 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003141 vk_testing::Image dst_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003142 dst_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003143 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003144 m_errorMonitor->SetDesiredFailureMsg(
3145 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3146 "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 -06003147 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), src_buffer.handle(), dst_image.handle(),
3148 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &copy_region);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003149 m_errorMonitor->VerifyFound();
3150 m_commandBuffer->EndCommandBuffer();
3151 }
3152
3153 // Create dst buffer and src image with sampleCount = 2 and attempt to copy
3154 // image to buffer
3155 {
3156 vk_testing::Buffer dst_buffer;
3157 dst_buffer.init_as_dst(*m_device, 128 * 128 * 4, reqs);
3158 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003159 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003160 vk_testing::Image src_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003161 src_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003162 m_commandBuffer->BeginCommandBuffer();
Jeremy Hayes0d104082017-02-21 10:24:16 -07003163 m_errorMonitor->SetDesiredFailureMsg(
3164 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3165 "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 -06003166 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), src_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
Mark Lobodzinski9cfc1292016-08-23 16:18:17 -06003167 dst_buffer.handle(), 1, &copy_region);
3168 m_errorMonitor->VerifyFound();
3169 m_commandBuffer->EndCommandBuffer();
3170 }
3171}
3172
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003173TEST_F(VkLayerTest, BlitImageFormats) {
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003174 ASSERT_NO_FATAL_FAILURE(InitState());
3175
3176 VkImageObj src_image(m_device);
3177 src_image.init(64, 64, VK_FORMAT_A2B10G10R10_UINT_PACK32, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
3178 VkImageObj dst_image(m_device);
3179 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
3180 VkImageObj dst_image2(m_device);
Mike Stroyan131f3e72016-10-18 11:10:23 -06003181 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 -06003182
3183 VkImageBlit blitRegion = {};
3184 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3185 blitRegion.srcSubresource.baseArrayLayer = 0;
3186 blitRegion.srcSubresource.layerCount = 1;
3187 blitRegion.srcSubresource.mipLevel = 0;
3188 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3189 blitRegion.dstSubresource.baseArrayLayer = 0;
3190 blitRegion.dstSubresource.layerCount = 1;
3191 blitRegion.dstSubresource.mipLevel = 0;
3192
Dave Houlton34df4cb2016-12-01 16:43:06 -07003193 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
3194
3195 // TODO: there are 9 permutations of signed, unsigned, & other for source and dest
3196 // this test is only checking 2 of them at the moment
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003197
3198 // Unsigned int vs not an int
Tony Barbour552f6c02016-12-21 14:34:07 -07003199 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003200 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image.image(), dst_image.layout(), 1,
3201 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003202
3203 m_errorMonitor->VerifyFound();
3204
Dave Houlton34df4cb2016-12-01 16:43:06 -07003205 // Test should generate 2 VU failures
3206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02190);
3207 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02191);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003208
3209 // Unsigned int vs signed int
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003210 vkCmdBlitImage(m_commandBuffer->handle(), src_image.image(), src_image.layout(), dst_image2.image(), dst_image2.layout(), 1,
3211 &blitRegion, VK_FILTER_NEAREST);
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003212
Dave Houlton34df4cb2016-12-01 16:43:06 -07003213 // TODO: Note that this only verifies that at least one of the VU enums was found
3214 // 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 -06003215 m_errorMonitor->VerifyFound();
3216
Tony Barbour552f6c02016-12-21 14:34:07 -07003217 m_commandBuffer->EndCommandBuffer();
Mike Stroyanac5afeb2016-10-17 13:58:10 -06003218}
3219
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003220TEST_F(VkLayerTest, DSImageTransferGranularityTests) {
3221 VkResult err;
3222 bool pass;
3223
3224 TEST_DESCRIPTION("Tests for validaiton of Queue Family property minImageTransferGranularity.");
3225 ASSERT_NO_FATAL_FAILURE(InitState());
3226
3227 // If w/d/h granularity is 1, test is not meaningful
3228 // TODO: When virtual device limits are available, create a set of limits for this test that
3229 // will always have a granularity of > 1 for w, h, and d
3230 auto index = m_device->graphics_queue_node_index_;
3231 auto queue_family_properties = m_device->phy().queue_properties();
3232
3233 if ((queue_family_properties[index].minImageTransferGranularity.depth < 4) ||
3234 (queue_family_properties[index].minImageTransferGranularity.width < 4) ||
3235 (queue_family_properties[index].minImageTransferGranularity.height < 4)) {
3236 return;
3237 }
3238
3239 // Create two images of different types and try to copy between them
3240 VkImage srcImage;
3241 VkImage dstImage;
3242 VkDeviceMemory srcMem;
3243 VkDeviceMemory destMem;
3244 VkMemoryRequirements memReqs;
3245
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003246 VkImageCreateInfo image_create_info = {};
3247 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
3248 image_create_info.pNext = NULL;
3249 image_create_info.imageType = VK_IMAGE_TYPE_2D;
3250 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
3251 image_create_info.extent.width = 32;
3252 image_create_info.extent.height = 32;
3253 image_create_info.extent.depth = 1;
3254 image_create_info.mipLevels = 1;
3255 image_create_info.arrayLayers = 4;
3256 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
3257 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
3258 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
3259 image_create_info.flags = 0;
3260
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003261 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003262 ASSERT_VK_SUCCESS(err);
3263
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003264 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003265 ASSERT_VK_SUCCESS(err);
3266
3267 // Allocate memory
3268 VkMemoryAllocateInfo memAlloc = {};
3269 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
3270 memAlloc.pNext = NULL;
3271 memAlloc.allocationSize = 0;
3272 memAlloc.memoryTypeIndex = 0;
3273
3274 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
3275 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003276 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003277 ASSERT_TRUE(pass);
3278 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
3279 ASSERT_VK_SUCCESS(err);
3280
3281 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
3282 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003283 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003284 ASSERT_VK_SUCCESS(err);
3285 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
3286 ASSERT_VK_SUCCESS(err);
3287
3288 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
3289 ASSERT_VK_SUCCESS(err);
3290 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
3291 ASSERT_VK_SUCCESS(err);
3292
Tony Barbour552f6c02016-12-21 14:34:07 -07003293 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003294 VkImageCopy copyRegion;
3295 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3296 copyRegion.srcSubresource.mipLevel = 0;
3297 copyRegion.srcSubresource.baseArrayLayer = 0;
3298 copyRegion.srcSubresource.layerCount = 1;
3299 copyRegion.srcOffset.x = 0;
3300 copyRegion.srcOffset.y = 0;
3301 copyRegion.srcOffset.z = 0;
3302 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3303 copyRegion.dstSubresource.mipLevel = 0;
3304 copyRegion.dstSubresource.baseArrayLayer = 0;
3305 copyRegion.dstSubresource.layerCount = 1;
3306 copyRegion.dstOffset.x = 0;
3307 copyRegion.dstOffset.y = 0;
3308 copyRegion.dstOffset.z = 0;
3309 copyRegion.extent.width = 1;
3310 copyRegion.extent.height = 1;
3311 copyRegion.extent.depth = 1;
3312
3313 // Introduce failure by setting srcOffset to a bad granularity value
3314 copyRegion.srcOffset.y = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003315 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3316 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003317 m_errorMonitor->VerifyFound();
3318
3319 // Introduce failure by setting extent to a bad granularity value
3320 copyRegion.srcOffset.y = 0;
3321 copyRegion.extent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003322 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3323 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003324 m_errorMonitor->VerifyFound();
3325
3326 // Now do some buffer/image copies
3327 vk_testing::Buffer buffer;
3328 VkMemoryPropertyFlags reqs = 0;
3329 buffer.init_as_dst(*m_device, 128 * 128, reqs);
3330 VkBufferImageCopy region = {};
3331 region.bufferOffset = 0;
3332 region.bufferRowLength = 3;
3333 region.bufferImageHeight = 128;
3334 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3335 region.imageSubresource.layerCount = 1;
3336 region.imageExtent.height = 16;
3337 region.imageExtent.width = 16;
3338 region.imageExtent.depth = 1;
3339 region.imageOffset.x = 0;
3340 region.imageOffset.y = 0;
3341 region.imageOffset.z = 0;
3342
3343 // Introduce failure by setting bufferRowLength to a bad granularity value
3344 region.bufferRowLength = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3346 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3347 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003348 m_errorMonitor->VerifyFound();
3349 region.bufferRowLength = 128;
3350
3351 // Introduce failure by setting bufferOffset to a bad granularity value
3352 region.bufferOffset = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003353 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3354 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3355 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003356 m_errorMonitor->VerifyFound();
3357 region.bufferOffset = 0;
3358
3359 // Introduce failure by setting bufferImageHeight to a bad granularity value
3360 region.bufferImageHeight = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003361 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3362 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3363 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003364 m_errorMonitor->VerifyFound();
3365 region.bufferImageHeight = 128;
3366
3367 // Introduce failure by setting imageExtent to a bad granularity value
3368 region.imageExtent.width = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003369 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3370 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, buffer.handle(), 1,
3371 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003372 m_errorMonitor->VerifyFound();
3373 region.imageExtent.width = 16;
3374
3375 // Introduce failure by setting imageOffset to a bad granularity value
3376 region.imageOffset.z = 3;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003377 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "queue family image transfer granularity");
3378 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), srcImage, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
3379 &region);
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003380 m_errorMonitor->VerifyFound();
3381
Tony Barbour552f6c02016-12-21 14:34:07 -07003382 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskibb47ce72016-08-22 11:29:38 -06003383
3384 vkDestroyImage(m_device->device(), srcImage, NULL);
3385 vkDestroyImage(m_device->device(), dstImage, NULL);
3386 vkFreeMemory(m_device->device(), srcMem, NULL);
3387 vkFreeMemory(m_device->device(), destMem, NULL);
3388}
3389
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003390TEST_F(VkLayerTest, MismatchedQueueFamiliesOnSubmit) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003391 TEST_DESCRIPTION(
3392 "Submit command buffer created using one queue family and "
3393 "attempt to submit them on a queue created in a different "
3394 "queue family.");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003395
Cody Northropc31a84f2016-08-22 10:41:47 -06003396 ASSERT_NO_FATAL_FAILURE(InitState());
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07003397
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003398 // This test is meaningless unless we have multiple queue families
3399 auto queue_family_properties = m_device->phy().queue_properties();
3400 if (queue_family_properties.size() < 2) {
3401 return;
3402 }
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003403 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is being submitted on queue ");
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003404 // Get safe index of another queue family
3405 uint32_t other_queue_family = (m_device->graphics_queue_node_index_ == 0) ? 1 : 0;
3406 ASSERT_NO_FATAL_FAILURE(InitState());
3407 // Create a second queue using a different queue family
3408 VkQueue other_queue;
3409 vkGetDeviceQueue(m_device->device(), other_queue_family, 0, &other_queue);
3410
3411 // Record an empty cmd buffer
3412 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
3413 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
3414 vkBeginCommandBuffer(m_commandBuffer->handle(), &cmdBufBeginDesc);
3415 vkEndCommandBuffer(m_commandBuffer->handle());
3416
3417 // And submit on the wrong queue
3418 VkSubmitInfo submit_info = {};
3419 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
3420 submit_info.commandBufferCount = 1;
3421 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Tobin Ehlisfd213ea2016-08-10 17:10:46 -06003422 vkQueueSubmit(other_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003423
3424 m_errorMonitor->VerifyFound();
Mark Lobodzinski570efc62016-08-09 16:43:19 -06003425}
3426
Chris Forbes4c24a922016-11-16 08:59:10 +13003427TEST_F(VkLayerTest, RenderPassAttachmentIndexOutOfRange) {
3428 ASSERT_NO_FATAL_FAILURE(InitState());
3429
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003430 // There are no attachments, but refer to attachment 0.
3431 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbes4c24a922016-11-16 08:59:10 +13003432 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003433 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbes4c24a922016-11-16 08:59:10 +13003434 };
3435
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003436 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, subpasses, 0, nullptr};
Chris Forbes4c24a922016-11-16 08:59:10 +13003437 VkRenderPass rp;
3438
Chris Forbes2d9b2a82016-11-21 10:45:39 +13003439 // "... must be less than the total number of attachments ..."
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003440 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00325);
Chris Forbes4c24a922016-11-16 08:59:10 +13003441 vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3442 m_errorMonitor->VerifyFound();
3443}
3444
Chris Forbesa58c4522016-09-28 15:19:39 +13003445TEST_F(VkLayerTest, RenderPassPipelineSubpassMismatch) {
3446 TEST_DESCRIPTION("Use a pipeline for the wrong subpass in a render pass instance");
3447 ASSERT_NO_FATAL_FAILURE(InitState());
3448
3449 // A renderpass with two subpasses, both writing the same attachment.
3450 VkAttachmentDescription attach[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003451 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3452 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
3453 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesa58c4522016-09-28 15:19:39 +13003454 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003455 VkAttachmentReference ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Chris Forbesa58c4522016-09-28 15:19:39 +13003456 VkSubpassDescription subpasses[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003457 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
3458 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &ref, nullptr, nullptr, 0, nullptr},
Chris Forbesa58c4522016-09-28 15:19:39 +13003459 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003460 VkSubpassDependency dep = {0,
3461 1,
3462 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3463 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
3464 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3465 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
3466 VK_DEPENDENCY_BY_REGION_BIT};
3467 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, attach, 2, subpasses, 1, &dep};
Chris Forbesa58c4522016-09-28 15:19:39 +13003468 VkRenderPass rp;
3469 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3470 ASSERT_VK_SUCCESS(err);
3471
3472 VkImageObj image(m_device);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003473 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 +13003474 VkImageView imageView = image.targetView(VK_FORMAT_R8G8B8A8_UNORM);
3475
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003476 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &imageView, 32, 32, 1};
Chris Forbesa58c4522016-09-28 15:19:39 +13003477 VkFramebuffer fb;
3478 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
3479 ASSERT_VK_SUCCESS(err);
3480
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003481 char const *vsSource =
3482 "#version 450\n"
3483 "void main() { gl_Position = vec4(1); }\n";
3484 char const *fsSource =
3485 "#version 450\n"
3486 "layout(location=0) out vec4 color;\n"
3487 "void main() { color = vec4(1); }\n";
Chris Forbesa58c4522016-09-28 15:19:39 +13003488
3489 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
3490 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
3491 VkPipelineObj pipe(m_device);
3492 pipe.AddColorAttachment();
3493 pipe.AddShader(&vs);
3494 pipe.AddShader(&fs);
3495 VkViewport view_port = {};
3496 m_viewports.push_back(view_port);
3497 pipe.SetViewport(m_viewports);
3498 VkRect2D rect = {};
3499 m_scissors.push_back(rect);
3500 pipe.SetScissor(m_scissors);
3501
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003502 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 0, nullptr, 0, nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003503 VkPipelineLayout pl;
3504 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
3505 ASSERT_VK_SUCCESS(err);
3506 pipe.CreateVKPipeline(pl, rp);
3507
Tony Barbour552f6c02016-12-21 14:34:07 -07003508 m_commandBuffer->BeginCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003509
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003510 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO,
3511 nullptr,
3512 rp,
3513 fb,
3514 {{
3515 0, 0,
3516 },
3517 {32, 32}},
3518 0,
3519 nullptr};
Chris Forbesa58c4522016-09-28 15:19:39 +13003520
3521 // subtest 1: bind in the wrong subpass
3522 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3523 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003524 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 +13003525 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3526 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3527 m_errorMonitor->VerifyFound();
3528
3529 vkCmdEndRenderPass(m_commandBuffer->handle());
3530
3531 // subtest 2: bind in correct subpass, then transition to next subpass
3532 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
3533 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
3534 vkCmdNextSubpass(m_commandBuffer->handle(), VK_SUBPASS_CONTENTS_INLINE);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07003535 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 +13003536 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
3537 m_errorMonitor->VerifyFound();
3538
3539 vkCmdEndRenderPass(m_commandBuffer->handle());
3540
Tony Barbour552f6c02016-12-21 14:34:07 -07003541 m_commandBuffer->EndCommandBuffer();
Chris Forbesa58c4522016-09-28 15:19:39 +13003542
3543 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
3544 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
3545 vkDestroyRenderPass(m_device->device(), rp, nullptr);
3546}
3547
Tony Barbour4e919972016-08-09 13:27:40 -06003548TEST_F(VkLayerTest, RenderPassInvalidRenderArea) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003549 TEST_DESCRIPTION(
3550 "Generate INVALID_RENDER_AREA error by beginning renderpass"
3551 "with extent outside of framebuffer");
Tony Barbour4e919972016-08-09 13:27:40 -06003552 ASSERT_NO_FATAL_FAILURE(InitState());
3553 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3554
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003555 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3556 "Cannot execute a render pass with renderArea "
3557 "not within the bound of the framebuffer.");
Tony Barbour4e919972016-08-09 13:27:40 -06003558
3559 // Framebuffer for render target is 256x256, exceed that for INVALID_RENDER_AREA
3560 m_renderPassBeginInfo.renderArea.extent.width = 257;
3561 m_renderPassBeginInfo.renderArea.extent.height = 257;
Tony Barbour552f6c02016-12-21 14:34:07 -07003562 m_commandBuffer->BeginCommandBuffer();
3563 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour4e919972016-08-09 13:27:40 -06003564 m_errorMonitor->VerifyFound();
3565}
3566
3567TEST_F(VkLayerTest, DisabledIndependentBlend) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003568 TEST_DESCRIPTION(
3569 "Generate INDEPENDENT_BLEND by disabling independent "
3570 "blend and then specifying different blend states for two "
3571 "attachements");
Cody Northrop5703cc72016-08-19 09:57:10 -06003572 VkPhysicalDeviceFeatures features = {};
3573 features.independentBlend = VK_FALSE;
Cody Northropc31a84f2016-08-22 10:41:47 -06003574 ASSERT_NO_FATAL_FAILURE(InitState(&features));
Tony Barbour4e919972016-08-09 13:27:40 -06003575
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003576 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3577 "Invalid Pipeline CreateInfo: If independent blend feature not "
3578 "enabled, all elements of pAttachments must be identical");
Tony Barbour4e919972016-08-09 13:27:40 -06003579
Cody Northropc31a84f2016-08-22 10:41:47 -06003580 VkDescriptorSetObj descriptorSet(m_device);
3581 descriptorSet.AppendDummy();
3582 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Tony Barbour4e919972016-08-09 13:27:40 -06003583
Cody Northropc31a84f2016-08-22 10:41:47 -06003584 VkPipelineObj pipeline(m_device);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003585 // Create a renderPass with two color attachments
3586 VkAttachmentReference attachments[2] = {};
3587 attachments[0].layout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003588 attachments[1].attachment = 1;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003589 attachments[1].layout = VK_IMAGE_LAYOUT_GENERAL;
3590
3591 VkSubpassDescription subpass = {};
3592 subpass.pColorAttachments = attachments;
3593 subpass.colorAttachmentCount = 2;
3594
3595 VkRenderPassCreateInfo rpci = {};
3596 rpci.subpassCount = 1;
3597 rpci.pSubpasses = &subpass;
Tony Barbourffd60bd2017-03-09 12:04:55 -07003598 rpci.attachmentCount = 2;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003599
Tony Barbourffd60bd2017-03-09 12:04:55 -07003600 VkAttachmentDescription attach_desc[2] = {};
3601 attach_desc[0].format = VK_FORMAT_B8G8R8A8_UNORM;
3602 attach_desc[0].samples = VK_SAMPLE_COUNT_1_BIT;
3603 attach_desc[0].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3604 attach_desc[0].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
3605 attach_desc[1].format = VK_FORMAT_B8G8R8A8_UNORM;
3606 attach_desc[1].samples = VK_SAMPLE_COUNT_1_BIT;
3607 attach_desc[1].initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
3608 attach_desc[1].finalLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003609
Tony Barbourffd60bd2017-03-09 12:04:55 -07003610 rpci.pAttachments = attach_desc;
Tony Barbour0ace59a2017-02-06 13:38:36 -07003611 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3612
3613 VkRenderPass renderpass;
3614 vkCreateRenderPass(m_device->device(), &rpci, NULL, &renderpass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003615 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Cody Northropc31a84f2016-08-22 10:41:47 -06003616 pipeline.AddShader(&vs);
Cody Northrop5703cc72016-08-19 09:57:10 -06003617
Cody Northropc31a84f2016-08-22 10:41:47 -06003618 VkPipelineColorBlendAttachmentState att_state1 = {}, att_state2 = {};
3619 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3620 att_state1.blendEnable = VK_TRUE;
3621 att_state2.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3622 att_state2.blendEnable = VK_FALSE;
3623 pipeline.AddColorAttachment(0, &att_state1);
3624 pipeline.AddColorAttachment(1, &att_state2);
Tony Barbour0ace59a2017-02-06 13:38:36 -07003625 pipeline.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderpass);
Cody Northropc31a84f2016-08-22 10:41:47 -06003626 m_errorMonitor->VerifyFound();
Tony Barbour0ace59a2017-02-06 13:38:36 -07003627 vkDestroyRenderPass(m_device->device(), renderpass, NULL);
Tony Barbour4e919972016-08-09 13:27:40 -06003628}
3629
Mike Weiblen40b160e2017-02-06 19:21:52 -07003630// Is the Pipeline compatible with the expectations of the Renderpass/subpasses?
3631TEST_F(VkLayerTest, PipelineRenderpassCompatibility) {
3632 TEST_DESCRIPTION(
3633 "Create a graphics pipeline that is incompatible with the requirements "
3634 "of its contained Renderpass/subpasses.");
3635 ASSERT_NO_FATAL_FAILURE(InitState());
3636
3637 VkDescriptorSetObj ds_obj(m_device);
3638 ds_obj.AppendDummy();
3639 ds_obj.CreateVKDescriptorSet(m_commandBuffer);
3640
3641 VkShaderObj vs_obj(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
3642
3643 VkPipelineColorBlendAttachmentState att_state1 = {};
3644 att_state1.dstAlphaBlendFactor = VK_BLEND_FACTOR_CONSTANT_COLOR;
3645 att_state1.blendEnable = VK_TRUE;
3646
3647 VkRenderpassObj rp_obj(m_device);
3648
3649 {
3650 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02116);
3651 VkPipelineObj pipeline(m_device);
3652 pipeline.AddShader(&vs_obj);
3653 pipeline.AddColorAttachment(0, &att_state1);
3654
3655 VkGraphicsPipelineCreateInfo info = {};
3656 pipeline.InitGraphicsPipelineCreateInfo(&info);
3657 info.pColorBlendState = nullptr;
3658
3659 pipeline.CreateVKPipeline(ds_obj.GetPipelineLayout(), rp_obj.handle(), &info);
3660 m_errorMonitor->VerifyFound();
3661 }
3662}
3663
Chris Forbes26ec2122016-11-29 08:58:33 +13003664#if 0
Tony Barbour4e919972016-08-09 13:27:40 -06003665TEST_F(VkLayerTest, RenderPassDepthStencilAttachmentUnused) {
3666 TEST_DESCRIPTION("Specify no depth attachement in renderpass then specify "
3667 "depth attachments in subpass");
Cody Northropc31a84f2016-08-22 10:41:47 -06003668 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbour4e919972016-08-09 13:27:40 -06003669
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003670 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3671 "vkCreateRenderPass has no depth/stencil attachment, yet subpass");
Tony Barbour4e919972016-08-09 13:27:40 -06003672
3673 // Create a renderPass with a single color attachment
3674 VkAttachmentReference attach = {};
3675 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
3676 VkSubpassDescription subpass = {};
3677 VkRenderPassCreateInfo rpci = {};
3678 rpci.subpassCount = 1;
3679 rpci.pSubpasses = &subpass;
3680 rpci.attachmentCount = 1;
3681 VkAttachmentDescription attach_desc = {};
3682 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3683 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3684 rpci.pAttachments = &attach_desc;
3685 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3686 VkRenderPass rp;
3687 subpass.pDepthStencilAttachment = &attach;
3688 subpass.pColorAttachments = NULL;
3689 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3690 m_errorMonitor->VerifyFound();
3691}
Chris Forbes26ec2122016-11-29 08:58:33 +13003692#endif
Tony Barbour4e919972016-08-09 13:27:40 -06003693
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003694TEST_F(VkLayerTest, UnusedPreserveAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003695 TEST_DESCRIPTION(
3696 "Create a framebuffer where a subpass has a preserve "
3697 "attachment reference of VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003698
3699 ASSERT_NO_FATAL_FAILURE(InitState());
3700 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3701
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003702 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "must not be VK_ATTACHMENT_UNUSED");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003703
3704 VkAttachmentReference color_attach = {};
3705 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3706 color_attach.attachment = 0;
3707 uint32_t preserve_attachment = VK_ATTACHMENT_UNUSED;
3708 VkSubpassDescription subpass = {};
3709 subpass.colorAttachmentCount = 1;
3710 subpass.pColorAttachments = &color_attach;
3711 subpass.preserveAttachmentCount = 1;
3712 subpass.pPreserveAttachments = &preserve_attachment;
3713
3714 VkRenderPassCreateInfo rpci = {};
3715 rpci.subpassCount = 1;
3716 rpci.pSubpasses = &subpass;
3717 rpci.attachmentCount = 1;
3718 VkAttachmentDescription attach_desc = {};
3719 attach_desc.format = VK_FORMAT_UNDEFINED;
3720 rpci.pAttachments = &attach_desc;
3721 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3722 VkRenderPass rp;
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003723 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003724
3725 m_errorMonitor->VerifyFound();
3726
Mark Lobodzinskia4feeeb2016-06-17 12:00:46 -06003727 if (result == VK_SUCCESS) {
3728 vkDestroyRenderPass(m_device->device(), rp, NULL);
3729 }
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003730}
3731
Chris Forbesc5389742016-06-29 11:49:23 +12003732TEST_F(VkLayerTest, CreateRenderPassResolveRequiresColorMsaa) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003733 TEST_DESCRIPTION(
3734 "Ensure that CreateRenderPass produces a validation error "
3735 "when the source of a subpass multisample resolve "
3736 "does not have multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003737
Chris Forbesc5389742016-06-29 11:49:23 +12003738 ASSERT_NO_FATAL_FAILURE(InitState());
3739
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003740 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3741 "Subpass 0 requests multisample resolve from attachment 0 which has "
3742 "VK_SAMPLE_COUNT_1_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003743
3744 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003745 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3746 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3747 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3748 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3749 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3750 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003751 };
3752
3753 VkAttachmentReference color = {
3754 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3755 };
3756
3757 VkAttachmentReference resolve = {
3758 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3759 };
3760
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003761 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003762
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003763 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003764
3765 VkRenderPass rp;
3766 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3767
3768 m_errorMonitor->VerifyFound();
3769
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003770 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003771}
3772
3773TEST_F(VkLayerTest, CreateRenderPassResolveRequiresSingleSampleDest) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003774 TEST_DESCRIPTION(
3775 "Ensure CreateRenderPass produces a validation error "
3776 "when a subpass multisample resolve operation is "
3777 "requested, and the destination of that resolve has "
3778 "multiple samples.");
Chris Forbes6655bb32016-07-01 18:27:30 +12003779
Chris Forbesc5389742016-06-29 11:49:23 +12003780 ASSERT_NO_FATAL_FAILURE(InitState());
3781
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003782 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3783 "Subpass 0 requests multisample resolve into attachment 1, which "
3784 "must have VK_SAMPLE_COUNT_1_BIT but has VK_SAMPLE_COUNT_4_BIT");
Chris Forbesc5389742016-06-29 11:49:23 +12003785
3786 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003787 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3788 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3789 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3790 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3791 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3792 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbesc5389742016-06-29 11:49:23 +12003793 };
3794
3795 VkAttachmentReference color = {
3796 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3797 };
3798
3799 VkAttachmentReference resolve = {
3800 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3801 };
3802
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003803 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &color, &resolve, nullptr, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003804
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003805 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesc5389742016-06-29 11:49:23 +12003806
3807 VkRenderPass rp;
3808 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3809
3810 m_errorMonitor->VerifyFound();
3811
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003812 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbesc5389742016-06-29 11:49:23 +12003813}
3814
Chris Forbes3f128ef2016-06-29 14:58:53 +12003815TEST_F(VkLayerTest, CreateRenderPassSubpassSampleCountConsistency) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003816 TEST_DESCRIPTION(
3817 "Ensure CreateRenderPass produces a validation error "
3818 "when the color and depth attachments used by a subpass "
3819 "have inconsistent sample counts");
Chris Forbes6655bb32016-07-01 18:27:30 +12003820
Chris Forbes3f128ef2016-06-29 14:58:53 +12003821 ASSERT_NO_FATAL_FAILURE(InitState());
3822
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003823 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3824 "Subpass 0 attempts to render to attachments with inconsistent sample counts");
Chris Forbes3f128ef2016-06-29 14:58:53 +12003825
3826 VkAttachmentDescription attachments[] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003827 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3828 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3829 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
3830 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_4_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
3831 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3832 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
Chris Forbes3f128ef2016-06-29 14:58:53 +12003833 };
3834
3835 VkAttachmentReference color[] = {
3836 {
3837 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3838 },
3839 {
3840 1, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
3841 },
3842 };
3843
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003844 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 2, color, nullptr, nullptr, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003845
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003846 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbes3f128ef2016-06-29 14:58:53 +12003847
3848 VkRenderPass rp;
3849 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
3850
3851 m_errorMonitor->VerifyFound();
3852
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003853 if (err == VK_SUCCESS) vkDestroyRenderPass(m_device->device(), rp, nullptr);
Chris Forbes3f128ef2016-06-29 14:58:53 +12003854}
3855
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003856TEST_F(VkLayerTest, FramebufferCreateErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003857 TEST_DESCRIPTION(
3858 "Hit errors when attempting to create a framebuffer :\n"
3859 " 1. Mismatch between framebuffer & renderPass attachmentCount\n"
3860 " 2. Use a color image as depthStencil attachment\n"
3861 " 3. Mismatch framebuffer & renderPass attachment formats\n"
3862 " 4. Mismatch framebuffer & renderPass attachment #samples\n"
3863 " 5. Framebuffer attachment w/ non-1 mip-levels\n"
3864 " 6. Framebuffer attachment where dimensions don't match\n"
3865 " 7. Framebuffer attachment w/o identity swizzle\n"
3866 " 8. framebuffer dimensions exceed physical device limits\n");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003867
3868 ASSERT_NO_FATAL_FAILURE(InitState());
3869 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
3870
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003871 m_errorMonitor->SetDesiredFailureMsg(
3872 VK_DEBUG_REPORT_ERROR_BIT_EXT,
3873 "vkCreateFramebuffer(): VkFramebufferCreateInfo attachmentCount of 2 does not match attachmentCount of 1 of ");
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003874
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003875 // Create a renderPass with a single color attachment
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003876 VkAttachmentReference attach = {};
3877 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
3878 VkSubpassDescription subpass = {};
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003879 subpass.pColorAttachments = &attach;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003880 VkRenderPassCreateInfo rpci = {};
3881 rpci.subpassCount = 1;
3882 rpci.pSubpasses = &subpass;
3883 rpci.attachmentCount = 1;
3884 VkAttachmentDescription attach_desc = {};
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003885 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003886 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003887 rpci.pAttachments = &attach_desc;
3888 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
3889 VkRenderPass rp;
3890 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3891 ASSERT_VK_SUCCESS(err);
3892
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003893 VkImageView ivs[2];
3894 ivs[0] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
3895 ivs[1] = m_renderTargets[0]->targetView(VK_FORMAT_B8G8R8A8_UNORM);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003896 VkFramebufferCreateInfo fb_info = {};
3897 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
3898 fb_info.pNext = NULL;
3899 fb_info.renderPass = rp;
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003900 // Set mis-matching attachmentCount
3901 fb_info.attachmentCount = 2;
3902 fb_info.pAttachments = ivs;
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003903 fb_info.width = 100;
3904 fb_info.height = 100;
3905 fb_info.layers = 1;
3906
3907 VkFramebuffer fb;
3908 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3909
3910 m_errorMonitor->VerifyFound();
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06003911 if (err == VK_SUCCESS) {
3912 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3913 }
3914 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003915
3916 // Create a renderPass with a depth-stencil attachment created with
3917 // IMAGE_USAGE_COLOR_ATTACHMENT
3918 // Add our color attachment to pDepthStencilAttachment
3919 subpass.pDepthStencilAttachment = &attach;
3920 subpass.pColorAttachments = NULL;
3921 VkRenderPass rp_ds;
3922 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp_ds);
3923 ASSERT_VK_SUCCESS(err);
3924 // Set correct attachment count, but attachment has COLOR usage bit set
3925 fb_info.attachmentCount = 1;
3926 fb_info.renderPass = rp_ds;
3927
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003928 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " conflicts with the image's IMAGE_USAGE flags ");
Tobin Ehlis2545e6f2016-06-22 10:42:19 -06003929 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3930
3931 m_errorMonitor->VerifyFound();
3932 if (err == VK_SUCCESS) {
3933 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3934 }
3935 vkDestroyRenderPass(m_device->device(), rp_ds, NULL);
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003936
3937 // Create new renderpass with alternate attachment format from fb
3938 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
3939 subpass.pDepthStencilAttachment = NULL;
3940 subpass.pColorAttachments = &attach;
3941 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3942 ASSERT_VK_SUCCESS(err);
3943
3944 // Cause error due to mis-matched formats between rp & fb
3945 // rp attachment 0 now has RGBA8 but corresponding fb attach is BGRA8
3946 fb_info.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
3948 " has format of VK_FORMAT_B8G8R8A8_UNORM that does not match ");
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003949 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3950
3951 m_errorMonitor->VerifyFound();
3952 if (err == VK_SUCCESS) {
3953 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3954 }
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003955 vkDestroyRenderPass(m_device->device(), rp, NULL);
3956
3957 // Create new renderpass with alternate sample count from fb
3958 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
3959 attach_desc.samples = VK_SAMPLE_COUNT_4_BIT;
3960 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3961 ASSERT_VK_SUCCESS(err);
3962
3963 // Cause error due to mis-matched sample count between rp & fb
3964 fb_info.renderPass = rp;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07003965 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayesba9aa222017-02-22 08:41:30 -07003966 " has VK_SAMPLE_COUNT_1_BIT samples that do not match the VK_SAMPLE_COUNT_4_BIT ");
Tobin Ehlis77d717c2016-06-22 14:19:19 -06003967 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
3968
3969 m_errorMonitor->VerifyFound();
3970 if (err == VK_SUCCESS) {
3971 vkDestroyFramebuffer(m_device->device(), fb, NULL);
3972 }
Tobin Ehlisd3bb23a2016-06-22 13:34:46 -06003973
3974 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis6cfda642016-06-22 16:12:58 -06003975
3976 // Create a custom imageView with non-1 mip levels
3977 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06003978 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 -06003979 ASSERT_TRUE(image.initialized());
3980
3981 VkImageView view;
3982 VkImageViewCreateInfo ivci = {};
3983 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
3984 ivci.image = image.handle();
3985 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
3986 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
3987 ivci.subresourceRange.layerCount = 1;
3988 ivci.subresourceRange.baseMipLevel = 0;
3989 // Set level count 2 (only 1 is allowed for FB attachment)
3990 ivci.subresourceRange.levelCount = 2;
3991 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
3992 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
3993 ASSERT_VK_SUCCESS(err);
3994 // Re-create renderpass to have matching sample count
3995 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
3996 err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
3997 ASSERT_VK_SUCCESS(err);
3998
3999 fb_info.renderPass = rp;
4000 fb_info.pAttachments = &view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004001 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has mip levelCount of 2 but only ");
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004002 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4003
4004 m_errorMonitor->VerifyFound();
4005 if (err == VK_SUCCESS) {
4006 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4007 }
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004008 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004009 // Update view to original color buffer and grow FB dimensions too big
4010 fb_info.pAttachments = ivs;
4011 fb_info.height = 1024;
4012 fb_info.width = 1024;
4013 fb_info.layers = 2;
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004014 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " Attachment dimensions must be at least as large. ");
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004015 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4016
4017 m_errorMonitor->VerifyFound();
4018 if (err == VK_SUCCESS) {
4019 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4020 }
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004021 // Create view attachment with non-identity swizzle
4022 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
4023 ivci.image = image.handle();
4024 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
4025 ivci.format = VK_FORMAT_B8G8R8A8_UNORM;
4026 ivci.subresourceRange.layerCount = 1;
4027 ivci.subresourceRange.baseMipLevel = 0;
4028 ivci.subresourceRange.levelCount = 1;
4029 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
4030 ivci.components.r = VK_COMPONENT_SWIZZLE_G;
4031 ivci.components.g = VK_COMPONENT_SWIZZLE_R;
4032 ivci.components.b = VK_COMPONENT_SWIZZLE_A;
4033 ivci.components.a = VK_COMPONENT_SWIZZLE_B;
4034 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
4035 ASSERT_VK_SUCCESS(err);
4036
4037 fb_info.pAttachments = &view;
4038 fb_info.height = 100;
4039 fb_info.width = 100;
4040 fb_info.layers = 1;
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004041 m_errorMonitor->SetDesiredFailureMsg(
4042 VK_DEBUG_REPORT_ERROR_BIT_EXT,
4043 " has non-identy swizzle. All framebuffer attachments must have been created with the identity swizzle. ");
Tobin Ehlisb1f303b2016-06-23 08:19:55 -06004044 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4045
4046 m_errorMonitor->VerifyFound();
4047 if (err == VK_SUCCESS) {
4048 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4049 }
4050 vkDestroyImageView(m_device->device(), view, NULL);
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004051 // reset attachment to color attachment
4052 fb_info.pAttachments = ivs;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004053
4054 // Request fb that exceeds max width
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004055 fb_info.width = m_device->props.limits.maxFramebufferWidth + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004056 fb_info.height = 100;
4057 fb_info.layers = 1;
4058 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00413);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004059 m_errorMonitor->SetDesiredFailureMsg(
4060 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004061 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4062 "Here are the respective dimensions for attachment");
4063
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004064 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4065
4066 m_errorMonitor->VerifyFound();
4067 if (err == VK_SUCCESS) {
4068 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4069 }
4070
4071 // Request fb that exceeds max height
4072 fb_info.width = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004073 fb_info.height = m_device->props.limits.maxFramebufferHeight + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004074 fb_info.layers = 1;
4075 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00414);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004076 m_errorMonitor->SetDesiredFailureMsg(
4077 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004078 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4079 "Here are the respective dimensions for attachment");
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004080 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4081
4082 m_errorMonitor->VerifyFound();
4083 if (err == VK_SUCCESS) {
4084 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4085 }
4086
4087 // Request fb that exceeds max layers
4088 fb_info.width = 100;
4089 fb_info.height = 100;
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004090 fb_info.layers = m_device->props.limits.maxFramebufferLayers + 1;
Mike Schuchardt8fb38062016-12-08 15:36:24 -07004091 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00415);
Jeremy Hayesba9aa222017-02-22 08:41:30 -07004092 m_errorMonitor->SetDesiredFailureMsg(
4093 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07004094 "has dimensions smaller than the corresponding framebuffer dimensions. Attachment dimensions must be at least as large. "
4095 "Here are the respective dimensions for attachment");
Tobin Ehlis08d4b5e2016-06-23 08:52:39 -06004096 err = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
4097
4098 m_errorMonitor->VerifyFound();
4099 if (err == VK_SUCCESS) {
4100 vkDestroyFramebuffer(m_device->device(), fb, NULL);
4101 }
Tobin Ehlis27f2ae82016-06-23 07:36:57 -06004102
Tobin Ehlis6cfda642016-06-22 16:12:58 -06004103 vkDestroyRenderPass(m_device->device(), rp, NULL);
Mark Lobodzinski6d17b9f2016-06-16 13:21:38 -06004104}
4105
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004106TEST_F(VkLayerTest, DynamicDepthBiasNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004107 TEST_DESCRIPTION(
4108 "Run a simple draw calls to validate failure when Depth Bias dynamic "
4109 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004110
Cody Northropc31a84f2016-08-22 10:41:47 -06004111 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004112 // Dynamic depth bias
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004113 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic depth bias state not set for this command buffer");
4114 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBias);
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004115 m_errorMonitor->VerifyFound();
4116}
4117
4118TEST_F(VkLayerTest, DynamicLineWidthNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004119 TEST_DESCRIPTION(
4120 "Run a simple draw calls to validate failure when Line Width dynamic "
4121 "state is required but not correctly bound.");
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004122
Cody Northropc31a84f2016-08-22 10:41:47 -06004123 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004124 // Dynamic line width
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004125 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Dynamic line width state not set for this command buffer");
4126 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailLineWidth);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004127 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004128}
4129
4130TEST_F(VkLayerTest, DynamicViewportNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004131 TEST_DESCRIPTION(
4132 "Run a simple draw calls to validate failure when Viewport dynamic "
4133 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004134
Cody Northropc31a84f2016-08-22 10:41:47 -06004135 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004136 // Dynamic viewport state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004137 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4138 "Dynamic viewport(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004139 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailViewport);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004140 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004141}
4142
4143TEST_F(VkLayerTest, DynamicScissorNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004144 TEST_DESCRIPTION(
4145 "Run a simple draw calls to validate failure when Scissor dynamic "
4146 "state is required but not correctly bound.");
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004147
Cody Northropc31a84f2016-08-22 10:41:47 -06004148 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004149 // Dynamic scissor state
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07004150 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4151 "Dynamic scissor(s) 0 are used by pipeline state object, but were not provided");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004152 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailScissor);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004153 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004154}
4155
Cortd713fe82016-07-27 09:51:27 -07004156TEST_F(VkLayerTest, DynamicBlendConstantsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004157 TEST_DESCRIPTION(
4158 "Run a simple draw calls to validate failure when Blend Constants "
4159 "dynamic state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004160
4161 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004162 // Dynamic blend constant state
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4164 "Dynamic blend constants state not set for this command buffer");
4165 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailBlend);
Tobin Ehlis21c88352016-05-26 06:15:45 -06004166 m_errorMonitor->VerifyFound();
4167}
4168
4169TEST_F(VkLayerTest, DynamicDepthBoundsNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004170 TEST_DESCRIPTION(
4171 "Run a simple draw calls to validate failure when Depth Bounds dynamic "
4172 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004173
4174 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis21c88352016-05-26 06:15:45 -06004175 if (!m_device->phy().features().depthBounds) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07004176 printf(" Device does not support depthBounds test; skipped.\n");
Tobin Ehlis21c88352016-05-26 06:15:45 -06004177 return;
4178 }
4179 // Dynamic depth bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004180 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4181 "Dynamic depth bounds state not set for this command buffer");
4182 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailDepthBounds);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004183 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004184}
4185
4186TEST_F(VkLayerTest, DynamicStencilReadNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004187 TEST_DESCRIPTION(
4188 "Run a simple draw calls to validate failure when Stencil Read dynamic "
4189 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004190
4191 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004192 // Dynamic stencil read mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004193 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4194 "Dynamic stencil read mask state not set for this command buffer");
4195 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReadMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004196 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004197}
4198
4199TEST_F(VkLayerTest, DynamicStencilWriteNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004200 TEST_DESCRIPTION(
4201 "Run a simple draw calls to validate failure when Stencil Write dynamic"
4202 " state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004203
4204 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004205 // Dynamic stencil write mask
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004206 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4207 "Dynamic stencil write mask state not set for this command buffer");
4208 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilWriteMask);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004209 m_errorMonitor->VerifyFound();
Tobin Ehlisb1a87992016-05-25 16:42:47 -06004210}
4211
4212TEST_F(VkLayerTest, DynamicStencilRefNotBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004213 TEST_DESCRIPTION(
4214 "Run a simple draw calls to validate failure when Stencil Ref dynamic "
4215 "state is required but not correctly bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004216
4217 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisa5200ef2016-05-03 10:34:08 -06004218 // Dynamic stencil reference
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4220 "Dynamic stencil reference state not set for this command buffer");
4221 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailStencilReference);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004222 m_errorMonitor->VerifyFound();
Tobin Ehlis963a4042015-09-29 08:18:34 -06004223}
4224
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004225TEST_F(VkLayerTest, IndexBufferNotBound) {
4226 TEST_DESCRIPTION("Run an indexed draw call without an index buffer bound.");
Cody Northropc31a84f2016-08-22 10:41:47 -06004227
4228 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004229 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4230 "Index buffer object not bound to this command buffer when Indexed ");
4231 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailIndexBuffer);
Tobin Ehlis379ba3b2016-07-19 11:22:29 -06004232 m_errorMonitor->VerifyFound();
4233}
4234
Karl Schultz6addd812016-02-02 17:17:23 -07004235TEST_F(VkLayerTest, CommandBufferTwoSubmits) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004236 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
4237 "was begun w/ VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has "
4238 "been submitted");
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004239
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004240 ASSERT_NO_FATAL_FAILURE(InitState());
4241 ASSERT_NO_FATAL_FAILURE(InitViewport());
4242 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4243
Karl Schultz6addd812016-02-02 17:17:23 -07004244 // We luck out b/c by default the framework creates CB w/ the
4245 // VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set
Tony Barbour552f6c02016-12-21 14:34:07 -07004246 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004247 m_commandBuffer->ClearAllBuffers(m_clear_color, m_depth_clear_color, m_stencil_clear_color, NULL);
Tony Barbour552f6c02016-12-21 14:34:07 -07004248 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004249
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004250 // Bypass framework since it does the waits automatically
4251 VkResult err = VK_SUCCESS;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004252 VkSubmitInfo submit_info;
Chia-I Wuf9be13c2015-10-26 20:37:06 +08004253 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4254 submit_info.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004255 submit_info.waitSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004256 submit_info.pWaitSemaphores = NULL;
Jon Ashburn7f9716c2015-12-30 16:42:50 -07004257 submit_info.pWaitDstStageMask = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08004258 submit_info.commandBufferCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004259 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Chia-I Wud50a7d72015-10-26 20:48:51 +08004260 submit_info.signalSemaphoreCount = 0;
Courtney Goeltzenleuchter806c7002015-10-27 11:22:14 -06004261 submit_info.pSignalSemaphores = NULL;
4262
Chris Forbes40028e22016-06-13 09:59:34 +12004263 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Karl Schultz6addd812016-02-02 17:17:23 -07004264 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004265 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004266
Karl Schultz6addd812016-02-02 17:17:23 -07004267 // Cause validation error by re-submitting cmd buffer that should only be
4268 // submitted once
Chris Forbes40028e22016-06-13 09:59:34 +12004269 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski89cad1a2016-11-11 15:51:31 -07004270 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004271
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004272 m_errorMonitor->VerifyFound();
Tobin Ehlis59278bf2015-08-18 07:10:58 -06004273}
4274
Karl Schultz6addd812016-02-02 17:17:23 -07004275TEST_F(VkLayerTest, AllocDescriptorFromEmptyPool) {
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004276 TEST_DESCRIPTION("Attempt to allocate more sets and descriptors than descriptor pool has available.");
Karl Schultz6addd812016-02-02 17:17:23 -07004277 VkResult err;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004278
4279 ASSERT_NO_FATAL_FAILURE(InitState());
4280 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004281
Karl Schultz6addd812016-02-02 17:17:23 -07004282 // Create Pool w/ 1 Sampler descriptor, but try to alloc Uniform Buffer
4283 // descriptor from it
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004284 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004285 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004286 ds_type_count.descriptorCount = 2;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004287
4288 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004289 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4290 ds_pool_ci.pNext = NULL;
4291 ds_pool_ci.flags = 0;
4292 ds_pool_ci.maxSets = 1;
4293 ds_pool_ci.poolSizeCount = 1;
4294 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004295
4296 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004297 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004298 ASSERT_VK_SUCCESS(err);
4299
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004300 VkDescriptorSetLayoutBinding dsl_binding_samp = {};
4301 dsl_binding_samp.binding = 0;
4302 dsl_binding_samp.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4303 dsl_binding_samp.descriptorCount = 1;
4304 dsl_binding_samp.stageFlags = VK_SHADER_STAGE_ALL;
4305 dsl_binding_samp.pImmutableSamplers = NULL;
4306
4307 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4308 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4309 ds_layout_ci.pNext = NULL;
4310 ds_layout_ci.bindingCount = 1;
4311 ds_layout_ci.pBindings = &dsl_binding_samp;
4312
4313 VkDescriptorSetLayout ds_layout_samp;
4314 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_samp);
4315 ASSERT_VK_SUCCESS(err);
4316
4317 // Try to allocate 2 sets when pool only has 1 set
4318 VkDescriptorSet descriptor_sets[2];
4319 VkDescriptorSetLayout set_layouts[2] = {ds_layout_samp, ds_layout_samp};
4320 VkDescriptorSetAllocateInfo alloc_info = {};
4321 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4322 alloc_info.descriptorSetCount = 2;
4323 alloc_info.descriptorPool = ds_pool;
4324 alloc_info.pSetLayouts = set_layouts;
4325 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00911);
4326 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
4327 m_errorMonitor->VerifyFound();
4328
4329 alloc_info.descriptorSetCount = 1;
4330 // Create layout w/ descriptor type not available in pool
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004331 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004332 dsl_binding.binding = 0;
4333 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4334 dsl_binding.descriptorCount = 1;
4335 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4336 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004337
Karl Schultz6addd812016-02-02 17:17:23 -07004338 ds_layout_ci.bindingCount = 1;
4339 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004340
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004341 VkDescriptorSetLayout ds_layout_ub;
4342 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_ub);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004343 ASSERT_VK_SUCCESS(err);
4344
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004345 VkDescriptorSet descriptor_set;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004346 alloc_info.descriptorSetCount = 1;
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004347 alloc_info.pSetLayouts = &ds_layout_ub;
4348 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00912);
4349 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004350
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004351 m_errorMonitor->VerifyFound();
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004352
Karl Schultz2825ab92016-12-02 08:23:14 -07004353 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_samp, NULL);
Tobin Ehlis14cd5852016-11-23 12:52:48 -07004354 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_ub, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +08004355 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisf93f1e32015-10-20 16:16:04 -06004356}
4357
Karl Schultz6addd812016-02-02 17:17:23 -07004358TEST_F(VkLayerTest, FreeDescriptorFromOneShotPool) {
4359 VkResult err;
Tobin Ehlise735c692015-10-08 13:13:50 -06004360
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004361 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00922);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06004362
Tobin Ehlise735c692015-10-08 13:13:50 -06004363 ASSERT_NO_FATAL_FAILURE(InitState());
4364 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise735c692015-10-08 13:13:50 -06004365
Chia-I Wu1b99bb22015-10-27 19:25:11 +08004366 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004367 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4368 ds_type_count.descriptorCount = 1;
Tobin Ehlise735c692015-10-08 13:13:50 -06004369
4370 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004371 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4372 ds_pool_ci.pNext = NULL;
4373 ds_pool_ci.maxSets = 1;
4374 ds_pool_ci.poolSizeCount = 1;
4375 ds_pool_ci.flags = 0;
4376 // Not specifying VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT means
4377 // app can only call vkResetDescriptorPool on this pool.;
4378 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise735c692015-10-08 13:13:50 -06004379
4380 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004381 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise735c692015-10-08 13:13:50 -06004382 ASSERT_VK_SUCCESS(err);
4383
4384 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004385 dsl_binding.binding = 0;
4386 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4387 dsl_binding.descriptorCount = 1;
4388 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
4389 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlise735c692015-10-08 13:13:50 -06004390
4391 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07004392 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4393 ds_layout_ci.pNext = NULL;
4394 ds_layout_ci.bindingCount = 1;
4395 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise735c692015-10-08 13:13:50 -06004396
4397 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004398 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise735c692015-10-08 13:13:50 -06004399 ASSERT_VK_SUCCESS(err);
4400
4401 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08004402 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08004403 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07004404 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06004405 alloc_info.descriptorPool = ds_pool;
4406 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004407 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise735c692015-10-08 13:13:50 -06004408 ASSERT_VK_SUCCESS(err);
4409
4410 err = vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12004411 m_errorMonitor->VerifyFound();
Tobin Ehlise735c692015-10-08 13:13:50 -06004412
Chia-I Wuf7458c52015-10-26 21:10:41 +08004413 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4414 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise735c692015-10-08 13:13:50 -06004415}
4416
Karl Schultz6addd812016-02-02 17:17:23 -07004417TEST_F(VkLayerTest, InvalidDescriptorPool) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004418 // Attempt to clear Descriptor Pool with bad object.
4419 // ObjectTracker should catch this.
Cody Northropc31a84f2016-08-22 10:41:47 -06004420
4421 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004422 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00930);
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004423 uint64_t fake_pool_handle = 0xbaad6001;
4424 VkDescriptorPool bad_pool = reinterpret_cast<VkDescriptorPool &>(fake_pool_handle);
4425 vkResetDescriptorPool(device(), bad_pool, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -06004426 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004427}
4428
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004429TEST_F(VkLayerTest, InvalidDescriptorSet) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004430 // Attempt to bind an invalid Descriptor Set to a valid Command Buffer
4431 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004432 // Create a valid cmd buffer
Karl Schultzbdb75952016-04-19 11:36:49 -06004433 // call vkCmdBindDescriptorSets w/ false Descriptor Set
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004434
4435 uint64_t fake_set_handle = 0xbaad6001;
4436 VkDescriptorSet bad_set = reinterpret_cast<VkDescriptorSet &>(fake_set_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06004437 VkResult err;
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004438 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00982);
Karl Schultzbdb75952016-04-19 11:36:49 -06004439
4440 ASSERT_NO_FATAL_FAILURE(InitState());
4441
4442 VkDescriptorSetLayoutBinding layout_bindings[1] = {};
4443 layout_bindings[0].binding = 0;
4444 layout_bindings[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4445 layout_bindings[0].descriptorCount = 1;
4446 layout_bindings[0].stageFlags = VK_SHADER_STAGE_VERTEX_BIT;
4447 layout_bindings[0].pImmutableSamplers = NULL;
4448
4449 VkDescriptorSetLayout descriptor_set_layout;
4450 VkDescriptorSetLayoutCreateInfo dslci = {};
4451 dslci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4452 dslci.pNext = NULL;
4453 dslci.bindingCount = 1;
4454 dslci.pBindings = layout_bindings;
4455 err = vkCreateDescriptorSetLayout(device(), &dslci, NULL, &descriptor_set_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004456 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004457
4458 VkPipelineLayout pipeline_layout;
4459 VkPipelineLayoutCreateInfo plci = {};
4460 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4461 plci.pNext = NULL;
4462 plci.setLayoutCount = 1;
4463 plci.pSetLayouts = &descriptor_set_layout;
4464 err = vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
Karl Schultz5cb21112016-04-21 17:17:40 -06004465 ASSERT_VK_SUCCESS(err);
Karl Schultzbdb75952016-04-19 11:36:49 -06004466
Tony Barbour552f6c02016-12-21 14:34:07 -07004467 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004468 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1, &bad_set, 0,
4469 NULL);
Karl Schultzbdb75952016-04-19 11:36:49 -06004470 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07004471 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -06004472 vkDestroyPipelineLayout(device(), pipeline_layout, NULL);
4473 vkDestroyDescriptorSetLayout(device(), descriptor_set_layout, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004474}
4475
Karl Schultz6addd812016-02-02 17:17:23 -07004476TEST_F(VkLayerTest, InvalidDescriptorSetLayout) {
Karl Schultzbdb75952016-04-19 11:36:49 -06004477 // Attempt to create a Pipeline Layout with an invalid Descriptor Set Layout.
4478 // ObjectTracker should catch this.
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06004479 uint64_t fake_layout_handle = 0xbaad6001;
4480 VkDescriptorSetLayout bad_layout = reinterpret_cast<VkDescriptorSetLayout &>(fake_layout_handle);
Karl Schultzf78bcdd2016-11-30 12:36:01 -07004481 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00875);
Cody Northropc31a84f2016-08-22 10:41:47 -06004482 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultzbdb75952016-04-19 11:36:49 -06004483 VkPipelineLayout pipeline_layout;
4484 VkPipelineLayoutCreateInfo plci = {};
4485 plci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4486 plci.pNext = NULL;
4487 plci.setLayoutCount = 1;
4488 plci.pSetLayouts = &bad_layout;
4489 vkCreatePipelineLayout(device(), &plci, NULL, &pipeline_layout);
4490
4491 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06004492}
4493
Mark Muellerd4914412016-06-13 17:52:06 -06004494TEST_F(VkLayerTest, WriteDescriptorSetIntegrityCheck) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004495 TEST_DESCRIPTION(
4496 "This test verifies some requirements of chapter 13.2.3 of the Vulkan Spec "
4497 "1) A uniform buffer update must have a valid buffer index."
4498 "2) When using an array of descriptors in a single WriteDescriptor,"
4499 " the descriptor types and stageflags must all be the same."
4500 "3) Immutable Sampler state must match across descriptors");
Mark Muellerd4914412016-06-13 17:52:06 -06004501
Mike Weiblena6666382017-01-05 15:16:11 -07004502 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00941);
Mark Muellerd4914412016-06-13 17:52:06 -06004503
4504 ASSERT_NO_FATAL_FAILURE(InitState());
4505 VkDescriptorPoolSize ds_type_count[4] = {};
4506 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4507 ds_type_count[0].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004508 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004509 ds_type_count[1].descriptorCount = 1;
Tony Barboure132c5f2016-12-12 11:50:20 -07004510 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Muellerd4914412016-06-13 17:52:06 -06004511 ds_type_count[2].descriptorCount = 1;
4512 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
4513 ds_type_count[3].descriptorCount = 1;
4514
4515 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4516 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4517 ds_pool_ci.maxSets = 1;
4518 ds_pool_ci.poolSizeCount = sizeof(ds_type_count) / sizeof(VkDescriptorPoolSize);
4519 ds_pool_ci.pPoolSizes = ds_type_count;
4520
4521 VkDescriptorPool ds_pool;
4522 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4523 ASSERT_VK_SUCCESS(err);
4524
Mark Muellerb9896722016-06-16 09:54:29 -06004525 VkDescriptorSetLayoutBinding layout_binding[3] = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004526 layout_binding[0].binding = 0;
4527 layout_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4528 layout_binding[0].descriptorCount = 1;
4529 layout_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
4530 layout_binding[0].pImmutableSamplers = NULL;
4531
4532 layout_binding[1].binding = 1;
4533 layout_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4534 layout_binding[1].descriptorCount = 1;
4535 layout_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4536 layout_binding[1].pImmutableSamplers = NULL;
4537
4538 VkSamplerCreateInfo sampler_ci = {};
4539 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
4540 sampler_ci.pNext = NULL;
4541 sampler_ci.magFilter = VK_FILTER_NEAREST;
4542 sampler_ci.minFilter = VK_FILTER_NEAREST;
4543 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
4544 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4545 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4546 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
4547 sampler_ci.mipLodBias = 1.0;
4548 sampler_ci.anisotropyEnable = VK_FALSE;
4549 sampler_ci.maxAnisotropy = 1;
4550 sampler_ci.compareEnable = VK_FALSE;
4551 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
4552 sampler_ci.minLod = 1.0;
4553 sampler_ci.maxLod = 1.0;
4554 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
4555 sampler_ci.unnormalizedCoordinates = VK_FALSE;
4556 VkSampler sampler;
4557
4558 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
4559 ASSERT_VK_SUCCESS(err);
4560
4561 layout_binding[2].binding = 2;
4562 layout_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
4563 layout_binding[2].descriptorCount = 1;
4564 layout_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4565 layout_binding[2].pImmutableSamplers = static_cast<VkSampler *>(&sampler);
4566
Mark Muellerd4914412016-06-13 17:52:06 -06004567 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4568 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4569 ds_layout_ci.bindingCount = sizeof(layout_binding) / sizeof(VkDescriptorSetLayoutBinding);
4570 ds_layout_ci.pBindings = layout_binding;
4571 VkDescriptorSetLayout ds_layout;
4572 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4573 ASSERT_VK_SUCCESS(err);
4574
4575 VkDescriptorSetAllocateInfo alloc_info = {};
4576 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4577 alloc_info.descriptorSetCount = 1;
4578 alloc_info.descriptorPool = ds_pool;
4579 alloc_info.pSetLayouts = &ds_layout;
4580 VkDescriptorSet descriptorSet;
4581 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
4582 ASSERT_VK_SUCCESS(err);
4583
4584 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4585 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4586 pipeline_layout_ci.pNext = NULL;
4587 pipeline_layout_ci.setLayoutCount = 1;
4588 pipeline_layout_ci.pSetLayouts = &ds_layout;
4589
4590 VkPipelineLayout pipeline_layout;
4591 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4592 ASSERT_VK_SUCCESS(err);
4593
Mark Mueller5c838ce2016-06-16 09:54:29 -06004594 VkWriteDescriptorSet descriptor_write = {};
Mark Muellerd4914412016-06-13 17:52:06 -06004595 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4596 descriptor_write.dstSet = descriptorSet;
4597 descriptor_write.dstBinding = 0;
4598 descriptor_write.descriptorCount = 1;
4599 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
4600
Mark Mueller5c838ce2016-06-16 09:54:29 -06004601 // 1) The uniform buffer is intentionally invalid here
Mark Muellerd4914412016-06-13 17:52:06 -06004602 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4603 m_errorMonitor->VerifyFound();
4604
4605 // Create a buffer to update the descriptor with
4606 uint32_t qfi = 0;
4607 VkBufferCreateInfo buffCI = {};
4608 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4609 buffCI.size = 1024;
4610 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
4611 buffCI.queueFamilyIndexCount = 1;
4612 buffCI.pQueueFamilyIndices = &qfi;
4613
4614 VkBuffer dyub;
4615 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
4616 ASSERT_VK_SUCCESS(err);
Mark Muellerd4914412016-06-13 17:52:06 -06004617
Tony Barboure132c5f2016-12-12 11:50:20 -07004618 VkDeviceMemory mem;
4619 VkMemoryRequirements mem_reqs;
4620 vkGetBufferMemoryRequirements(m_device->device(), dyub, &mem_reqs);
4621
4622 VkMemoryAllocateInfo mem_alloc_info = {};
4623 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4624 mem_alloc_info.allocationSize = mem_reqs.size;
4625 m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
4626 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
4627 ASSERT_VK_SUCCESS(err);
4628
4629 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
4630 ASSERT_VK_SUCCESS(err);
4631
4632 VkDescriptorBufferInfo buffInfo[2] = {};
4633 buffInfo[0].buffer = dyub;
4634 buffInfo[0].offset = 0;
4635 buffInfo[0].range = 1024;
4636 buffInfo[1].buffer = dyub;
4637 buffInfo[1].offset = 0;
4638 buffInfo[1].range = 1024;
4639 descriptor_write.pBufferInfo = buffInfo;
Mark Muellerd4914412016-06-13 17:52:06 -06004640 descriptor_write.descriptorCount = 2;
4641
Mark Mueller5c838ce2016-06-16 09:54:29 -06004642 // 2) The stateFlags don't match between the first and second descriptor
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004643 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004644 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4645 m_errorMonitor->VerifyFound();
4646
Mark Mueller5c838ce2016-06-16 09:54:29 -06004647 // 3) The second descriptor has a null_ptr pImmutableSamplers and
4648 // the third descriptor contains an immutable sampler
Mark Muellerd4914412016-06-13 17:52:06 -06004649 descriptor_write.dstBinding = 1;
4650 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Mark Mueller5c838ce2016-06-16 09:54:29 -06004651
Mark Mueller5c838ce2016-06-16 09:54:29 -06004652 // Make pImageInfo index non-null to avoid complaints of it missing
4653 VkDescriptorImageInfo imageInfo = {};
4654 imageInfo.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
4655 descriptor_write.pImageInfo = &imageInfo;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07004656 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Muellerd4914412016-06-13 17:52:06 -06004657 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4658 m_errorMonitor->VerifyFound();
4659
Mark Muellerd4914412016-06-13 17:52:06 -06004660 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tony Barboure132c5f2016-12-12 11:50:20 -07004661 vkFreeMemory(m_device->device(), mem, NULL);
Mark Muellerd4914412016-06-13 17:52:06 -06004662 vkDestroySampler(m_device->device(), sampler, NULL);
4663 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4664 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4665 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4666}
4667
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004668TEST_F(VkLayerTest, InvalidCmdBufferBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004669 TEST_DESCRIPTION(
4670 "Attempt to draw with a command buffer that is invalid "
4671 "due to a buffer dependency being destroyed.");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004672 ASSERT_NO_FATAL_FAILURE(InitState());
4673
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004674 VkBuffer buffer;
4675 VkDeviceMemory mem;
4676 VkMemoryRequirements mem_reqs;
4677
4678 VkBufferCreateInfo buf_info = {};
4679 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes3d5882f2016-09-16 17:37:17 +12004680 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004681 buf_info.size = 256;
4682 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
4683 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
4684 ASSERT_VK_SUCCESS(err);
4685
4686 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
4687
4688 VkMemoryAllocateInfo alloc_info = {};
4689 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4690 alloc_info.allocationSize = 256;
4691 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004692 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 -06004693 if (!pass) {
4694 vkDestroyBuffer(m_device->device(), buffer, NULL);
4695 return;
4696 }
4697 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
4698 ASSERT_VK_SUCCESS(err);
4699
4700 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
4701 ASSERT_VK_SUCCESS(err);
4702
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004703 m_commandBuffer->BeginCommandBuffer();
Chris Forbes3d5882f2016-09-16 17:37:17 +12004704 vkCmdFillBuffer(m_commandBuffer->GetBufferHandle(), buffer, 0, VK_WHOLE_SIZE, 0);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004705 m_commandBuffer->EndCommandBuffer();
4706
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004708 // Destroy buffer dependency prior to submit to cause ERROR
4709 vkDestroyBuffer(m_device->device(), buffer, NULL);
4710
4711 VkSubmitInfo submit_info = {};
4712 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4713 submit_info.commandBufferCount = 1;
4714 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4715 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4716
4717 m_errorMonitor->VerifyFound();
Rene Lindsayab6c5cd2016-12-20 14:05:37 -07004718 vkQueueWaitIdle(m_device->m_queue);
Tobin Ehlis0283c4d2016-06-28 17:57:07 -06004719 vkFreeMemory(m_device->handle(), mem, NULL);
4720}
4721
Tobin Ehlisea413442016-09-28 10:23:59 -06004722TEST_F(VkLayerTest, InvalidCmdBufferBufferViewDestroyed) {
4723 TEST_DESCRIPTION("Delete bufferView bound to cmd buffer, then attempt to submit cmd buffer.");
4724
4725 ASSERT_NO_FATAL_FAILURE(InitState());
4726 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4727
4728 VkDescriptorPoolSize ds_type_count;
4729 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4730 ds_type_count.descriptorCount = 1;
4731
4732 VkDescriptorPoolCreateInfo ds_pool_ci = {};
4733 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
4734 ds_pool_ci.maxSets = 1;
4735 ds_pool_ci.poolSizeCount = 1;
4736 ds_pool_ci.pPoolSizes = &ds_type_count;
4737
4738 VkDescriptorPool ds_pool;
4739 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
4740 ASSERT_VK_SUCCESS(err);
4741
4742 VkDescriptorSetLayoutBinding layout_binding;
4743 layout_binding.binding = 0;
4744 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4745 layout_binding.descriptorCount = 1;
4746 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
4747 layout_binding.pImmutableSamplers = NULL;
4748
4749 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
4750 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
4751 ds_layout_ci.bindingCount = 1;
4752 ds_layout_ci.pBindings = &layout_binding;
4753 VkDescriptorSetLayout ds_layout;
4754 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
4755 ASSERT_VK_SUCCESS(err);
4756
4757 VkDescriptorSetAllocateInfo alloc_info = {};
4758 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
4759 alloc_info.descriptorSetCount = 1;
4760 alloc_info.descriptorPool = ds_pool;
4761 alloc_info.pSetLayouts = &ds_layout;
4762 VkDescriptorSet descriptor_set;
4763 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
4764 ASSERT_VK_SUCCESS(err);
4765
4766 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
4767 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
4768 pipeline_layout_ci.pNext = NULL;
4769 pipeline_layout_ci.setLayoutCount = 1;
4770 pipeline_layout_ci.pSetLayouts = &ds_layout;
4771
4772 VkPipelineLayout pipeline_layout;
4773 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
4774 ASSERT_VK_SUCCESS(err);
4775
4776 VkBuffer buffer;
4777 uint32_t queue_family_index = 0;
4778 VkBufferCreateInfo buffer_create_info = {};
4779 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
4780 buffer_create_info.size = 1024;
4781 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
4782 buffer_create_info.queueFamilyIndexCount = 1;
4783 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
4784
4785 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
4786 ASSERT_VK_SUCCESS(err);
4787
4788 VkMemoryRequirements memory_reqs;
4789 VkDeviceMemory buffer_memory;
4790
4791 VkMemoryAllocateInfo memory_info = {};
4792 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4793 memory_info.allocationSize = 0;
4794 memory_info.memoryTypeIndex = 0;
4795
4796 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
4797 memory_info.allocationSize = memory_reqs.size;
4798 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
4799 ASSERT_TRUE(pass);
4800
4801 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
4802 ASSERT_VK_SUCCESS(err);
4803 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
4804 ASSERT_VK_SUCCESS(err);
4805
4806 VkBufferView view;
4807 VkBufferViewCreateInfo bvci = {};
4808 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
4809 bvci.buffer = buffer;
4810 bvci.format = VK_FORMAT_R8_UNORM;
4811 bvci.range = VK_WHOLE_SIZE;
4812
4813 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
4814 ASSERT_VK_SUCCESS(err);
4815
4816 VkWriteDescriptorSet descriptor_write = {};
4817 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
4818 descriptor_write.dstSet = descriptor_set;
4819 descriptor_write.dstBinding = 0;
4820 descriptor_write.descriptorCount = 1;
4821 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
4822 descriptor_write.pTexelBufferView = &view;
4823
4824 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
4825
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004826 char const *vsSource =
4827 "#version 450\n"
4828 "\n"
4829 "out gl_PerVertex { \n"
4830 " vec4 gl_Position;\n"
4831 "};\n"
4832 "void main(){\n"
4833 " gl_Position = vec4(1);\n"
4834 "}\n";
4835 char const *fsSource =
4836 "#version 450\n"
4837 "\n"
4838 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
4839 "layout(location=0) out vec4 x;\n"
4840 "void main(){\n"
4841 " x = imageLoad(s, 0);\n"
4842 "}\n";
Tobin Ehlisea413442016-09-28 10:23:59 -06004843 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
4844 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
4845 VkPipelineObj pipe(m_device);
4846 pipe.AddShader(&vs);
4847 pipe.AddShader(&fs);
4848 pipe.AddColorAttachment();
4849 pipe.CreateVKPipeline(pipeline_layout, renderPass());
4850
Tobin Ehlisea413442016-09-28 10:23:59 -06004851 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer view ");
4852
Tony Barbour552f6c02016-12-21 14:34:07 -07004853 m_commandBuffer->BeginCommandBuffer();
4854 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
4855
Tobin Ehlisea413442016-09-28 10:23:59 -06004856 VkViewport viewport = {0, 0, 16, 16, 0, 1};
4857 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
4858 VkRect2D scissor = {{0, 0}, {16, 16}};
4859 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
4860 // Bind pipeline to cmd buffer
4861 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
4862 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
4863 &descriptor_set, 0, nullptr);
4864 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07004865 m_commandBuffer->EndRenderPass();
4866 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisea413442016-09-28 10:23:59 -06004867
4868 // Delete BufferView in order to invalidate cmd buffer
4869 vkDestroyBufferView(m_device->device(), view, NULL);
4870 // Now attempt submit of cmd buffer
4871 VkSubmitInfo submit_info = {};
4872 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4873 submit_info.commandBufferCount = 1;
4874 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4875 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4876 m_errorMonitor->VerifyFound();
4877
4878 // Clean-up
4879 vkDestroyBuffer(m_device->device(), buffer, NULL);
4880 vkFreeMemory(m_device->device(), buffer_memory, NULL);
4881 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
4882 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
4883 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
4884}
4885
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004886TEST_F(VkLayerTest, InvalidCmdBufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004887 TEST_DESCRIPTION(
4888 "Attempt to draw with a command buffer that is invalid "
4889 "due to an image dependency being destroyed.");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004890 ASSERT_NO_FATAL_FAILURE(InitState());
4891
4892 VkImage image;
4893 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
4894 VkImageCreateInfo image_create_info = {};
4895 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4896 image_create_info.pNext = NULL;
4897 image_create_info.imageType = VK_IMAGE_TYPE_2D;
4898 image_create_info.format = tex_format;
4899 image_create_info.extent.width = 32;
4900 image_create_info.extent.height = 32;
4901 image_create_info.extent.depth = 1;
4902 image_create_info.mipLevels = 1;
4903 image_create_info.arrayLayers = 1;
4904 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
4905 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004906 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004907 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004908 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004909 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004910 // Have to bind memory to image before recording cmd in cmd buffer using it
4911 VkMemoryRequirements mem_reqs;
4912 VkDeviceMemory image_mem;
4913 bool pass;
4914 VkMemoryAllocateInfo mem_alloc = {};
4915 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4916 mem_alloc.pNext = NULL;
4917 mem_alloc.memoryTypeIndex = 0;
4918 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
4919 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004920 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004921 ASSERT_TRUE(pass);
4922 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
4923 ASSERT_VK_SUCCESS(err);
4924 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
4925 ASSERT_VK_SUCCESS(err);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004926
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004927 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis764d7072016-07-01 12:54:29 -06004928 VkClearColorValue ccv;
4929 ccv.float32[0] = 1.0f;
4930 ccv.float32[1] = 1.0f;
4931 ccv.float32[2] = 1.0f;
4932 ccv.float32[3] = 1.0f;
4933 VkImageSubresourceRange isr = {};
4934 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004935 isr.baseArrayLayer = 0;
4936 isr.baseMipLevel = 0;
Tobin Ehlis764d7072016-07-01 12:54:29 -06004937 isr.layerCount = 1;
4938 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004939 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004940 m_commandBuffer->EndCommandBuffer();
4941
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004942 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004943 // Destroy image dependency prior to submit to cause ERROR
4944 vkDestroyImage(m_device->device(), image, NULL);
4945
4946 VkSubmitInfo submit_info = {};
4947 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
4948 submit_info.commandBufferCount = 1;
4949 submit_info.pCommandBuffers = &m_commandBuffer->handle();
4950 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
4951
4952 m_errorMonitor->VerifyFound();
Tobin Ehlis3d09fd52016-07-06 08:12:56 -06004953 vkFreeMemory(m_device->device(), image_mem, nullptr);
Tobin Ehlis11c8cea2016-06-28 17:44:21 -06004954}
4955
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004956TEST_F(VkLayerTest, InvalidCmdBufferFramebufferImageDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07004957 TEST_DESCRIPTION(
4958 "Attempt to draw with a command buffer that is invalid "
4959 "due to a framebuffer image dependency being destroyed.");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004960 VkFormatProperties format_properties;
4961 VkResult err = VK_SUCCESS;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004962 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
4963 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004964 return;
4965 }
4966
4967 ASSERT_NO_FATAL_FAILURE(InitState());
4968 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
4969
4970 VkImageCreateInfo image_ci = {};
4971 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
4972 image_ci.pNext = NULL;
4973 image_ci.imageType = VK_IMAGE_TYPE_2D;
4974 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
4975 image_ci.extent.width = 32;
4976 image_ci.extent.height = 32;
4977 image_ci.extent.depth = 1;
4978 image_ci.mipLevels = 1;
4979 image_ci.arrayLayers = 1;
4980 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
4981 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004982 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_SAMPLED_BIT;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004983 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
4984 image_ci.flags = 0;
4985 VkImage image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004986 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004987
4988 VkMemoryRequirements memory_reqs;
4989 VkDeviceMemory image_memory;
4990 bool pass;
4991 VkMemoryAllocateInfo memory_info = {};
4992 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
4993 memory_info.pNext = NULL;
4994 memory_info.allocationSize = 0;
4995 memory_info.memoryTypeIndex = 0;
4996 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
4997 memory_info.allocationSize = memory_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06004998 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06004999 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005000 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005001 ASSERT_VK_SUCCESS(err);
5002 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5003 ASSERT_VK_SUCCESS(err);
5004
5005 VkImageViewCreateInfo ivci = {
5006 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5007 nullptr,
5008 0,
5009 image,
5010 VK_IMAGE_VIEW_TYPE_2D,
5011 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005012 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005013 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5014 };
5015 VkImageView view;
5016 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5017 ASSERT_VK_SUCCESS(err);
5018
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005019 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 32, 32, 1};
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005020 VkFramebuffer fb;
5021 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5022 ASSERT_VK_SUCCESS(err);
5023
5024 // Just use default renderpass with our framebuffer
5025 m_renderPassBeginInfo.framebuffer = fb;
Jeremy Hayesba817e12017-03-03 15:51:11 -07005026 m_renderPassBeginInfo.renderArea.extent.width = 32;
5027 m_renderPassBeginInfo.renderArea.extent.height = 32;
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005028 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005029 m_commandBuffer->BeginCommandBuffer();
5030 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5031 m_commandBuffer->EndRenderPass();
5032 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005033 // Destroy image attached to framebuffer to invalidate cmd buffer
5034 vkDestroyImage(m_device->device(), image, NULL);
5035 // Now attempt to submit cmd buffer and verify error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005036 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Tobin Ehlis59f68ab2016-09-06 21:59:07 -06005037 QueueCommandBuffer(false);
5038 m_errorMonitor->VerifyFound();
5039
5040 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5041 vkDestroyImageView(m_device->device(), view, nullptr);
5042 vkFreeMemory(m_device->device(), image_memory, nullptr);
5043}
5044
Tobin Ehlisb329f992016-10-12 13:20:29 -06005045TEST_F(VkLayerTest, FramebufferInUseDestroyedSignaled) {
5046 TEST_DESCRIPTION("Delete in-use framebuffer.");
5047 VkFormatProperties format_properties;
5048 VkResult err = VK_SUCCESS;
5049 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
5050
5051 ASSERT_NO_FATAL_FAILURE(InitState());
5052 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5053
5054 VkImageObj image(m_device);
5055 image.init(256, 256, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
5056 ASSERT_TRUE(image.initialized());
5057 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
5058
5059 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5060 VkFramebuffer fb;
5061 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5062 ASSERT_VK_SUCCESS(err);
5063
5064 // Just use default renderpass with our framebuffer
5065 m_renderPassBeginInfo.framebuffer = fb;
5066 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005067 m_commandBuffer->BeginCommandBuffer();
5068 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5069 m_commandBuffer->EndRenderPass();
5070 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisb329f992016-10-12 13:20:29 -06005071 // Submit cmd buffer to put it in-flight
5072 VkSubmitInfo submit_info = {};
5073 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5074 submit_info.commandBufferCount = 1;
5075 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5076 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5077 // Destroy framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005078 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00422);
Tobin Ehlisb329f992016-10-12 13:20:29 -06005079 vkDestroyFramebuffer(m_device->device(), fb, NULL);
5080 m_errorMonitor->VerifyFound();
5081 // Wait for queue to complete so we can safely destroy everything
5082 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005083 m_errorMonitor->SetUnexpectedError("If framebuffer is not VK_NULL_HANDLE, framebuffer must be a valid VkFramebuffer handle");
5084 m_errorMonitor->SetUnexpectedError("Unable to remove Framebuffer obj");
Tobin Ehlisb329f992016-10-12 13:20:29 -06005085 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5086}
5087
Tobin Ehlis88becd72016-09-21 14:33:41 -06005088TEST_F(VkLayerTest, FramebufferImageInUseDestroyedSignaled) {
5089 TEST_DESCRIPTION("Delete in-use image that's child of framebuffer.");
5090 VkFormatProperties format_properties;
5091 VkResult err = VK_SUCCESS;
5092 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_B8G8R8A8_UNORM, &format_properties);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005093
5094 ASSERT_NO_FATAL_FAILURE(InitState());
5095 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5096
5097 VkImageCreateInfo image_ci = {};
5098 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5099 image_ci.pNext = NULL;
5100 image_ci.imageType = VK_IMAGE_TYPE_2D;
5101 image_ci.format = VK_FORMAT_B8G8R8A8_UNORM;
5102 image_ci.extent.width = 256;
5103 image_ci.extent.height = 256;
5104 image_ci.extent.depth = 1;
5105 image_ci.mipLevels = 1;
5106 image_ci.arrayLayers = 1;
5107 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
5108 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlisc8ca0312016-09-22 07:30:05 -06005109 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis88becd72016-09-21 14:33:41 -06005110 image_ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
5111 image_ci.flags = 0;
5112 VkImage image;
5113 ASSERT_VK_SUCCESS(vkCreateImage(m_device->handle(), &image_ci, NULL, &image));
5114
5115 VkMemoryRequirements memory_reqs;
5116 VkDeviceMemory image_memory;
5117 bool pass;
5118 VkMemoryAllocateInfo memory_info = {};
5119 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5120 memory_info.pNext = NULL;
5121 memory_info.allocationSize = 0;
5122 memory_info.memoryTypeIndex = 0;
5123 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5124 memory_info.allocationSize = memory_reqs.size;
5125 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
5126 ASSERT_TRUE(pass);
5127 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
5128 ASSERT_VK_SUCCESS(err);
5129 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5130 ASSERT_VK_SUCCESS(err);
5131
5132 VkImageViewCreateInfo ivci = {
5133 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
5134 nullptr,
5135 0,
5136 image,
5137 VK_IMAGE_VIEW_TYPE_2D,
5138 VK_FORMAT_B8G8R8A8_UNORM,
5139 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
5140 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
5141 };
5142 VkImageView view;
5143 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
5144 ASSERT_VK_SUCCESS(err);
5145
5146 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, m_renderPass, 1, &view, 256, 256, 1};
5147 VkFramebuffer fb;
5148 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
5149 ASSERT_VK_SUCCESS(err);
5150
5151 // Just use default renderpass with our framebuffer
5152 m_renderPassBeginInfo.framebuffer = fb;
5153 // Create Null cmd buffer for submit
Tony Barbour552f6c02016-12-21 14:34:07 -07005154 m_commandBuffer->BeginCommandBuffer();
5155 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
5156 m_commandBuffer->EndRenderPass();
5157 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis88becd72016-09-21 14:33:41 -06005158 // Submit cmd buffer to put it (and attached imageView) in-flight
5159 VkSubmitInfo submit_info = {};
5160 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5161 submit_info.commandBufferCount = 1;
5162 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5163 // Submit cmd buffer to put framebuffer and children in-flight
5164 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5165 // Destroy image attached to framebuffer while in-flight
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07005166 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00743);
Tobin Ehlis88becd72016-09-21 14:33:41 -06005167 vkDestroyImage(m_device->device(), image, NULL);
5168 m_errorMonitor->VerifyFound();
5169 // Wait for queue to complete so we can safely destroy image and other objects
5170 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005171 m_errorMonitor->SetUnexpectedError("If image is not VK_NULL_HANDLE, image must be a valid VkImage handle");
5172 m_errorMonitor->SetUnexpectedError("Unable to remove Image obj");
Tobin Ehlis88becd72016-09-21 14:33:41 -06005173 vkDestroyImage(m_device->device(), image, NULL);
5174 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
5175 vkDestroyImageView(m_device->device(), view, nullptr);
5176 vkFreeMemory(m_device->device(), image_memory, nullptr);
5177}
5178
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005179TEST_F(VkLayerTest, RenderPassInUseDestroyedSignaled) {
5180 TEST_DESCRIPTION("Delete in-use renderPass.");
5181
5182 ASSERT_NO_FATAL_FAILURE(InitState());
5183 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5184
5185 // Create simple renderpass
5186 VkAttachmentReference attach = {};
5187 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
5188 VkSubpassDescription subpass = {};
5189 subpass.pColorAttachments = &attach;
5190 VkRenderPassCreateInfo rpci = {};
5191 rpci.subpassCount = 1;
5192 rpci.pSubpasses = &subpass;
5193 rpci.attachmentCount = 1;
5194 VkAttachmentDescription attach_desc = {};
5195 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
5196 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
5197 rpci.pAttachments = &attach_desc;
5198 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
5199 VkRenderPass rp;
5200 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
5201 ASSERT_VK_SUCCESS(err);
5202
5203 // Create a pipeline that uses the given renderpass
5204 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5205 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5206
5207 VkPipelineLayout pipeline_layout;
5208 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
5209 ASSERT_VK_SUCCESS(err);
5210
5211 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5212 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5213 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005214 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005215 vp_state_ci.pViewports = &vp;
5216 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005217 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005218 vp_state_ci.pScissors = &scissors;
5219
5220 VkPipelineShaderStageCreateInfo shaderStages[2];
5221 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5222
5223 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005224 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 -06005225 // but add it to be able to run on more devices
5226 shaderStages[0] = vs.GetStageCreateInfo();
5227 shaderStages[1] = fs.GetStageCreateInfo();
5228
5229 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5230 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5231
5232 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5233 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5234 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5235
5236 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5237 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
5238 rs_ci.rasterizerDiscardEnable = true;
5239 rs_ci.lineWidth = 1.0f;
5240
5241 VkPipelineColorBlendAttachmentState att = {};
5242 att.blendEnable = VK_FALSE;
5243 att.colorWriteMask = 0xf;
5244
5245 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5246 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5247 cb_ci.attachmentCount = 1;
5248 cb_ci.pAttachments = &att;
5249
5250 VkGraphicsPipelineCreateInfo gp_ci = {};
5251 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5252 gp_ci.stageCount = 2;
5253 gp_ci.pStages = shaderStages;
5254 gp_ci.pVertexInputState = &vi_ci;
5255 gp_ci.pInputAssemblyState = &ia_ci;
5256 gp_ci.pViewportState = &vp_state_ci;
5257 gp_ci.pRasterizationState = &rs_ci;
5258 gp_ci.pColorBlendState = &cb_ci;
5259 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5260 gp_ci.layout = pipeline_layout;
5261 gp_ci.renderPass = rp;
5262
5263 VkPipelineCacheCreateInfo pc_ci = {};
5264 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5265
5266 VkPipeline pipeline;
5267 VkPipelineCache pipe_cache;
5268 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipe_cache);
5269 ASSERT_VK_SUCCESS(err);
5270
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005271 m_errorMonitor->SetUnexpectedError(
5272 "If pColorBlendState is not NULL, The attachmentCount member of pColorBlendState must be equal to the colorAttachmentCount "
5273 "used to create subpass");
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005274 err = vkCreateGraphicsPipelines(m_device->device(), pipe_cache, 1, &gp_ci, NULL, &pipeline);
5275 ASSERT_VK_SUCCESS(err);
5276 // Bind pipeline to cmd buffer, will also bind renderpass
5277 m_commandBuffer->BeginCommandBuffer();
5278 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
5279 m_commandBuffer->EndCommandBuffer();
5280
5281 VkSubmitInfo submit_info = {};
5282 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5283 submit_info.commandBufferCount = 1;
5284 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5285 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5286
5287 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00393);
5288 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5289 m_errorMonitor->VerifyFound();
5290
5291 // Wait for queue to complete so we can safely destroy everything
5292 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07005293 m_errorMonitor->SetUnexpectedError("If renderPass is not VK_NULL_HANDLE, renderPass must be a valid VkRenderPass handle");
5294 m_errorMonitor->SetUnexpectedError("Unable to remove Render Pass obj");
Tobin Ehlisaa739cd2016-10-27 07:53:36 -06005295 vkDestroyRenderPass(m_device->device(), rp, nullptr);
5296 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5297 vkDestroyPipelineCache(m_device->device(), pipe_cache, nullptr);
5298 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
5299}
5300
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005301TEST_F(VkLayerTest, ImageMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005302 TEST_DESCRIPTION("Attempt to draw with an image which has not had memory bound to it.");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005303 ASSERT_NO_FATAL_FAILURE(InitState());
5304
5305 VkImage image;
5306 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5307 VkImageCreateInfo image_create_info = {};
5308 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5309 image_create_info.pNext = NULL;
5310 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5311 image_create_info.format = tex_format;
5312 image_create_info.extent.width = 32;
5313 image_create_info.extent.height = 32;
5314 image_create_info.extent.depth = 1;
5315 image_create_info.mipLevels = 1;
5316 image_create_info.arrayLayers = 1;
5317 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5318 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005319 image_create_info.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005320 image_create_info.flags = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005321 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005322 ASSERT_VK_SUCCESS(err);
5323 // Have to bind memory to image before recording cmd in cmd buffer using it
5324 VkMemoryRequirements mem_reqs;
5325 VkDeviceMemory image_mem;
5326 bool pass;
5327 VkMemoryAllocateInfo mem_alloc = {};
5328 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5329 mem_alloc.pNext = NULL;
5330 mem_alloc.memoryTypeIndex = 0;
5331 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
5332 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005333 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005334 ASSERT_TRUE(pass);
5335 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
5336 ASSERT_VK_SUCCESS(err);
5337
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005338 // Introduce error, do not call vkBindImageMemory(m_device->device(), image, image_mem, 0);
5339 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005340 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005341
5342 m_commandBuffer->BeginCommandBuffer();
5343 VkClearColorValue ccv;
5344 ccv.float32[0] = 1.0f;
5345 ccv.float32[1] = 1.0f;
5346 ccv.float32[2] = 1.0f;
5347 ccv.float32[3] = 1.0f;
5348 VkImageSubresourceRange isr = {};
5349 isr.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5350 isr.baseArrayLayer = 0;
5351 isr.baseMipLevel = 0;
5352 isr.layerCount = 1;
5353 isr.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005354 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), image, VK_IMAGE_LAYOUT_GENERAL, &ccv, 1, &isr);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005355 m_commandBuffer->EndCommandBuffer();
5356
5357 m_errorMonitor->VerifyFound();
5358 vkDestroyImage(m_device->device(), image, NULL);
5359 vkFreeMemory(m_device->device(), image_mem, nullptr);
5360}
5361
5362TEST_F(VkLayerTest, BufferMemoryNotBound) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005363 TEST_DESCRIPTION("Attempt to copy from a buffer which has not had memory bound to it.");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005364 ASSERT_NO_FATAL_FAILURE(InitState());
5365
5366 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005367 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 -06005368 VK_IMAGE_TILING_OPTIMAL, 0);
5369 ASSERT_TRUE(image.initialized());
5370
5371 VkBuffer buffer;
5372 VkDeviceMemory mem;
5373 VkMemoryRequirements mem_reqs;
5374
5375 VkBufferCreateInfo buf_info = {};
5376 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes8d260dd2016-09-16 17:42:42 +12005377 buf_info.usage = VK_BUFFER_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005378 buf_info.size = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005379 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
5380 VkResult err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
5381 ASSERT_VK_SUCCESS(err);
5382
5383 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
5384
5385 VkMemoryAllocateInfo alloc_info = {};
5386 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
Mark Lobodzinski80871462017-02-16 10:37:27 -07005387 alloc_info.allocationSize = 1024;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005388 bool pass = false;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005389 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 -06005390 if (!pass) {
5391 vkDestroyBuffer(m_device->device(), buffer, NULL);
5392 return;
5393 }
5394 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
5395 ASSERT_VK_SUCCESS(err);
5396
Tobin Ehlisfed999f2016-09-21 15:09:45 -06005397 // Introduce failure by not calling vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5398 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06005399 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005400 VkBufferImageCopy region = {};
Mark Lobodzinski80871462017-02-16 10:37:27 -07005401 region.bufferRowLength = 16;
5402 region.bufferImageHeight = 16;
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005403 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
5404
5405 region.imageSubresource.layerCount = 1;
5406 region.imageExtent.height = 4;
5407 region.imageExtent.width = 4;
5408 region.imageExtent.depth = 1;
5409 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005410 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer, image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1,
5411 &region);
Mark Lobodzinskia4df3632016-07-14 09:57:41 -06005412 m_commandBuffer->EndCommandBuffer();
5413
5414 m_errorMonitor->VerifyFound();
5415
5416 vkDestroyBuffer(m_device->device(), buffer, NULL);
5417 vkFreeMemory(m_device->handle(), mem, NULL);
5418}
5419
Tobin Ehlis85940f52016-07-07 16:57:21 -06005420TEST_F(VkLayerTest, InvalidCmdBufferEventDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005421 TEST_DESCRIPTION(
5422 "Attempt to draw with a command buffer that is invalid "
5423 "due to an event dependency being destroyed.");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005424 ASSERT_NO_FATAL_FAILURE(InitState());
5425
5426 VkEvent event;
5427 VkEventCreateInfo evci = {};
5428 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
5429 VkResult result = vkCreateEvent(m_device->device(), &evci, NULL, &event);
5430 ASSERT_VK_SUCCESS(result);
5431
5432 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005433 vkCmdSetEvent(m_commandBuffer->GetBufferHandle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Tobin Ehlis85940f52016-07-07 16:57:21 -06005434 m_commandBuffer->EndCommandBuffer();
5435
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005436 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound event ");
Tobin Ehlis85940f52016-07-07 16:57:21 -06005437 // Destroy event dependency prior to submit to cause ERROR
5438 vkDestroyEvent(m_device->device(), event, NULL);
5439
5440 VkSubmitInfo submit_info = {};
5441 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5442 submit_info.commandBufferCount = 1;
5443 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5444 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5445
5446 m_errorMonitor->VerifyFound();
5447}
5448
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005449TEST_F(VkLayerTest, InvalidCmdBufferQueryPoolDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005450 TEST_DESCRIPTION(
5451 "Attempt to draw with a command buffer that is invalid "
5452 "due to a query pool dependency being destroyed.");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005453 ASSERT_NO_FATAL_FAILURE(InitState());
5454
5455 VkQueryPool query_pool;
5456 VkQueryPoolCreateInfo qpci{};
5457 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
5458 qpci.queryType = VK_QUERY_TYPE_TIMESTAMP;
5459 qpci.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005460 VkResult result = vkCreateQueryPool(m_device->device(), &qpci, nullptr, &query_pool);
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005461 ASSERT_VK_SUCCESS(result);
5462
5463 m_commandBuffer->BeginCommandBuffer();
5464 vkCmdResetQueryPool(m_commandBuffer->GetBufferHandle(), query_pool, 0, 1);
5465 m_commandBuffer->EndCommandBuffer();
5466
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005467 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound query pool ");
Tobin Ehlisdbea7552016-07-08 14:33:31 -06005468 // Destroy query pool dependency prior to submit to cause ERROR
5469 vkDestroyQueryPool(m_device->device(), query_pool, NULL);
5470
5471 VkSubmitInfo submit_info = {};
5472 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5473 submit_info.commandBufferCount = 1;
5474 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5475 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5476
5477 m_errorMonitor->VerifyFound();
5478}
5479
Tobin Ehlis24130d92016-07-08 15:50:53 -06005480TEST_F(VkLayerTest, InvalidCmdBufferPipelineDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005481 TEST_DESCRIPTION(
5482 "Attempt to draw with a command buffer that is invalid "
5483 "due to a pipeline dependency being destroyed.");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005484 ASSERT_NO_FATAL_FAILURE(InitState());
5485 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5486
5487 VkResult err;
5488
5489 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5490 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5491
5492 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005493 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005494 ASSERT_VK_SUCCESS(err);
5495
5496 VkPipelineViewportStateCreateInfo vp_state_ci = {};
5497 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
5498 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005499 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -06005500 vp_state_ci.pViewports = &vp;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005501 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005502 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis24130d92016-07-08 15:50:53 -06005503 vp_state_ci.pScissors = &scissors;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005504
5505 VkPipelineShaderStageCreateInfo shaderStages[2];
5506 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
5507
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005508 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005509 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 -06005510 // but add it to be able to run on more devices
Tobin Ehlis24130d92016-07-08 15:50:53 -06005511 shaderStages[0] = vs.GetStageCreateInfo();
5512 shaderStages[1] = fs.GetStageCreateInfo();
5513
5514 VkPipelineVertexInputStateCreateInfo vi_ci = {};
5515 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
5516
5517 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
5518 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
5519 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
5520
5521 VkPipelineRasterizationStateCreateInfo rs_ci = {};
5522 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbese06ba252016-09-16 17:48:53 +12005523 rs_ci.rasterizerDiscardEnable = true;
5524 rs_ci.lineWidth = 1.0f;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005525
5526 VkPipelineColorBlendAttachmentState att = {};
5527 att.blendEnable = VK_FALSE;
5528 att.colorWriteMask = 0xf;
5529
5530 VkPipelineColorBlendStateCreateInfo cb_ci = {};
5531 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
5532 cb_ci.attachmentCount = 1;
5533 cb_ci.pAttachments = &att;
5534
5535 VkGraphicsPipelineCreateInfo gp_ci = {};
5536 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
5537 gp_ci.stageCount = 2;
5538 gp_ci.pStages = shaderStages;
5539 gp_ci.pVertexInputState = &vi_ci;
5540 gp_ci.pInputAssemblyState = &ia_ci;
5541 gp_ci.pViewportState = &vp_state_ci;
5542 gp_ci.pRasterizationState = &rs_ci;
5543 gp_ci.pColorBlendState = &cb_ci;
Tobin Ehlis24130d92016-07-08 15:50:53 -06005544 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
5545 gp_ci.layout = pipeline_layout;
5546 gp_ci.renderPass = renderPass();
5547
5548 VkPipelineCacheCreateInfo pc_ci = {};
5549 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
5550
5551 VkPipeline pipeline;
5552 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005553 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005554 ASSERT_VK_SUCCESS(err);
5555
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005556 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005557 ASSERT_VK_SUCCESS(err);
5558
5559 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005560 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Tobin Ehlis24130d92016-07-08 15:50:53 -06005561 m_commandBuffer->EndCommandBuffer();
5562 // Now destroy pipeline in order to cause error when submitting
5563 vkDestroyPipeline(m_device->device(), pipeline, nullptr);
5564
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005565 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound pipeline ");
Tobin Ehlis24130d92016-07-08 15:50:53 -06005566
5567 VkSubmitInfo submit_info = {};
5568 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5569 submit_info.commandBufferCount = 1;
5570 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5571 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5572
5573 m_errorMonitor->VerifyFound();
5574 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
5575 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5576}
5577
Tobin Ehlis31289162016-08-17 14:57:58 -06005578TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetBufferDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005579 TEST_DESCRIPTION(
5580 "Attempt to draw with a command buffer that is invalid "
5581 "due to a bound descriptor set with a buffer dependency "
5582 "being destroyed.");
Tobin Ehlis31289162016-08-17 14:57:58 -06005583 ASSERT_NO_FATAL_FAILURE(InitState());
5584 ASSERT_NO_FATAL_FAILURE(InitViewport());
5585 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5586
5587 VkDescriptorPoolSize ds_type_count = {};
5588 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5589 ds_type_count.descriptorCount = 1;
5590
5591 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5592 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5593 ds_pool_ci.pNext = NULL;
5594 ds_pool_ci.maxSets = 1;
5595 ds_pool_ci.poolSizeCount = 1;
5596 ds_pool_ci.pPoolSizes = &ds_type_count;
5597
5598 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005599 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis31289162016-08-17 14:57:58 -06005600 ASSERT_VK_SUCCESS(err);
5601
5602 VkDescriptorSetLayoutBinding dsl_binding = {};
5603 dsl_binding.binding = 0;
5604 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5605 dsl_binding.descriptorCount = 1;
5606 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5607 dsl_binding.pImmutableSamplers = NULL;
5608
5609 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5610 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5611 ds_layout_ci.pNext = NULL;
5612 ds_layout_ci.bindingCount = 1;
5613 ds_layout_ci.pBindings = &dsl_binding;
5614 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005615 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005616 ASSERT_VK_SUCCESS(err);
5617
5618 VkDescriptorSet descriptorSet;
5619 VkDescriptorSetAllocateInfo alloc_info = {};
5620 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5621 alloc_info.descriptorSetCount = 1;
5622 alloc_info.descriptorPool = ds_pool;
5623 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005624 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis31289162016-08-17 14:57:58 -06005625 ASSERT_VK_SUCCESS(err);
5626
5627 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5628 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5629 pipeline_layout_ci.pNext = NULL;
5630 pipeline_layout_ci.setLayoutCount = 1;
5631 pipeline_layout_ci.pSetLayouts = &ds_layout;
5632
5633 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005634 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis31289162016-08-17 14:57:58 -06005635 ASSERT_VK_SUCCESS(err);
5636
5637 // Create a buffer to update the descriptor with
5638 uint32_t qfi = 0;
5639 VkBufferCreateInfo buffCI = {};
5640 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
5641 buffCI.size = 1024;
5642 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
5643 buffCI.queueFamilyIndexCount = 1;
5644 buffCI.pQueueFamilyIndices = &qfi;
5645
5646 VkBuffer buffer;
5647 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &buffer);
5648 ASSERT_VK_SUCCESS(err);
5649 // Allocate memory and bind to buffer so we can make it to the appropriate
5650 // error
5651 VkMemoryAllocateInfo mem_alloc = {};
5652 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5653 mem_alloc.pNext = NULL;
5654 mem_alloc.allocationSize = 1024;
5655 mem_alloc.memoryTypeIndex = 0;
5656
5657 VkMemoryRequirements memReqs;
5658 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005659 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis31289162016-08-17 14:57:58 -06005660 if (!pass) {
5661 vkDestroyBuffer(m_device->device(), buffer, NULL);
5662 return;
5663 }
5664
5665 VkDeviceMemory mem;
5666 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
5667 ASSERT_VK_SUCCESS(err);
5668 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
5669 ASSERT_VK_SUCCESS(err);
5670 // Correctly update descriptor to avoid "NOT_UPDATED" error
5671 VkDescriptorBufferInfo buffInfo = {};
5672 buffInfo.buffer = buffer;
5673 buffInfo.offset = 0;
5674 buffInfo.range = 1024;
5675
5676 VkWriteDescriptorSet descriptor_write;
5677 memset(&descriptor_write, 0, sizeof(descriptor_write));
5678 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5679 descriptor_write.dstSet = descriptorSet;
5680 descriptor_write.dstBinding = 0;
5681 descriptor_write.descriptorCount = 1;
5682 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
5683 descriptor_write.pBufferInfo = &buffInfo;
5684
5685 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5686
5687 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005688 char const *vsSource =
5689 "#version 450\n"
5690 "\n"
5691 "out gl_PerVertex { \n"
5692 " vec4 gl_Position;\n"
5693 "};\n"
5694 "void main(){\n"
5695 " gl_Position = vec4(1);\n"
5696 "}\n";
5697 char const *fsSource =
5698 "#version 450\n"
5699 "\n"
5700 "layout(location=0) out vec4 x;\n"
5701 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
5702 "void main(){\n"
5703 " x = vec4(bar.y);\n"
5704 "}\n";
Tobin Ehlis31289162016-08-17 14:57:58 -06005705 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5706 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5707 VkPipelineObj pipe(m_device);
5708 pipe.AddShader(&vs);
5709 pipe.AddShader(&fs);
5710 pipe.AddColorAttachment();
5711 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5712
Tony Barbour552f6c02016-12-21 14:34:07 -07005713 m_commandBuffer->BeginCommandBuffer();
5714 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005715 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5716 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5717 &descriptorSet, 0, NULL);
Rene Lindsay0583ac92017-01-16 14:29:10 -07005718
5719 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &m_viewports[0]);
5720 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &m_scissors[0]);
5721
Tobin Ehlis31289162016-08-17 14:57:58 -06005722 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005723 m_commandBuffer->EndRenderPass();
5724 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005725 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound buffer ");
Tobin Ehlis31289162016-08-17 14:57:58 -06005726 // Destroy buffer should invalidate the cmd buffer, causing error on submit
5727 vkDestroyBuffer(m_device->device(), buffer, NULL);
5728 // Attempt to submit cmd buffer
5729 VkSubmitInfo submit_info = {};
5730 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5731 submit_info.commandBufferCount = 1;
5732 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5733 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5734 m_errorMonitor->VerifyFound();
5735 // Cleanup
5736 vkFreeMemory(m_device->device(), mem, NULL);
5737
5738 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
5739 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
5740 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
5741}
5742
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005743TEST_F(VkLayerTest, InvalidCmdBufferDescriptorSetImageSamplerDestroyed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005744 TEST_DESCRIPTION(
5745 "Attempt to draw with a command buffer that is invalid "
5746 "due to a bound descriptor sets with a combined image "
5747 "sampler having their image, sampler, and descriptor set "
5748 "each respectively destroyed and then attempting to "
5749 "submit associated cmd buffers. Attempt to destroy a "
5750 "DescriptorSet that is in use.");
Rene Lindsayed88b732017-01-27 15:55:29 -07005751 ASSERT_NO_FATAL_FAILURE(InitState(nullptr, VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT));
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005752 ASSERT_NO_FATAL_FAILURE(InitViewport());
5753 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
5754
5755 VkDescriptorPoolSize ds_type_count = {};
5756 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5757 ds_type_count.descriptorCount = 1;
5758
5759 VkDescriptorPoolCreateInfo ds_pool_ci = {};
5760 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
5761 ds_pool_ci.pNext = NULL;
Rene Lindsayed88b732017-01-27 15:55:29 -07005762 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005763 ds_pool_ci.maxSets = 1;
5764 ds_pool_ci.poolSizeCount = 1;
5765 ds_pool_ci.pPoolSizes = &ds_type_count;
5766
5767 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005768 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005769 ASSERT_VK_SUCCESS(err);
5770
5771 VkDescriptorSetLayoutBinding dsl_binding = {};
5772 dsl_binding.binding = 0;
5773 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5774 dsl_binding.descriptorCount = 1;
5775 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
5776 dsl_binding.pImmutableSamplers = NULL;
5777
5778 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
5779 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
5780 ds_layout_ci.pNext = NULL;
5781 ds_layout_ci.bindingCount = 1;
5782 ds_layout_ci.pBindings = &dsl_binding;
5783 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005784 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005785 ASSERT_VK_SUCCESS(err);
5786
5787 VkDescriptorSet descriptorSet;
5788 VkDescriptorSetAllocateInfo alloc_info = {};
5789 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
5790 alloc_info.descriptorSetCount = 1;
5791 alloc_info.descriptorPool = ds_pool;
5792 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005793 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005794 ASSERT_VK_SUCCESS(err);
5795
5796 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
5797 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
5798 pipeline_layout_ci.pNext = NULL;
5799 pipeline_layout_ci.setLayoutCount = 1;
5800 pipeline_layout_ci.pSetLayouts = &ds_layout;
5801
5802 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005803 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005804 ASSERT_VK_SUCCESS(err);
5805
5806 // Create images to update the descriptor with
5807 VkImage image;
5808 VkImage image2;
5809 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
5810 const int32_t tex_width = 32;
5811 const int32_t tex_height = 32;
5812 VkImageCreateInfo image_create_info = {};
5813 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
5814 image_create_info.pNext = NULL;
5815 image_create_info.imageType = VK_IMAGE_TYPE_2D;
5816 image_create_info.format = tex_format;
5817 image_create_info.extent.width = tex_width;
5818 image_create_info.extent.height = tex_height;
5819 image_create_info.extent.depth = 1;
5820 image_create_info.mipLevels = 1;
5821 image_create_info.arrayLayers = 1;
5822 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
5823 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
5824 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
5825 image_create_info.flags = 0;
5826 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
5827 ASSERT_VK_SUCCESS(err);
5828 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image2);
5829 ASSERT_VK_SUCCESS(err);
5830
5831 VkMemoryRequirements memory_reqs;
5832 VkDeviceMemory image_memory;
5833 bool pass;
5834 VkMemoryAllocateInfo memory_info = {};
5835 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
5836 memory_info.pNext = NULL;
5837 memory_info.allocationSize = 0;
5838 memory_info.memoryTypeIndex = 0;
5839 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
5840 // Allocate enough memory for both images
5841 memory_info.allocationSize = memory_reqs.size * 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005842 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005843 ASSERT_TRUE(pass);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005844 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005845 ASSERT_VK_SUCCESS(err);
5846 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
5847 ASSERT_VK_SUCCESS(err);
5848 // Bind second image to memory right after first image
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005849 err = vkBindImageMemory(m_device->device(), image2, image_memory, memory_reqs.size);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005850 ASSERT_VK_SUCCESS(err);
5851
5852 VkImageViewCreateInfo image_view_create_info = {};
5853 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
5854 image_view_create_info.image = image;
5855 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
5856 image_view_create_info.format = tex_format;
5857 image_view_create_info.subresourceRange.layerCount = 1;
5858 image_view_create_info.subresourceRange.baseMipLevel = 0;
5859 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005860 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005861
5862 VkImageView view;
5863 VkImageView view2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005864 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005865 ASSERT_VK_SUCCESS(err);
5866 image_view_create_info.image = image2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005867 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view2);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005868 ASSERT_VK_SUCCESS(err);
5869 // Create Samplers
5870 VkSamplerCreateInfo sampler_ci = {};
5871 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
5872 sampler_ci.pNext = NULL;
5873 sampler_ci.magFilter = VK_FILTER_NEAREST;
5874 sampler_ci.minFilter = VK_FILTER_NEAREST;
5875 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
5876 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5877 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5878 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
5879 sampler_ci.mipLodBias = 1.0;
5880 sampler_ci.anisotropyEnable = VK_FALSE;
5881 sampler_ci.maxAnisotropy = 1;
5882 sampler_ci.compareEnable = VK_FALSE;
5883 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
5884 sampler_ci.minLod = 1.0;
5885 sampler_ci.maxLod = 1.0;
5886 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
5887 sampler_ci.unnormalizedCoordinates = VK_FALSE;
5888 VkSampler sampler;
5889 VkSampler sampler2;
5890 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
5891 ASSERT_VK_SUCCESS(err);
5892 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler2);
5893 ASSERT_VK_SUCCESS(err);
5894 // Update descriptor with image and sampler
5895 VkDescriptorImageInfo img_info = {};
5896 img_info.sampler = sampler;
5897 img_info.imageView = view;
5898 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
5899
5900 VkWriteDescriptorSet descriptor_write;
5901 memset(&descriptor_write, 0, sizeof(descriptor_write));
5902 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
5903 descriptor_write.dstSet = descriptorSet;
5904 descriptor_write.dstBinding = 0;
5905 descriptor_write.descriptorCount = 1;
5906 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
5907 descriptor_write.pImageInfo = &img_info;
5908
5909 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
5910
5911 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07005912 char const *vsSource =
5913 "#version 450\n"
5914 "\n"
5915 "out gl_PerVertex { \n"
5916 " vec4 gl_Position;\n"
5917 "};\n"
5918 "void main(){\n"
5919 " gl_Position = vec4(1);\n"
5920 "}\n";
5921 char const *fsSource =
5922 "#version 450\n"
5923 "\n"
5924 "layout(set=0, binding=0) uniform sampler2D s;\n"
5925 "layout(location=0) out vec4 x;\n"
5926 "void main(){\n"
5927 " x = texture(s, vec2(1));\n"
5928 "}\n";
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005929 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
5930 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
5931 VkPipelineObj pipe(m_device);
5932 pipe.AddShader(&vs);
5933 pipe.AddShader(&fs);
5934 pipe.AddColorAttachment();
5935 pipe.CreateVKPipeline(pipeline_layout, renderPass());
5936
5937 // First error case is destroying sampler prior to cmd buffer submission
Jeremy Hayesb91c79d2017-02-27 15:09:03 -07005938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound sampler");
Tony Barbour552f6c02016-12-21 14:34:07 -07005939 m_commandBuffer->BeginCommandBuffer();
5940 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005941 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5942 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5943 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005944 VkViewport viewport = {0, 0, 16, 16, 0, 1};
5945 VkRect2D scissor = {{0, 0}, {16, 16}};
5946 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5947 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005948 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005949 m_commandBuffer->EndRenderPass();
5950 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005951 // Destroy sampler invalidates the cmd buffer, causing error on submit
5952 vkDestroySampler(m_device->device(), sampler, NULL);
5953 // Attempt to submit cmd buffer
5954 VkSubmitInfo submit_info = {};
5955 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5956 submit_info.commandBufferCount = 1;
5957 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5958 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5959 m_errorMonitor->VerifyFound();
Rene Lindsaya31285f2017-01-11 16:35:53 -07005960
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005961 // Now re-update descriptor with valid sampler and delete image
5962 img_info.sampler = sampler2;
5963 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005964
5965 VkCommandBufferBeginInfo info = {};
5966 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
5967 info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
5968
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005969 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound image ");
Rene Lindsayed88b732017-01-27 15:55:29 -07005970 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005971 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005972 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5973 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5974 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005975 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5976 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005977 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07005978 m_commandBuffer->EndRenderPass();
5979 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005980 // Destroy image invalidates the cmd buffer, causing error on submit
5981 vkDestroyImage(m_device->device(), image, NULL);
5982 // Attempt to submit cmd buffer
5983 submit_info = {};
5984 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
5985 submit_info.commandBufferCount = 1;
5986 submit_info.pCommandBuffers = &m_commandBuffer->handle();
5987 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
5988 m_errorMonitor->VerifyFound();
5989 // Now update descriptor to be valid, but then free descriptor
5990 img_info.imageView = view2;
5991 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Rene Lindsayed88b732017-01-27 15:55:29 -07005992 m_commandBuffer->BeginCommandBuffer(&info);
Tony Barbour552f6c02016-12-21 14:34:07 -07005993 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06005994 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
5995 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
5996 &descriptorSet, 0, NULL);
Rene Lindsaya31285f2017-01-11 16:35:53 -07005997 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
5998 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06005999 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006000 m_commandBuffer->EndRenderPass();
6001 m_commandBuffer->EndCommandBuffer();
Tony Barbourc373c012017-01-26 10:53:28 -07006002 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -07006003
6004 // Immediately try to destroy the descriptor set in the active command buffer - failure expected
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006005 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call vkFreeDescriptorSets() on descriptor set 0x");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006006 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
Mark Mueller917f6bc2016-08-30 10:57:19 -06006007 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006008
6009 // Try again once the queue is idle - should succeed w/o error
Dave Houltond5507dd2017-01-24 15:29:02 -07006010 // 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 -07006011 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006012 m_errorMonitor->SetUnexpectedError(
6013 "pDescriptorSets must be a pointer to an array of descriptorSetCount VkDescriptorSet handles, each element of which must "
6014 "either be a valid handle or VK_NULL_HANDLE");
6015 m_errorMonitor->SetUnexpectedError("Unable to remove Descriptor Set obj");
Dave Houltonfbf52152017-01-06 12:55:29 -07006016 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptorSet);
6017
6018 // Attempt to submit cmd buffer containing the freed descriptor set
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006019 submit_info = {};
6020 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6021 submit_info.commandBufferCount = 1;
6022 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07006023 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " that is invalid because bound descriptor set ");
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006024 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6025 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07006026
Tobin Ehlis1d7f5c92016-08-17 17:00:07 -06006027 // Cleanup
6028 vkFreeMemory(m_device->device(), image_memory, NULL);
6029 vkDestroySampler(m_device->device(), sampler2, NULL);
6030 vkDestroyImage(m_device->device(), image2, NULL);
6031 vkDestroyImageView(m_device->device(), view, NULL);
6032 vkDestroyImageView(m_device->device(), view2, NULL);
6033 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6034 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6035 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6036}
6037
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006038TEST_F(VkLayerTest, DescriptorPoolInUseDestroyedSignaled) {
6039 TEST_DESCRIPTION("Delete a DescriptorPool with a DescriptorSet that is in use.");
6040 ASSERT_NO_FATAL_FAILURE(InitState());
6041 ASSERT_NO_FATAL_FAILURE(InitViewport());
6042 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6043
6044 VkDescriptorPoolSize ds_type_count = {};
6045 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6046 ds_type_count.descriptorCount = 1;
6047
6048 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6049 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6050 ds_pool_ci.pNext = NULL;
6051 ds_pool_ci.maxSets = 1;
6052 ds_pool_ci.poolSizeCount = 1;
6053 ds_pool_ci.pPoolSizes = &ds_type_count;
6054
6055 VkDescriptorPool ds_pool;
6056 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6057 ASSERT_VK_SUCCESS(err);
6058
6059 VkDescriptorSetLayoutBinding dsl_binding = {};
6060 dsl_binding.binding = 0;
6061 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6062 dsl_binding.descriptorCount = 1;
6063 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6064 dsl_binding.pImmutableSamplers = NULL;
6065
6066 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6067 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6068 ds_layout_ci.pNext = NULL;
6069 ds_layout_ci.bindingCount = 1;
6070 ds_layout_ci.pBindings = &dsl_binding;
6071 VkDescriptorSetLayout ds_layout;
6072 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6073 ASSERT_VK_SUCCESS(err);
6074
6075 VkDescriptorSet descriptor_set;
6076 VkDescriptorSetAllocateInfo alloc_info = {};
6077 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6078 alloc_info.descriptorSetCount = 1;
6079 alloc_info.descriptorPool = ds_pool;
6080 alloc_info.pSetLayouts = &ds_layout;
6081 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
6082 ASSERT_VK_SUCCESS(err);
6083
6084 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6085 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6086 pipeline_layout_ci.pNext = NULL;
6087 pipeline_layout_ci.setLayoutCount = 1;
6088 pipeline_layout_ci.pSetLayouts = &ds_layout;
6089
6090 VkPipelineLayout pipeline_layout;
6091 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6092 ASSERT_VK_SUCCESS(err);
6093
6094 // Create image to update the descriptor with
6095 VkImageObj image(m_device);
6096 image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
6097 ASSERT_TRUE(image.initialized());
6098
6099 VkImageView view = image.targetView(VK_FORMAT_B8G8R8A8_UNORM);
6100 // Create Sampler
6101 VkSamplerCreateInfo sampler_ci = {};
6102 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6103 sampler_ci.pNext = NULL;
6104 sampler_ci.magFilter = VK_FILTER_NEAREST;
6105 sampler_ci.minFilter = VK_FILTER_NEAREST;
6106 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6107 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6108 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6109 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6110 sampler_ci.mipLodBias = 1.0;
6111 sampler_ci.anisotropyEnable = VK_FALSE;
6112 sampler_ci.maxAnisotropy = 1;
6113 sampler_ci.compareEnable = VK_FALSE;
6114 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6115 sampler_ci.minLod = 1.0;
6116 sampler_ci.maxLod = 1.0;
6117 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6118 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6119 VkSampler sampler;
6120 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6121 ASSERT_VK_SUCCESS(err);
6122 // Update descriptor with image and sampler
6123 VkDescriptorImageInfo img_info = {};
6124 img_info.sampler = sampler;
6125 img_info.imageView = view;
6126 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6127
6128 VkWriteDescriptorSet descriptor_write;
6129 memset(&descriptor_write, 0, sizeof(descriptor_write));
6130 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6131 descriptor_write.dstSet = descriptor_set;
6132 descriptor_write.dstBinding = 0;
6133 descriptor_write.descriptorCount = 1;
6134 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6135 descriptor_write.pImageInfo = &img_info;
6136
6137 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6138
6139 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006140 char const *vsSource =
6141 "#version 450\n"
6142 "\n"
6143 "out gl_PerVertex { \n"
6144 " vec4 gl_Position;\n"
6145 "};\n"
6146 "void main(){\n"
6147 " gl_Position = vec4(1);\n"
6148 "}\n";
6149 char const *fsSource =
6150 "#version 450\n"
6151 "\n"
6152 "layout(set=0, binding=0) uniform sampler2D s;\n"
6153 "layout(location=0) out vec4 x;\n"
6154 "void main(){\n"
6155 " x = texture(s, vec2(1));\n"
6156 "}\n";
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006157 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6158 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6159 VkPipelineObj pipe(m_device);
6160 pipe.AddShader(&vs);
6161 pipe.AddShader(&fs);
6162 pipe.AddColorAttachment();
6163 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6164
Tony Barbour552f6c02016-12-21 14:34:07 -07006165 m_commandBuffer->BeginCommandBuffer();
6166 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006167 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6168 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6169 &descriptor_set, 0, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006170
6171 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6172 VkRect2D scissor = {{0, 0}, {16, 16}};
6173 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6174 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6175
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006176 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -07006177 m_commandBuffer->EndRenderPass();
6178 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006179 // Submit cmd buffer to put pool in-flight
6180 VkSubmitInfo submit_info = {};
6181 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
6182 submit_info.commandBufferCount = 1;
6183 submit_info.pCommandBuffers = &m_commandBuffer->handle();
6184 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
6185 // Destroy pool while in-flight, causing error
6186 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot delete descriptor pool ");
6187 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6188 m_errorMonitor->VerifyFound();
6189 vkQueueWaitIdle(m_device->m_queue);
6190 // Cleanup
6191 vkDestroySampler(m_device->device(), sampler, NULL);
6192 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6193 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07006194 m_errorMonitor->SetUnexpectedError(
6195 "If descriptorPool is not VK_NULL_HANDLE, descriptorPool must be a valid VkDescriptorPool handle");
6196 m_errorMonitor->SetUnexpectedError("Unable to remove Descriptor Pool obj");
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006197 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsaye353a072017-01-16 11:07:28 -07006198 // TODO : It seems Validation layers think ds_pool was already destroyed, even though it wasn't?
Tobin Ehlis6dd1b2e2016-10-12 15:12:05 -06006199}
6200
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006201TEST_F(VkLayerTest, DescriptorImageUpdateNoMemoryBound) {
6202 TEST_DESCRIPTION("Attempt an image descriptor set update where image's bound memory has been freed.");
6203 ASSERT_NO_FATAL_FAILURE(InitState());
6204 ASSERT_NO_FATAL_FAILURE(InitViewport());
6205 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6206
6207 VkDescriptorPoolSize ds_type_count = {};
6208 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6209 ds_type_count.descriptorCount = 1;
6210
6211 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6212 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6213 ds_pool_ci.pNext = NULL;
6214 ds_pool_ci.maxSets = 1;
6215 ds_pool_ci.poolSizeCount = 1;
6216 ds_pool_ci.pPoolSizes = &ds_type_count;
6217
6218 VkDescriptorPool ds_pool;
6219 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
6220 ASSERT_VK_SUCCESS(err);
6221
6222 VkDescriptorSetLayoutBinding dsl_binding = {};
6223 dsl_binding.binding = 0;
6224 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6225 dsl_binding.descriptorCount = 1;
6226 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6227 dsl_binding.pImmutableSamplers = NULL;
6228
6229 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6230 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6231 ds_layout_ci.pNext = NULL;
6232 ds_layout_ci.bindingCount = 1;
6233 ds_layout_ci.pBindings = &dsl_binding;
6234 VkDescriptorSetLayout ds_layout;
6235 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
6236 ASSERT_VK_SUCCESS(err);
6237
6238 VkDescriptorSet descriptorSet;
6239 VkDescriptorSetAllocateInfo alloc_info = {};
6240 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6241 alloc_info.descriptorSetCount = 1;
6242 alloc_info.descriptorPool = ds_pool;
6243 alloc_info.pSetLayouts = &ds_layout;
6244 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
6245 ASSERT_VK_SUCCESS(err);
6246
6247 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6248 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6249 pipeline_layout_ci.pNext = NULL;
6250 pipeline_layout_ci.setLayoutCount = 1;
6251 pipeline_layout_ci.pSetLayouts = &ds_layout;
6252
6253 VkPipelineLayout pipeline_layout;
6254 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
6255 ASSERT_VK_SUCCESS(err);
6256
6257 // Create images to update the descriptor with
6258 VkImage image;
6259 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
6260 const int32_t tex_width = 32;
6261 const int32_t tex_height = 32;
6262 VkImageCreateInfo image_create_info = {};
6263 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
6264 image_create_info.pNext = NULL;
6265 image_create_info.imageType = VK_IMAGE_TYPE_2D;
6266 image_create_info.format = tex_format;
6267 image_create_info.extent.width = tex_width;
6268 image_create_info.extent.height = tex_height;
6269 image_create_info.extent.depth = 1;
6270 image_create_info.mipLevels = 1;
6271 image_create_info.arrayLayers = 1;
6272 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
6273 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
6274 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
6275 image_create_info.flags = 0;
6276 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
6277 ASSERT_VK_SUCCESS(err);
6278 // Initially bind memory to avoid error at bind view time. We'll break binding before update.
6279 VkMemoryRequirements memory_reqs;
6280 VkDeviceMemory image_memory;
6281 bool pass;
6282 VkMemoryAllocateInfo memory_info = {};
6283 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6284 memory_info.pNext = NULL;
6285 memory_info.allocationSize = 0;
6286 memory_info.memoryTypeIndex = 0;
6287 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
6288 // Allocate enough memory for image
6289 memory_info.allocationSize = memory_reqs.size;
6290 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
6291 ASSERT_TRUE(pass);
6292 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
6293 ASSERT_VK_SUCCESS(err);
6294 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
6295 ASSERT_VK_SUCCESS(err);
6296
6297 VkImageViewCreateInfo image_view_create_info = {};
6298 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
6299 image_view_create_info.image = image;
6300 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
6301 image_view_create_info.format = tex_format;
6302 image_view_create_info.subresourceRange.layerCount = 1;
6303 image_view_create_info.subresourceRange.baseMipLevel = 0;
6304 image_view_create_info.subresourceRange.levelCount = 1;
6305 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
6306
6307 VkImageView view;
6308 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
6309 ASSERT_VK_SUCCESS(err);
6310 // Create Samplers
6311 VkSamplerCreateInfo sampler_ci = {};
6312 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
6313 sampler_ci.pNext = NULL;
6314 sampler_ci.magFilter = VK_FILTER_NEAREST;
6315 sampler_ci.minFilter = VK_FILTER_NEAREST;
6316 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
6317 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6318 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6319 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
6320 sampler_ci.mipLodBias = 1.0;
6321 sampler_ci.anisotropyEnable = VK_FALSE;
6322 sampler_ci.maxAnisotropy = 1;
6323 sampler_ci.compareEnable = VK_FALSE;
6324 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
6325 sampler_ci.minLod = 1.0;
6326 sampler_ci.maxLod = 1.0;
6327 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
6328 sampler_ci.unnormalizedCoordinates = VK_FALSE;
6329 VkSampler sampler;
6330 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
6331 ASSERT_VK_SUCCESS(err);
6332 // Update descriptor with image and sampler
6333 VkDescriptorImageInfo img_info = {};
6334 img_info.sampler = sampler;
6335 img_info.imageView = view;
6336 img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
6337
6338 VkWriteDescriptorSet descriptor_write;
6339 memset(&descriptor_write, 0, sizeof(descriptor_write));
6340 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6341 descriptor_write.dstSet = descriptorSet;
6342 descriptor_write.dstBinding = 0;
6343 descriptor_write.descriptorCount = 1;
6344 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
6345 descriptor_write.pImageInfo = &img_info;
6346 // Break memory binding and attempt update
6347 vkFreeMemory(m_device->device(), image_memory, nullptr);
6348 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006349 " previously bound memory was freed. Memory must not be freed prior to this operation.");
Tobin Ehlis50a095d2016-09-21 17:32:49 -06006350 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6351 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
6352 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6353 m_errorMonitor->VerifyFound();
6354 // Cleanup
6355 vkDestroyImage(m_device->device(), image, NULL);
6356 vkDestroySampler(m_device->device(), sampler, NULL);
6357 vkDestroyImageView(m_device->device(), view, NULL);
6358 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6359 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6360 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6361}
6362
Karl Schultz6addd812016-02-02 17:17:23 -07006363TEST_F(VkLayerTest, InvalidPipeline) {
Karl Schultzbdb75952016-04-19 11:36:49 -06006364 // Attempt to bind an invalid Pipeline to a valid Command Buffer
6365 // ObjectTracker should catch this.
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006366 // Create a valid cmd buffer
6367 // call vkCmdBindPipeline w/ false Pipeline
Mark Lobodzinski02bf89d2016-05-10 14:45:13 -06006368 uint64_t fake_pipeline_handle = 0xbaad6001;
6369 VkPipeline bad_pipeline = reinterpret_cast<VkPipeline &>(fake_pipeline_handle);
Karl Schultzbdb75952016-04-19 11:36:49 -06006370 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006371 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6372
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006373 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00601);
Tony Barbour552f6c02016-12-21 14:34:07 -07006374 m_commandBuffer->BeginCommandBuffer();
6375 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006376 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, bad_pipeline);
Karl Schultzbdb75952016-04-19 11:36:49 -06006377 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006378
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006379 // Now issue a draw call with no pipeline bound
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006380 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 -06006381 Draw(1, 0, 0, 0);
6382 m_errorMonitor->VerifyFound();
Chris Forbes4dbf70f2016-09-16 17:58:00 +12006383
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006384 // Finally same check once more but with Dispatch/Compute
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!");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006386 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle()); // must be outside renderpass
Tobin Ehlisb8b6b272016-05-02 13:26:06 -06006387 vkCmdDispatch(m_commandBuffer->GetBufferHandle(), 0, 0, 0);
6388 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06006389}
6390
Karl Schultz6addd812016-02-02 17:17:23 -07006391TEST_F(VkLayerTest, DescriptorSetNotUpdated) {
Tobin Ehlis5a5f5ef2016-08-17 13:56:55 -06006392 TEST_DESCRIPTION("Bind a descriptor set that hasn't been updated.");
Karl Schultz6addd812016-02-02 17:17:23 -07006393 VkResult err;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006394
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, " bound but it was never updated. ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06006396
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006397 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyan713b2d72015-08-04 10:49:29 -06006398 ASSERT_NO_FATAL_FAILURE(InitViewport());
6399 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +08006400 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006401 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6402 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06006403
6404 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006405 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6406 ds_pool_ci.pNext = NULL;
6407 ds_pool_ci.maxSets = 1;
6408 ds_pool_ci.poolSizeCount = 1;
6409 ds_pool_ci.pPoolSizes = &ds_type_count;
Mike Stroyan713b2d72015-08-04 10:49:29 -06006410
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006411 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006412 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006413 ASSERT_VK_SUCCESS(err);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006414
Tony Barboureb254902015-07-15 12:50:33 -06006415 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006416 dsl_binding.binding = 0;
6417 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
6418 dsl_binding.descriptorCount = 1;
6419 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6420 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006421
Tony Barboureb254902015-07-15 12:50:33 -06006422 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006423 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6424 ds_layout_ci.pNext = NULL;
6425 ds_layout_ci.bindingCount = 1;
6426 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006427 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006428 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006429 ASSERT_VK_SUCCESS(err);
6430
6431 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08006432 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006433 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006434 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06006435 alloc_info.descriptorPool = ds_pool;
6436 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006437 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006438 ASSERT_VK_SUCCESS(err);
6439
Tony Barboureb254902015-07-15 12:50:33 -06006440 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006441 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6442 pipeline_layout_ci.pNext = NULL;
6443 pipeline_layout_ci.setLayoutCount = 1;
6444 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006445
6446 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006447 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006448 ASSERT_VK_SUCCESS(err);
6449
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006450 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -06006451 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -07006452 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006453 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006454
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006455 VkPipelineObj pipe(m_device);
6456 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -06006457 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -06006458 pipe.AddColorAttachment();
Tony Barbourc95e4ac2015-08-04 17:05:26 -06006459 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -06006460
Tony Barbour552f6c02016-12-21 14:34:07 -07006461 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006462 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
6463 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6464 &descriptorSet, 0, NULL);
Tobin Ehlis7d1a7112015-05-27 14:32:28 -06006465
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006466 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06006467
Chia-I Wuf7458c52015-10-26 21:10:41 +08006468 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6469 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6470 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06006471}
6472
Karl Schultz6addd812016-02-02 17:17:23 -07006473TEST_F(VkLayerTest, InvalidBufferViewObject) {
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006474 // Create a single TEXEL_BUFFER descriptor and send it an invalid bufferView
Karl Schultz6addd812016-02-02 17:17:23 -07006475 VkResult err;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006476
Karl Schultzf78bcdd2016-11-30 12:36:01 -07006477 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00940);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006478
6479 ASSERT_NO_FATAL_FAILURE(InitState());
6480 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006481 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6482 ds_type_count.descriptorCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006483
6484 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006485 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6486 ds_pool_ci.pNext = NULL;
6487 ds_pool_ci.maxSets = 1;
6488 ds_pool_ci.poolSizeCount = 1;
6489 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006490
6491 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006492 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006493 ASSERT_VK_SUCCESS(err);
6494
6495 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006496 dsl_binding.binding = 0;
6497 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6498 dsl_binding.descriptorCount = 1;
6499 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6500 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006501
6502 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006503 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6504 ds_layout_ci.pNext = NULL;
6505 ds_layout_ci.bindingCount = 1;
6506 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006507 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006508 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006509 ASSERT_VK_SUCCESS(err);
6510
6511 VkDescriptorSet descriptorSet;
6512 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006513 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006514 alloc_info.descriptorSetCount = 1;
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006515 alloc_info.descriptorPool = ds_pool;
6516 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006517 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006518 ASSERT_VK_SUCCESS(err);
6519
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006520 VkBufferView view = (VkBufferView)((size_t)0xbaadbeef); // invalid bufferView object
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006521 VkWriteDescriptorSet descriptor_write;
6522 memset(&descriptor_write, 0, sizeof(descriptor_write));
6523 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6524 descriptor_write.dstSet = descriptorSet;
6525 descriptor_write.dstBinding = 0;
6526 descriptor_write.descriptorCount = 1;
6527 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER;
6528 descriptor_write.pTexelBufferView = &view;
6529
6530 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6531
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006532 m_errorMonitor->VerifyFound();
Tobin Ehlisba31cab2015-11-02 15:24:32 -07006533
6534 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6535 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6536}
6537
Mark Youngd339ba32016-05-30 13:28:35 -06006538TEST_F(VkLayerTest, CreateBufferViewNoMemoryBoundToBuffer) {
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006539 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 -06006540
6541 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006542 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006543 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -06006544
6545 ASSERT_NO_FATAL_FAILURE(InitState());
6546
6547 // Create a buffer with no bound memory and then attempt to create
6548 // a buffer view.
6549 VkBufferCreateInfo buff_ci = {};
6550 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Chris Forbes4538d242016-09-13 18:13:58 +12006551 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -06006552 buff_ci.size = 256;
6553 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
6554 VkBuffer buffer;
6555 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
6556 ASSERT_VK_SUCCESS(err);
6557
6558 VkBufferViewCreateInfo buff_view_ci = {};
6559 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
6560 buff_view_ci.buffer = buffer;
6561 buff_view_ci.format = VK_FORMAT_R8_UNORM;
6562 buff_view_ci.range = VK_WHOLE_SIZE;
6563 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006564 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Mark Youngd339ba32016-05-30 13:28:35 -06006565
6566 m_errorMonitor->VerifyFound();
6567 vkDestroyBuffer(m_device->device(), buffer, NULL);
6568 // If last error is success, it still created the view, so delete it.
6569 if (err == VK_SUCCESS) {
6570 vkDestroyBufferView(m_device->device(), buff_view, NULL);
6571 }
6572}
6573
Karl Schultz6addd812016-02-02 17:17:23 -07006574TEST_F(VkLayerTest, InvalidDynamicOffsetCases) {
6575 // Create a descriptorSet w/ dynamic descriptor and then hit 3 offset error
6576 // cases:
Tobin Ehlisf6585052015-12-17 11:48:42 -07006577 // 1. No dynamicOffset supplied
6578 // 2. Too many dynamicOffsets supplied
6579 // 3. Dynamic offset oversteps buffer being updated
Karl Schultz6addd812016-02-02 17:17:23 -07006580 VkResult err;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006581 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6582 " requires 1 dynamicOffsets, but only "
6583 "0 dynamicOffsets are left in "
6584 "pDynamicOffsets ");
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006585
6586 ASSERT_NO_FATAL_FAILURE(InitState());
6587 ASSERT_NO_FATAL_FAILURE(InitViewport());
6588 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6589
6590 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006591 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6592 ds_type_count.descriptorCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006593
6594 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006595 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6596 ds_pool_ci.pNext = NULL;
6597 ds_pool_ci.maxSets = 1;
6598 ds_pool_ci.poolSizeCount = 1;
6599 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006600
6601 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006602 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006603 ASSERT_VK_SUCCESS(err);
6604
6605 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006606 dsl_binding.binding = 0;
6607 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6608 dsl_binding.descriptorCount = 1;
6609 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6610 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006611
6612 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006613 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6614 ds_layout_ci.pNext = NULL;
6615 ds_layout_ci.bindingCount = 1;
6616 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006617 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006618 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006619 ASSERT_VK_SUCCESS(err);
6620
6621 VkDescriptorSet descriptorSet;
6622 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08006623 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07006624 alloc_info.descriptorSetCount = 1;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006625 alloc_info.descriptorPool = ds_pool;
6626 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006627 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006628 ASSERT_VK_SUCCESS(err);
6629
6630 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006631 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6632 pipeline_layout_ci.pNext = NULL;
6633 pipeline_layout_ci.setLayoutCount = 1;
6634 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006635
6636 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006637 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006638 ASSERT_VK_SUCCESS(err);
6639
6640 // Create a buffer to update the descriptor with
6641 uint32_t qfi = 0;
6642 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006643 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6644 buffCI.size = 1024;
6645 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6646 buffCI.queueFamilyIndexCount = 1;
6647 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006648
6649 VkBuffer dyub;
6650 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6651 ASSERT_VK_SUCCESS(err);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006652 // Allocate memory and bind to buffer so we can make it to the appropriate
6653 // error
6654 VkMemoryAllocateInfo mem_alloc = {};
6655 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
6656 mem_alloc.pNext = NULL;
6657 mem_alloc.allocationSize = 1024;
Chris Forbesb6116cc2016-05-08 11:39:59 +12006658 mem_alloc.memoryTypeIndex = 0;
6659
6660 VkMemoryRequirements memReqs;
6661 vkGetBufferMemoryRequirements(m_device->device(), dyub, &memReqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006662 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
Chris Forbesb6116cc2016-05-08 11:39:59 +12006663 if (!pass) {
6664 vkDestroyBuffer(m_device->device(), dyub, NULL);
6665 return;
6666 }
6667
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006668 VkDeviceMemory mem;
6669 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
6670 ASSERT_VK_SUCCESS(err);
6671 err = vkBindBufferMemory(m_device->device(), dyub, mem, 0);
6672 ASSERT_VK_SUCCESS(err);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006673 // Correctly update descriptor to avoid "NOT_UPDATED" error
6674 VkDescriptorBufferInfo buffInfo = {};
Karl Schultz6addd812016-02-02 17:17:23 -07006675 buffInfo.buffer = dyub;
6676 buffInfo.offset = 0;
6677 buffInfo.range = 1024;
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006678
6679 VkWriteDescriptorSet descriptor_write;
6680 memset(&descriptor_write, 0, sizeof(descriptor_write));
6681 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6682 descriptor_write.dstSet = descriptorSet;
6683 descriptor_write.dstBinding = 0;
6684 descriptor_write.descriptorCount = 1;
6685 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6686 descriptor_write.pBufferInfo = &buffInfo;
6687
6688 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6689
Tony Barbour552f6c02016-12-21 14:34:07 -07006690 m_commandBuffer->BeginCommandBuffer();
6691 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006692 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6693 &descriptorSet, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006694 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006695 uint32_t pDynOff[2] = {512, 756};
6696 // Now cause error b/c too many dynOffsets in array for # of dyn descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006697 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6698 "Attempting to bind 1 descriptorSets with 1 dynamic descriptors, but ");
6699 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6700 &descriptorSet, 2, pDynOff);
Chris Forbes7b342802016-04-07 13:20:10 +12006701 m_errorMonitor->VerifyFound();
Tobin Ehlisf6585052015-12-17 11:48:42 -07006702 // Finally cause error due to dynamicOffset being too big
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006703 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6704 " dynamic offset 512 combined with "
6705 "offset 0 and range 1024 that "
6706 "oversteps the buffer size of 1024");
Tobin Ehlisf6585052015-12-17 11:48:42 -07006707 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006708 char const *vsSource =
6709 "#version 450\n"
6710 "\n"
6711 "out gl_PerVertex { \n"
6712 " vec4 gl_Position;\n"
6713 "};\n"
6714 "void main(){\n"
6715 " gl_Position = vec4(1);\n"
6716 "}\n";
6717 char const *fsSource =
6718 "#version 450\n"
6719 "\n"
6720 "layout(location=0) out vec4 x;\n"
6721 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
6722 "void main(){\n"
6723 " x = vec4(bar.y);\n"
6724 "}\n";
Tobin Ehlisf6585052015-12-17 11:48:42 -07006725 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
6726 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
6727 VkPipelineObj pipe(m_device);
6728 pipe.AddShader(&vs);
6729 pipe.AddShader(&fs);
6730 pipe.AddColorAttachment();
6731 pipe.CreateVKPipeline(pipeline_layout, renderPass());
6732
Rene Lindsayacbf5e62016-12-15 18:47:11 -07006733 VkViewport viewport = {0, 0, 16, 16, 0, 1};
6734 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
6735 VkRect2D scissor = {{0, 0}, {16, 16}};
6736 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
6737
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006738 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07006739 // This update should succeed, but offset size of 512 will overstep buffer
6740 // /w range 1024 & size 1024
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006741 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
6742 &descriptorSet, 1, pDynOff);
Tobin Ehlisf6585052015-12-17 11:48:42 -07006743 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006744 m_errorMonitor->VerifyFound();
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006745
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006746 vkDestroyBuffer(m_device->device(), dyub, NULL);
Tobin Ehlis512098e2016-05-05 09:06:12 -06006747 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis0a43bde2016-05-03 08:31:08 -06006748
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006749 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06006750 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis49f903e2015-11-04 13:30:34 -07006751 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6752}
6753
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006754TEST_F(VkLayerTest, DescriptorBufferUpdateNoMemoryBound) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07006755 TEST_DESCRIPTION(
6756 "Attempt to update a descriptor with a non-sparse buffer "
6757 "that doesn't have memory bound");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006758 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006759 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -06006760 " used with no memory bound. Memory should be bound by calling vkBindBufferMemory().");
Tobin Ehlisfed999f2016-09-21 15:09:45 -06006761 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
6762 "vkUpdateDescriptorsSets() failed write update validation for Descriptor Set 0x");
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006763
6764 ASSERT_NO_FATAL_FAILURE(InitState());
6765 ASSERT_NO_FATAL_FAILURE(InitViewport());
6766 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6767
6768 VkDescriptorPoolSize ds_type_count = {};
6769 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6770 ds_type_count.descriptorCount = 1;
6771
6772 VkDescriptorPoolCreateInfo ds_pool_ci = {};
6773 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
6774 ds_pool_ci.pNext = NULL;
6775 ds_pool_ci.maxSets = 1;
6776 ds_pool_ci.poolSizeCount = 1;
6777 ds_pool_ci.pPoolSizes = &ds_type_count;
6778
6779 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006780 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006781 ASSERT_VK_SUCCESS(err);
6782
6783 VkDescriptorSetLayoutBinding dsl_binding = {};
6784 dsl_binding.binding = 0;
6785 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6786 dsl_binding.descriptorCount = 1;
6787 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
6788 dsl_binding.pImmutableSamplers = NULL;
6789
6790 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
6791 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
6792 ds_layout_ci.pNext = NULL;
6793 ds_layout_ci.bindingCount = 1;
6794 ds_layout_ci.pBindings = &dsl_binding;
6795 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006796 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006797 ASSERT_VK_SUCCESS(err);
6798
6799 VkDescriptorSet descriptorSet;
6800 VkDescriptorSetAllocateInfo alloc_info = {};
6801 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
6802 alloc_info.descriptorSetCount = 1;
6803 alloc_info.descriptorPool = ds_pool;
6804 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006805 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis8ef479c2016-07-20 16:14:49 -06006806 ASSERT_VK_SUCCESS(err);
6807
6808 // Create a buffer to update the descriptor with
6809 uint32_t qfi = 0;
6810 VkBufferCreateInfo buffCI = {};
6811 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
6812 buffCI.size = 1024;
6813 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
6814 buffCI.queueFamilyIndexCount = 1;
6815 buffCI.pQueueFamilyIndices = &qfi;
6816
6817 VkBuffer dyub;
6818 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub);
6819 ASSERT_VK_SUCCESS(err);
6820
6821 // Attempt to update descriptor without binding memory to it
6822 VkDescriptorBufferInfo buffInfo = {};
6823 buffInfo.buffer = dyub;
6824 buffInfo.offset = 0;
6825 buffInfo.range = 1024;
6826
6827 VkWriteDescriptorSet descriptor_write;
6828 memset(&descriptor_write, 0, sizeof(descriptor_write));
6829 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
6830 descriptor_write.dstSet = descriptorSet;
6831 descriptor_write.dstBinding = 0;
6832 descriptor_write.descriptorCount = 1;
6833 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
6834 descriptor_write.pBufferInfo = &buffInfo;
6835
6836 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
6837 m_errorMonitor->VerifyFound();
6838
6839 vkDestroyBuffer(m_device->device(), dyub, NULL);
6840 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
6841 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
6842}
6843
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006844TEST_F(VkLayerTest, InvalidPushConstants) {
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006845 VkResult err;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006846 ASSERT_NO_FATAL_FAILURE(InitState());
6847 ASSERT_NO_FATAL_FAILURE(InitViewport());
6848 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
6849
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006850 VkPipelineLayout pipeline_layout;
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006851 VkPushConstantRange pc_range = {};
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006852 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
6853 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
6854 pipeline_layout_ci.pushConstantRangeCount = 1;
6855 pipeline_layout_ci.pPushConstantRanges = &pc_range;
6856
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006857 //
6858 // Check for invalid push constant ranges in pipeline layouts.
6859 //
6860 struct PipelineLayoutTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006861 VkPushConstantRange const range;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006862 char const *msg;
6863 };
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006864
Karl Schultzc81037d2016-05-12 08:11:23 -06006865 const uint32_t too_big = m_device->props.limits.maxPushConstantsSize + 0x4;
6866 const std::array<PipelineLayoutTestCase, 10> range_tests = {{
6867 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 0},
6868 "vkCreatePipelineLayout() call has push constants index 0 with "
6869 "size 0."},
6870 {{VK_SHADER_STAGE_VERTEX_BIT, 0, 1},
6871 "vkCreatePipelineLayout() call has push constants index 0 with "
6872 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006873 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 1},
Karl Schultzc81037d2016-05-12 08:11:23 -06006874 "vkCreatePipelineLayout() call has push constants index 0 with "
6875 "size 1."},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006876 {{VK_SHADER_STAGE_VERTEX_BIT, 4, 0},
Karl Schultzc81037d2016-05-12 08:11:23 -06006877 "vkCreatePipelineLayout() call has push constants index 0 with "
6878 "size 0."},
6879 {{VK_SHADER_STAGE_VERTEX_BIT, 1, 4},
6880 "vkCreatePipelineLayout() call has push constants index 0 with "
6881 "offset 1. Offset must"},
6882 {{VK_SHADER_STAGE_VERTEX_BIT, 0, too_big},
6883 "vkCreatePipelineLayout() call has push constants index 0 "
6884 "with offset "},
6885 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, too_big},
6886 "vkCreatePipelineLayout() call has push constants "
6887 "index 0 with offset "},
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006888 {{VK_SHADER_STAGE_VERTEX_BIT, too_big, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06006889 "vkCreatePipelineLayout() call has push constants index 0 "
6890 "with offset "},
6891 {{VK_SHADER_STAGE_VERTEX_BIT, 0xFFFFFFF0, 0x00000020},
6892 "vkCreatePipelineLayout() call has push "
6893 "constants index 0 with offset "},
6894 {{VK_SHADER_STAGE_VERTEX_BIT, 0x00000020, 0xFFFFFFF0},
6895 "vkCreatePipelineLayout() call has push "
6896 "constants index 0 with offset "},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006897 }};
6898
6899 // Check for invalid offset and size
Karl Schultzc81037d2016-05-12 08:11:23 -06006900 for (const auto &iter : range_tests) {
6901 pc_range = iter.range;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006902 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg);
6903 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006904 m_errorMonitor->VerifyFound();
6905 if (VK_SUCCESS == err) {
6906 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6907 }
6908 }
6909
6910 // Check for invalid stage flag
6911 pc_range.offset = 0;
6912 pc_range.size = 16;
6913 pc_range.stageFlags = 0;
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06006914 m_errorMonitor->SetDesiredFailureMsg(
6915 VK_DEBUG_REPORT_ERROR_BIT_EXT,
6916 "vkCreatePipelineLayout: value of pCreateInfo->pPushConstantRanges[0].stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006917 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12006918 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006919 if (VK_SUCCESS == err) {
6920 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6921 }
6922
Karl Schultzc59b72d2017-02-24 15:45:05 -07006923 // Check for duplicate stage flags in a list of push constant ranges.
6924 // A shader can only have one push constant block and that block is mapped
6925 // to the push constant range that has that shader's stage flag set.
6926 // The shader's stage flag can only appear once in all the ranges, so the
6927 // implementation can find the one and only range to map it to.
Karl Schultzc81037d2016-05-12 08:11:23 -06006928 const uint32_t ranges_per_test = 5;
Karl Schultzc59b72d2017-02-24 15:45:05 -07006929 struct DuplicateStageFlagsTestCase {
Karl Schultzc81037d2016-05-12 08:11:23 -06006930 VkPushConstantRange const ranges[ranges_per_test];
Jeremy Hayesde6d96c2017-02-01 15:22:32 -07006931 std::vector<char const *> const msg;
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006932 };
Karl Schultzc59b72d2017-02-24 15:45:05 -07006933 // Overlapping ranges are OK, but a stage flag can appear only once.
6934 const std::array<DuplicateStageFlagsTestCase, 3> duplicate_stageFlags_tests = {
6935 {
6936 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6937 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6938 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6939 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006940 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4}},
Karl Schultzc59b72d2017-02-24 15:45:05 -07006941 {
6942 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 1.",
6943 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 2.",
6944 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
6945 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 4.",
6946 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 2.",
6947 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 3.",
6948 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
6949 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
6950 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 4.",
6951 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 3 and 4.",
6952 }},
6953 {{{VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6954 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4},
6955 {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
6956 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6957 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
6958 {
6959 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 0 and 3.",
6960 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 1 and 4.",
6961 }},
6962 {{{VK_SHADER_STAGE_FRAGMENT_BIT, 0, 4},
6963 {VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, 0, 4},
6964 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6965 {VK_SHADER_STAGE_VERTEX_BIT, 0, 4},
6966 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 4}},
6967 {
6968 "vkCreatePipelineLayout() Duplicate stage flags found in ranges 2 and 3.",
6969 }},
6970 },
6971 };
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006972
Karl Schultzc59b72d2017-02-24 15:45:05 -07006973 for (const auto &iter : duplicate_stageFlags_tests) {
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006974 pipeline_layout_ci.pPushConstantRanges = iter.ranges;
Karl Schultzc81037d2016-05-12 08:11:23 -06006975 pipeline_layout_ci.pushConstantRangeCount = ranges_per_test;
Karl Schultzc59b72d2017-02-24 15:45:05 -07006976 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, iter.msg.begin(), iter.msg.end());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006977 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006978 m_errorMonitor->VerifyFound();
6979 if (VK_SUCCESS == err) {
6980 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
6981 }
6982 }
6983
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006984 //
6985 // CmdPushConstants tests
6986 //
6987
Karl Schultzc59b72d2017-02-24 15:45:05 -07006988 // Setup a pipeline layout with ranges: [0,16) [64,80)
Karl Schultzc81037d2016-05-12 08:11:23 -06006989 const VkPushConstantRange pc_range2[] = {
Karl Schultzc59b72d2017-02-24 15:45:05 -07006990 {VK_SHADER_STAGE_VERTEX_BIT, 64, 16}, {VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006991 };
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006992 pipeline_layout_ci.pushConstantRangeCount = sizeof(pc_range2) / sizeof(VkPushConstantRange);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06006993 pipeline_layout_ci.pPushConstantRanges = pc_range2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06006994 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07006995 ASSERT_VK_SUCCESS(err);
Karl Schultzc59b72d2017-02-24 15:45:05 -07006996
6997 const uint8_t dummy_values[100] = {};
6998
6999 m_commandBuffer->BeginCommandBuffer();
7000 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007001
7002 // Check for invalid stage flag
Karl Schultzc59b72d2017-02-24 15:45:05 -07007003 // Note that VU 00996 isn't reached due to parameter validation
Karl Schultzb7c6d0f2016-09-13 14:23:19 -06007004 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdPushConstants: value of stageFlags must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007005 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, 0, 0, 16, dummy_values);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007006 m_errorMonitor->VerifyFound();
Karl Schultzfc8eaf12016-05-06 13:56:42 -06007007
Karl Schultzc59b72d2017-02-24 15:45:05 -07007008 m_errorMonitor->ExpectSuccess();
7009 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16, dummy_values);
7010 m_errorMonitor->VerifyNotFound();
7011 m_errorMonitor->ExpectSuccess();
7012 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, VK_SHADER_STAGE_VERTEX_BIT, 64, 16, dummy_values);
7013 m_errorMonitor->VerifyNotFound();
7014 const std::array<VkPushConstantRange, 6> cmd_range_tests = {{
7015 {VK_SHADER_STAGE_FRAGMENT_BIT, 64, 16},
7016 {VK_SHADER_STAGE_VERTEX_BIT, 0, 16},
7017 {VK_SHADER_STAGE_GEOMETRY_BIT, 0, 16},
7018 {VK_SHADER_STAGE_VERTEX_BIT | VK_SHADER_STAGE_FRAGMENT_BIT, 0, 16},
7019 {VK_SHADER_STAGE_VERTEX_BIT, 24, 16},
7020 {VK_SHADER_STAGE_VERTEX_BIT, 8, 4},
Karl Schultzc81037d2016-05-12 08:11:23 -06007021 }};
Karl Schultzc59b72d2017-02-24 15:45:05 -07007022 for (const auto &iter : cmd_range_tests) {
7023 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00988);
7024 vkCmdPushConstants(m_commandBuffer->GetBufferHandle(), pipeline_layout, iter.stageFlags, iter.offset, iter.size,
7025 dummy_values);
Karl Schultzc81037d2016-05-12 08:11:23 -06007026 m_errorMonitor->VerifyFound();
7027 }
Karl Schultzc81037d2016-05-12 08:11:23 -06007028
Tony Barbour552f6c02016-12-21 14:34:07 -07007029 m_commandBuffer->EndRenderPass();
7030 m_commandBuffer->EndCommandBuffer();
Karl Schultzc59b72d2017-02-24 15:45:05 -07007031 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
Tobin Ehlis3a23b6a2016-02-17 10:35:18 -07007032}
7033
Karl Schultz6addd812016-02-02 17:17:23 -07007034TEST_F(VkLayerTest, DescriptorSetCompatibility) {
Tobin Ehlis559c6382015-11-05 09:52:49 -07007035 // Test various desriptorSet errors with bad binding combinations
Karl Schultz6addd812016-02-02 17:17:23 -07007036 VkResult err;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007037
7038 ASSERT_NO_FATAL_FAILURE(InitState());
7039 ASSERT_NO_FATAL_FAILURE(InitViewport());
7040 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
7041
7042 static const uint32_t NUM_DESCRIPTOR_TYPES = 5;
7043 VkDescriptorPoolSize ds_type_count[NUM_DESCRIPTOR_TYPES] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007044 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7045 ds_type_count[0].descriptorCount = 10;
7046 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
7047 ds_type_count[1].descriptorCount = 2;
7048 ds_type_count[2].type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7049 ds_type_count[2].descriptorCount = 2;
7050 ds_type_count[3].type = VK_DESCRIPTOR_TYPE_SAMPLER;
7051 ds_type_count[3].descriptorCount = 5;
7052 // TODO : LunarG ILO driver currently asserts in desc.c w/ INPUT_ATTACHMENT
7053 // type
7054 // ds_type_count[4].type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
7055 ds_type_count[4].type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
7056 ds_type_count[4].descriptorCount = 2;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007057
7058 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007059 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7060 ds_pool_ci.pNext = NULL;
7061 ds_pool_ci.maxSets = 5;
7062 ds_pool_ci.poolSizeCount = NUM_DESCRIPTOR_TYPES;
7063 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007064
7065 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007066 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007067 ASSERT_VK_SUCCESS(err);
7068
7069 static const uint32_t MAX_DS_TYPES_IN_LAYOUT = 2;
7070 VkDescriptorSetLayoutBinding dsl_binding[MAX_DS_TYPES_IN_LAYOUT] = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007071 dsl_binding[0].binding = 0;
7072 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7073 dsl_binding[0].descriptorCount = 5;
7074 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
7075 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007076
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007077 // Create layout identical to set0 layout but w/ different stageFlags
7078 VkDescriptorSetLayoutBinding dsl_fs_stage_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007079 dsl_fs_stage_only.binding = 0;
7080 dsl_fs_stage_only.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7081 dsl_fs_stage_only.descriptorCount = 5;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007082 dsl_fs_stage_only.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT; // Different stageFlags to cause error at
7083 // bind time
Karl Schultz6addd812016-02-02 17:17:23 -07007084 dsl_fs_stage_only.pImmutableSamplers = NULL;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007085 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007086 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7087 ds_layout_ci.pNext = NULL;
7088 ds_layout_ci.bindingCount = 1;
7089 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007090 static const uint32_t NUM_LAYOUTS = 4;
7091 VkDescriptorSetLayout ds_layout[NUM_LAYOUTS] = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007092 VkDescriptorSetLayout ds_layout_fs_only = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007093 // Create 4 unique layouts for full pipelineLayout, and 1 special fs-only
7094 // layout for error case
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007095 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[0]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007096 ASSERT_VK_SUCCESS(err);
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007097 ds_layout_ci.pBindings = &dsl_fs_stage_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007098 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007099 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007100 dsl_binding[0].binding = 0;
7101 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007102 dsl_binding[0].descriptorCount = 2;
Mike Stroyan9c70cdb2016-01-06 14:14:17 -07007103 dsl_binding[1].binding = 1;
7104 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
7105 dsl_binding[1].descriptorCount = 2;
7106 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
7107 dsl_binding[1].pImmutableSamplers = NULL;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007108 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007109 ds_layout_ci.bindingCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007110 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[1]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007111 ASSERT_VK_SUCCESS(err);
7112 dsl_binding[0].binding = 0;
7113 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007114 dsl_binding[0].descriptorCount = 5;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007115 ds_layout_ci.bindingCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007116 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[2]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007117 ASSERT_VK_SUCCESS(err);
7118 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007119 dsl_binding[0].descriptorCount = 2;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007120 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout[3]);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007121 ASSERT_VK_SUCCESS(err);
7122
7123 static const uint32_t NUM_SETS = 4;
7124 VkDescriptorSet descriptorSet[NUM_SETS] = {};
7125 VkDescriptorSetAllocateInfo alloc_info = {};
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007126 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007127 alloc_info.descriptorSetCount = NUM_LAYOUTS;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007128 alloc_info.descriptorPool = ds_pool;
7129 alloc_info.pSetLayouts = ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007130 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptorSet);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007131 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007132 VkDescriptorSet ds0_fs_only = {};
Jon Ashburnf19916e2016-01-11 13:12:43 -07007133 alloc_info.descriptorSetCount = 1;
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007134 alloc_info.pSetLayouts = &ds_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007135 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &ds0_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007136 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007137
7138 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007139 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7140 pipeline_layout_ci.pNext = NULL;
7141 pipeline_layout_ci.setLayoutCount = NUM_LAYOUTS;
7142 pipeline_layout_ci.pSetLayouts = ds_layout;
Tobin Ehlis559c6382015-11-05 09:52:49 -07007143
7144 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007145 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007146 ASSERT_VK_SUCCESS(err);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007147 // Create pipelineLayout with only one setLayout
7148 pipeline_layout_ci.setLayoutCount = 1;
7149 VkPipelineLayout single_pipe_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007150 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &single_pipe_layout);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007151 ASSERT_VK_SUCCESS(err);
7152 // Create pipelineLayout with 2 descriptor setLayout at index 0
7153 pipeline_layout_ci.pSetLayouts = &ds_layout[3];
7154 VkPipelineLayout pipe_layout_one_desc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007155 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_one_desc);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007156 ASSERT_VK_SUCCESS(err);
7157 // Create pipelineLayout with 5 SAMPLER descriptor setLayout at index 0
7158 pipeline_layout_ci.pSetLayouts = &ds_layout[2];
7159 VkPipelineLayout pipe_layout_five_samp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007160 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_five_samp);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007161 ASSERT_VK_SUCCESS(err);
7162 // Create pipelineLayout with UB type, but stageFlags for FS only
7163 pipeline_layout_ci.pSetLayouts = &ds_layout_fs_only;
7164 VkPipelineLayout pipe_layout_fs_only;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007165 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_fs_only);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007166 ASSERT_VK_SUCCESS(err);
7167 // Create pipelineLayout w/ incompatible set0 layout, but set1 is fine
7168 VkDescriptorSetLayout pl_bad_s0[2] = {};
7169 pl_bad_s0[0] = ds_layout_fs_only;
7170 pl_bad_s0[1] = ds_layout[1];
7171 pipeline_layout_ci.setLayoutCount = 2;
7172 pipeline_layout_ci.pSetLayouts = pl_bad_s0;
7173 VkPipelineLayout pipe_layout_bad_set0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007174 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipe_layout_bad_set0);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007175 ASSERT_VK_SUCCESS(err);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007176
Tobin Ehlis88452832015-12-03 09:40:56 -07007177 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007178 char const *vsSource =
7179 "#version 450\n"
7180 "\n"
7181 "out gl_PerVertex {\n"
7182 " vec4 gl_Position;\n"
7183 "};\n"
7184 "void main(){\n"
7185 " gl_Position = vec4(1);\n"
7186 "}\n";
7187 char const *fsSource =
7188 "#version 450\n"
7189 "\n"
7190 "layout(location=0) out vec4 x;\n"
7191 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
7192 "void main(){\n"
7193 " x = vec4(bar.y);\n"
7194 "}\n";
Tobin Ehlis88452832015-12-03 09:40:56 -07007195 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
7196 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007197 VkPipelineObj pipe(m_device);
7198 pipe.AddShader(&vs);
7199 pipe.AddShader(&fs);
Tobin Ehlis88452832015-12-03 09:40:56 -07007200 pipe.AddColorAttachment();
7201 pipe.CreateVKPipeline(pipe_layout_fs_only, renderPass());
Tobin Ehlis559c6382015-11-05 09:52:49 -07007202
Tony Barbour552f6c02016-12-21 14:34:07 -07007203 m_commandBuffer->BeginCommandBuffer();
7204 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis88452832015-12-03 09:40:56 -07007205
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007206 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Karl Schultz6addd812016-02-02 17:17:23 -07007207 // NOTE : I believe LunarG ilo driver has bug (LX#189) that requires binding
7208 // of PSO
7209 // here before binding DSs. Otherwise we assert in cmd_copy_dset_data() of
7210 // cmd_pipeline.c
7211 // due to the fact that cmd_alloc_dset_data() has not been called in
7212 // cmd_bind_graphics_pipeline()
7213 // TODO : Want to cause various binding incompatibility issues here to test
7214 // DrawState
Tobin Ehlis559c6382015-11-05 09:52:49 -07007215 // First cause various verify_layout_compatibility() fails
7216 // Second disturb early and late sets and verify INFO msgs
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007217 // verify_set_layout_compatibility fail cases:
7218 // 1. invalid VkPipelineLayout (layout) passed into vkCmdBindDescriptorSets
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007219 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00981);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007220 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS,
7221 (VkPipelineLayout)((size_t)0xbaadb1be), 0, 1, &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007222 m_errorMonitor->VerifyFound();
7223
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007224 // 2. layoutIndex exceeds # of layouts in layout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007225 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " attempting to bind set to index 1");
7226 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, single_pipe_layout, 0, 2,
7227 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007228 m_errorMonitor->VerifyFound();
7229
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007230 vkDestroyPipelineLayout(m_device->device(), single_pipe_layout, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007231 // 3. Pipeline setLayout[0] has 2 descriptors, but set being bound has 5
7232 // descriptors
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " has 2 descriptors, but DescriptorSetLayout ");
7234 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_one_desc, 0, 1,
7235 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007236 m_errorMonitor->VerifyFound();
7237
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007238 vkDestroyPipelineLayout(m_device->device(), pipe_layout_one_desc, NULL);
7239 // 4. same # of descriptors but mismatch in type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007240 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is type 'VK_DESCRIPTOR_TYPE_SAMPLER' but binding ");
7241 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_five_samp, 0, 1,
7242 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007243 m_errorMonitor->VerifyFound();
7244
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007245 vkDestroyPipelineLayout(m_device->device(), pipe_layout_five_samp, NULL);
7246 // 5. same # of descriptors but mismatch in stageFlags
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007247 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7248 " has stageFlags 16 but binding 0 for DescriptorSetLayout ");
7249 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7250 &descriptorSet[0], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007251 m_errorMonitor->VerifyFound();
7252
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007253 // Cause INFO messages due to disturbing previously bound Sets
7254 // First bind sets 0 & 1
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007255 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7256 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007257 // 1. Disturb bound set0 by re-binding set1 w/ updated pipelineLayout
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007258 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, " previously bound as set #0 was disturbed ");
7259 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7260 &descriptorSet[1], 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007261 m_errorMonitor->VerifyFound();
7262
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007263 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7264 &descriptorSet[0], 0, NULL);
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007265 // 2. Disturb set after last bound set
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007266 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
7267 " newly bound as set #0 so set #1 and "
7268 "any subsequent sets were disturbed ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007269 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_fs_only, 0, 1,
7270 &ds0_fs_only, 0, NULL);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007271 m_errorMonitor->VerifyFound();
7272
Tobin Ehlis10fad692016-07-07 12:00:36 -06007273 // Now that we're done actively using the pipelineLayout that gfx pipeline
7274 // was created with, we should be able to delete it. Do that now to verify
7275 // that validation obeys pipelineLayout lifetime
7276 vkDestroyPipelineLayout(m_device->device(), pipe_layout_fs_only, NULL);
7277
Tobin Ehlis88452832015-12-03 09:40:56 -07007278 // Cause draw-time errors due to PSO incompatibilities
Karl Schultz6addd812016-02-02 17:17:23 -07007279 // 1. Error due to not binding required set (we actually use same code as
7280 // above to disturb set0)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007281 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7282 &descriptorSet[0], 0, NULL);
7283 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe_layout_bad_set0, 1, 1,
7284 &descriptorSet[1], 0, NULL);
7285 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 -07007286
7287 VkViewport viewport = {0, 0, 16, 16, 0, 1};
7288 VkRect2D scissor = {{0, 0}, {16, 16}};
7289 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
7290 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
7291
Tobin Ehlis88452832015-12-03 09:40:56 -07007292 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007293 m_errorMonitor->VerifyFound();
7294
Tobin Ehlis991d45a2016-01-06 08:48:41 -07007295 vkDestroyPipelineLayout(m_device->device(), pipe_layout_bad_set0, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07007296 // 2. Error due to bound set not being compatible with PSO's
7297 // VkPipelineLayout (diff stageFlags in this case)
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007298 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 2,
7299 &descriptorSet[0], 0, NULL);
7300 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " bound as set #0 is not compatible with ");
Tobin Ehlis88452832015-12-03 09:40:56 -07007301 Draw(1, 0, 0, 0);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007302 m_errorMonitor->VerifyFound();
7303
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007304 // Remaining clean-up
Karl Schultz6addd812016-02-02 17:17:23 -07007305 for (uint32_t i = 0; i < NUM_LAYOUTS; ++i) {
Tobin Ehlis8fab6562015-12-01 09:57:09 -07007306 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout[i], NULL);
7307 }
7308 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout_fs_only, NULL);
Tobin Ehlis559c6382015-11-05 09:52:49 -07007309 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7310 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
7311}
Tobin Ehlis559c6382015-11-05 09:52:49 -07007312
Karl Schultz6addd812016-02-02 17:17:23 -07007313TEST_F(VkLayerTest, NoBeginCommandBuffer) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007314 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7315 "You must call vkBeginCommandBuffer() before this call to ");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007316
7317 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007318 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007319 // Call EndCommandBuffer() w/o calling BeginCommandBuffer()
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007320 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007321
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007322 m_errorMonitor->VerifyFound();
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007323}
7324
Karl Schultz6addd812016-02-02 17:17:23 -07007325TEST_F(VkLayerTest, SecondaryCommandBufferNullRenderpass) {
7326 VkResult err;
7327 VkCommandBuffer draw_cmd;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007328
Karl Schultzf78bcdd2016-11-30 12:36:01 -07007329 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007330
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007331 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007332
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007333 VkCommandBufferAllocateInfo cmd = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007334 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007335 cmd.pNext = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007336 cmd.commandPool = m_commandPool;
7337 cmd.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007338 cmd.commandBufferCount = 1;
Cody Northropb4569702015-08-04 17:35:57 -06007339
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007340 err = vkAllocateCommandBuffers(m_device->device(), &cmd, &draw_cmd);
Mike Stroyand1c84a52015-08-18 14:40:24 -06007341 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007342
7343 // Force the failure by not setting the Renderpass and Framebuffer fields
Jon Ashburnf19916e2016-01-11 13:12:43 -07007344 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Rene Lindsay65072a92017-01-23 11:38:10 -07007345 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7346
7347 VkCommandBufferBeginInfo cmd_buf_info = {};
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007348 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Cody Northropb4569702015-08-04 17:35:57 -06007349 cmd_buf_info.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007350 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 -07007351 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007352
7353 // The error should be caught by validation of the BeginCommandBuffer call
7354 vkBeginCommandBuffer(draw_cmd, &cmd_buf_info);
7355
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007356 m_errorMonitor->VerifyFound();
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007357 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &draw_cmd);
Mark Lobodzinskid9139a62015-08-04 16:24:20 -06007358}
7359
Karl Schultz6addd812016-02-02 17:17:23 -07007360TEST_F(VkLayerTest, CommandBufferResetErrors) {
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007361 // Cause error due to Begin while recording CB
7362 // Then cause 2 errors for attempting to reset CB w/o having
7363 // VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT set for the pool from
7364 // which CBs were allocated. Note that this bit is off by default.
Mike Weiblencce7ec72016-10-17 19:33:05 -06007365 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Cannot call Begin on command buffer");
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007366
7367 ASSERT_NO_FATAL_FAILURE(InitState());
7368
7369 // Calls AllocateCommandBuffers
7370 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
7371
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007372 // Force the failure by setting the Renderpass and Framebuffer fields with (fake) data
Jon Ashburnf19916e2016-01-11 13:12:43 -07007373 VkCommandBufferInheritanceInfo cmd_buf_hinfo = {};
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007374 cmd_buf_hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
7375 VkCommandBufferBeginInfo cmd_buf_info = {};
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007376 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
7377 cmd_buf_info.pNext = NULL;
7378 cmd_buf_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007379 cmd_buf_info.pInheritanceInfo = &cmd_buf_hinfo;
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007380
7381 // Begin CB to transition to recording state
7382 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
7383 // Can't re-begin. This should trigger error
7384 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007385 m_errorMonitor->VerifyFound();
7386
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007387 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00093);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007388 VkCommandBufferResetFlags flags = 0; // Don't care about flags for this test
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007389 // Reset attempt will trigger error due to incorrect CommandPool state
7390 vkResetCommandBuffer(commandBuffer.GetBufferHandle(), flags);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007391 m_errorMonitor->VerifyFound();
7392
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07007393 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00105);
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007394 // Transition CB to RECORDED state
7395 vkEndCommandBuffer(commandBuffer.GetBufferHandle());
7396 // Now attempting to Begin will implicitly reset, which triggers error
7397 vkBeginCommandBuffer(commandBuffer.GetBufferHandle(), &cmd_buf_info);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007398 m_errorMonitor->VerifyFound();
Tobin Ehlisac0ef842015-12-14 13:46:38 -07007399}
7400
Karl Schultz6addd812016-02-02 17:17:23 -07007401TEST_F(VkLayerTest, InvalidPipelineCreateState) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007402 // Attempt to Create Gfx Pipeline w/o a VS
Karl Schultz6addd812016-02-02 17:17:23 -07007403 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007404
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07007405 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
7406 "Invalid Pipeline CreateInfo State: Vertex Shader required");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007407
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007408 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -06007409 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007410
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007411 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007412 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7413 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -06007414
7415 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007416 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7417 ds_pool_ci.pNext = NULL;
7418 ds_pool_ci.maxSets = 1;
7419 ds_pool_ci.poolSizeCount = 1;
7420 ds_pool_ci.pPoolSizes = &ds_type_count;
Mark Lobodzinski209b5292015-09-17 09:44:05 -06007421
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007422 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007423 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007424 ASSERT_VK_SUCCESS(err);
7425
Tony Barboureb254902015-07-15 12:50:33 -06007426 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007427 dsl_binding.binding = 0;
7428 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7429 dsl_binding.descriptorCount = 1;
7430 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7431 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007432
Tony Barboureb254902015-07-15 12:50:33 -06007433 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007434 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7435 ds_layout_ci.pNext = NULL;
7436 ds_layout_ci.bindingCount = 1;
7437 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -06007438
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007439 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007440 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007441 ASSERT_VK_SUCCESS(err);
7442
7443 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007444 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007445 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007446 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007447 alloc_info.descriptorPool = ds_pool;
7448 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007449 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007450 ASSERT_VK_SUCCESS(err);
7451
Tony Barboureb254902015-07-15 12:50:33 -06007452 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007453 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7454 pipeline_layout_ci.setLayoutCount = 1;
7455 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007456
7457 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007458 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007459 ASSERT_VK_SUCCESS(err);
7460
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07007461 VkViewport vp = {}; // Just need dummy vp to point to
7462 VkRect2D sc = {}; // dummy scissor to point to
Tobin Ehlise68360f2015-10-01 11:15:13 -06007463
7464 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007465 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
7466 vp_state_ci.scissorCount = 1;
7467 vp_state_ci.pScissors = &sc;
7468 vp_state_ci.viewportCount = 1;
7469 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007470
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007471 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7472 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7473 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7474 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7475 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7476 rs_state_ci.depthClampEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007477 rs_state_ci.rasterizerDiscardEnable = VK_TRUE;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007478 rs_state_ci.depthBiasEnable = VK_FALSE;
Rene Lindsayae4977b2017-01-23 14:55:54 -07007479 rs_state_ci.lineWidth = 1.0f;
7480
7481 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7482 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7483 vi_ci.pNext = nullptr;
7484 vi_ci.vertexBindingDescriptionCount = 0;
7485 vi_ci.pVertexBindingDescriptions = nullptr;
7486 vi_ci.vertexAttributeDescriptionCount = 0;
7487 vi_ci.pVertexAttributeDescriptions = nullptr;
7488
7489 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7490 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7491 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7492
7493 VkPipelineShaderStageCreateInfo shaderStages[2];
7494 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
7495
7496 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
7497 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Dave Houlton59a20702017-02-02 17:26:23 -07007498 shaderStages[0] = fs.GetStageCreateInfo(); // should be: vs.GetStageCreateInfo();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007499 shaderStages[1] = fs.GetStageCreateInfo();
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007500
Tony Barboureb254902015-07-15 12:50:33 -06007501 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007502 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7503 gp_ci.pViewportState = &vp_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007504 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007505 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7506 gp_ci.layout = pipeline_layout;
7507 gp_ci.renderPass = renderPass();
Rene Lindsayae4977b2017-01-23 14:55:54 -07007508 gp_ci.pVertexInputState = &vi_ci;
7509 gp_ci.pInputAssemblyState = &ia_ci;
7510
7511 gp_ci.stageCount = 1;
7512 gp_ci.pStages = shaderStages;
Tony Barboureb254902015-07-15 12:50:33 -06007513
7514 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007515 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7516 pc_ci.initialDataSize = 0;
7517 pc_ci.pInitialData = 0;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007518
7519 VkPipeline pipeline;
Jon Ashburnc669cc62015-07-09 15:02:25 -06007520 VkPipelineCache pipelineCache;
7521
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007522 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Jon Ashburnc669cc62015-07-09 15:02:25 -06007523 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007524 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007525 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007526
Chia-I Wuf7458c52015-10-26 21:10:41 +08007527 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7528 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7529 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7530 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007531}
Rene Lindsayae4977b2017-01-23 14:55:54 -07007532
Tobin Ehlis912df022015-09-17 08:46:18 -06007533/*// TODO : This test should be good, but needs Tess support in compiler to run
7534TEST_F(VkLayerTest, InvalidPatchControlPoints)
7535{
7536 // Attempt to Create Gfx Pipeline w/o a VS
Tobin Ehlis912df022015-09-17 08:46:18 -06007537 VkResult err;
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06007538
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -07007539 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Karl Schultz6addd812016-02-02 17:17:23 -07007540 "Invalid Pipeline CreateInfo State: VK_PRIMITIVE_TOPOLOGY_PATCH
7541primitive ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007542
Tobin Ehlis912df022015-09-17 08:46:18 -06007543 ASSERT_NO_FATAL_FAILURE(InitState());
7544 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis912df022015-09-17 08:46:18 -06007545
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007546 VkDescriptorPoolSize ds_type_count = {};
Tobin Ehlis912df022015-09-17 08:46:18 -06007547 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007548 ds_type_count.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007549
7550 VkDescriptorPoolCreateInfo ds_pool_ci = {};
7551 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7552 ds_pool_ci.pNext = NULL;
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007553 ds_pool_ci.poolSizeCount = 1;
7554 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlis912df022015-09-17 08:46:18 -06007555
7556 VkDescriptorPool ds_pool;
Karl Schultz6addd812016-02-02 17:17:23 -07007557 err = vkCreateDescriptorPool(m_device->device(),
7558VK_DESCRIPTOR_POOL_USAGE_NON_FREE, 1, &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis912df022015-09-17 08:46:18 -06007559 ASSERT_VK_SUCCESS(err);
7560
7561 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +08007562 dsl_binding.binding = 0;
Tobin Ehlis912df022015-09-17 08:46:18 -06007563 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +08007564 dsl_binding.descriptorCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007565 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
7566 dsl_binding.pImmutableSamplers = NULL;
7567
7568 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007569 ds_layout_ci.sType =
7570VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007571 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007572 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -07007573 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis912df022015-09-17 08:46:18 -06007574
7575 VkDescriptorSetLayout ds_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007576 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL,
7577&ds_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007578 ASSERT_VK_SUCCESS(err);
7579
7580 VkDescriptorSet descriptorSet;
Karl Schultz6addd812016-02-02 17:17:23 -07007581 err = vkAllocateDescriptorSets(m_device->device(), ds_pool,
7582VK_DESCRIPTOR_SET_USAGE_NON_FREE, 1, &ds_layout, &descriptorSet);
Tobin Ehlis912df022015-09-17 08:46:18 -06007583 ASSERT_VK_SUCCESS(err);
7584
7585 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007586 pipeline_layout_ci.sType =
7587VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Tobin Ehlis912df022015-09-17 08:46:18 -06007588 pipeline_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +08007589 pipeline_layout_ci.setLayoutCount = 1;
Tobin Ehlis912df022015-09-17 08:46:18 -06007590 pipeline_layout_ci.pSetLayouts = &ds_layout;
7591
7592 VkPipelineLayout pipeline_layout;
Karl Schultz6addd812016-02-02 17:17:23 -07007593 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL,
7594&pipeline_layout);
Tobin Ehlis912df022015-09-17 08:46:18 -06007595 ASSERT_VK_SUCCESS(err);
7596
7597 VkPipelineShaderStageCreateInfo shaderStages[3];
7598 memset(&shaderStages, 0, 3 * sizeof(VkPipelineShaderStageCreateInfo));
7599
Karl Schultz6addd812016-02-02 17:17:23 -07007600 VkShaderObj vs(m_device,bindStateVertShaderText,VK_SHADER_STAGE_VERTEX_BIT,
7601this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007602 // Just using VS txt for Tess shaders as we don't care about functionality
Karl Schultz6addd812016-02-02 17:17:23 -07007603 VkShaderObj
7604tc(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT,
7605this);
7606 VkShaderObj
7607te(m_device,bindStateVertShaderText,VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT,
7608this);
Tobin Ehlis912df022015-09-17 08:46:18 -06007609
Karl Schultz6addd812016-02-02 17:17:23 -07007610 shaderStages[0].sType =
7611VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007612 shaderStages[0].stage = VK_SHADER_STAGE_VERTEX_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007613 shaderStages[0].shader = vs.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007614 shaderStages[1].sType =
7615VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007616 shaderStages[1].stage = VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007617 shaderStages[1].shader = tc.handle();
Karl Schultz6addd812016-02-02 17:17:23 -07007618 shaderStages[2].sType =
7619VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO;
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -06007620 shaderStages[2].stage = VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT;
Tobin Ehlis912df022015-09-17 08:46:18 -06007621 shaderStages[2].shader = te.handle();
7622
7623 VkPipelineInputAssemblyStateCreateInfo iaCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007624 iaCI.sType =
7625VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
Chia-I Wu515eb8f2015-10-31 00:31:16 +08007626 iaCI.topology = VK_PRIMITIVE_TOPOLOGY_PATCH_LIST;
Tobin Ehlis912df022015-09-17 08:46:18 -06007627
7628 VkPipelineTessellationStateCreateInfo tsCI = {};
7629 tsCI.sType = VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO;
7630 tsCI.patchControlPoints = 0; // This will cause an error
7631
7632 VkGraphicsPipelineCreateInfo gp_ci = {};
7633 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7634 gp_ci.pNext = NULL;
7635 gp_ci.stageCount = 3;
7636 gp_ci.pStages = shaderStages;
7637 gp_ci.pVertexInputState = NULL;
7638 gp_ci.pInputAssemblyState = &iaCI;
7639 gp_ci.pTessellationState = &tsCI;
7640 gp_ci.pViewportState = NULL;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007641 gp_ci.pRasterizationState = NULL;
Tobin Ehlis912df022015-09-17 08:46:18 -06007642 gp_ci.pMultisampleState = NULL;
7643 gp_ci.pDepthStencilState = NULL;
7644 gp_ci.pColorBlendState = NULL;
7645 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7646 gp_ci.layout = pipeline_layout;
7647 gp_ci.renderPass = renderPass();
7648
7649 VkPipelineCacheCreateInfo pc_ci = {};
7650 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
7651 pc_ci.pNext = NULL;
7652 pc_ci.initialSize = 0;
7653 pc_ci.initialData = 0;
7654 pc_ci.maxSize = 0;
7655
7656 VkPipeline pipeline;
7657 VkPipelineCache pipelineCache;
7658
Karl Schultz6addd812016-02-02 17:17:23 -07007659 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL,
7660&pipelineCache);
Tobin Ehlis912df022015-09-17 08:46:18 -06007661 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07007662 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1,
7663&gp_ci, NULL, &pipeline);
Tobin Ehlis912df022015-09-17 08:46:18 -06007664
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007665 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06007666
Chia-I Wuf7458c52015-10-26 21:10:41 +08007667 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7668 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7669 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7670 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis912df022015-09-17 08:46:18 -06007671}
7672*/
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007673
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007674TEST_F(VkLayerTest, PSOViewportScissorCountTests) {
Karl Schultz6addd812016-02-02 17:17:23 -07007675 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007676
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007677 TEST_DESCRIPTION("Test various cases of viewport and scissor count validation");
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007678
Tobin Ehlise68360f2015-10-01 11:15:13 -06007679 ASSERT_NO_FATAL_FAILURE(InitState());
7680 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007681
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007682 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007683 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7684 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007685
7686 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007687 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7688 ds_pool_ci.maxSets = 1;
7689 ds_pool_ci.poolSizeCount = 1;
7690 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007691
7692 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007693 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007694 ASSERT_VK_SUCCESS(err);
7695
7696 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007697 dsl_binding.binding = 0;
7698 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7699 dsl_binding.descriptorCount = 1;
7700 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007701
7702 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007703 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7704 ds_layout_ci.bindingCount = 1;
7705 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007706
7707 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007708 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007709 ASSERT_VK_SUCCESS(err);
7710
7711 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007712 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007713 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007714 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007715 alloc_info.descriptorPool = ds_pool;
7716 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007717 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007718 ASSERT_VK_SUCCESS(err);
7719
7720 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007721 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7722 pipeline_layout_ci.setLayoutCount = 1;
7723 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007724
7725 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007726 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007727 ASSERT_VK_SUCCESS(err);
7728
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007729 VkViewport vp = {};
Tobin Ehlise68360f2015-10-01 11:15:13 -06007730 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007731 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
Mark Lobodzinski510aa5c2016-12-19 07:59:10 -07007732 vp_state_ci.scissorCount = 1;
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007733 vp_state_ci.viewportCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -07007734 vp_state_ci.pViewports = &vp;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007735
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007736 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7737 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7738 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7739 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7740 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7741 rs_state_ci.depthClampEnable = VK_FALSE;
7742 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7743 rs_state_ci.depthBiasEnable = VK_FALSE;
7744
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007745 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7746 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7747 vi_ci.pNext = nullptr;
7748 vi_ci.vertexBindingDescriptionCount = 0;
7749 vi_ci.pVertexBindingDescriptions = nullptr;
7750 vi_ci.vertexAttributeDescriptionCount = 0;
7751 vi_ci.pVertexAttributeDescriptions = nullptr;
7752
7753 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7754 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7755 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7756
7757 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7758 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7759 pipe_ms_state_ci.pNext = NULL;
7760 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
7761 pipe_ms_state_ci.sampleShadingEnable = 0;
7762 pipe_ms_state_ci.minSampleShading = 1.0;
7763 pipe_ms_state_ci.pSampleMask = NULL;
7764
Cody Northropeb3a6c12015-10-05 14:44:45 -06007765 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007766 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007767
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007768 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007769 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chia-I Wu28e06912015-10-31 00:31:16 +08007770 shaderStages[0] = vs.GetStageCreateInfo();
7771 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007772
7773 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007774 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7775 gp_ci.stageCount = 2;
7776 gp_ci.pStages = shaderStages;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007777 gp_ci.pVertexInputState = &vi_ci;
7778 gp_ci.pInputAssemblyState = &ia_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007779 gp_ci.pViewportState = &vp_state_ci;
Mark Lobodzinski61dddf92016-12-16 14:54:59 -07007780 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007781 gp_ci.pRasterizationState = &rs_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007782 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7783 gp_ci.layout = pipeline_layout;
7784 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007785
7786 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007787 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007788
7789 VkPipeline pipeline;
7790 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007791 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007792 ASSERT_VK_SUCCESS(err);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007793
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007794 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007795 printf(" MultiViewport feature is disabled -- skipping enabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007796
7797 // Check case where multiViewport is disabled and viewport count is not 1
7798 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7799 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01430);
7800 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01431);
7801 vp_state_ci.scissorCount = 0;
7802 vp_state_ci.viewportCount = 0;
7803 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7804 m_errorMonitor->VerifyFound();
7805 } else {
7806 if (m_device->props.limits.maxViewports == 1) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007807 printf(" Device limit maxViewports is 1, skipping tests that require higher limits.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007808 } else {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007809 printf(" MultiViewport feature is enabled -- skipping disabled-state checks.\n");
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007810
7811 // Check is that viewportcount and scissorcount match
7812 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01434);
7813 vp_state_ci.scissorCount = 1;
7814 vp_state_ci.viewportCount = m_device->props.limits.maxViewports;
7815 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7816 m_errorMonitor->VerifyFound();
7817
Mark Lobodzinskif0eab4a2016-12-19 08:43:21 -07007818 // Check case where multiViewport is enabled and viewport count is greater than max
7819 // We check scissor/viewport simultaneously since separating them would trigger the mismatch error, 1434.
7820 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01432);
7821 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01433);
7822 vp_state_ci.scissorCount = m_device->props.limits.maxViewports + 1;
7823 vp_state_ci.viewportCount = m_device->props.limits.maxViewports + 1;
7824 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
7825 m_errorMonitor->VerifyFound();
7826 }
7827 }
Tobin Ehlise68360f2015-10-01 11:15:13 -06007828
Chia-I Wuf7458c52015-10-26 21:10:41 +08007829 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7830 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7831 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7832 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007833}
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007834
7835// 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
7836// set dynamically.
Karl Schultz6addd812016-02-02 17:17:23 -07007837TEST_F(VkLayerTest, PSOViewportStateNotSet) {
Karl Schultz6addd812016-02-02 17:17:23 -07007838 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007839
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007840 TEST_DESCRIPTION("Create a graphics pipeline with rasterization enabled but no viewport state.");
7841
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007842 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02113);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007843
Tobin Ehlise68360f2015-10-01 11:15:13 -06007844 ASSERT_NO_FATAL_FAILURE(InitState());
7845 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007846
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007847 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007848 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7849 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007850
7851 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007852 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7853 ds_pool_ci.maxSets = 1;
7854 ds_pool_ci.poolSizeCount = 1;
7855 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007856
7857 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007858 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007859 ASSERT_VK_SUCCESS(err);
7860
7861 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007862 dsl_binding.binding = 0;
7863 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7864 dsl_binding.descriptorCount = 1;
7865 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007866
7867 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007868 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
7869 ds_layout_ci.bindingCount = 1;
7870 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007871
7872 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007873 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007874 ASSERT_VK_SUCCESS(err);
7875
7876 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08007877 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08007878 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07007879 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06007880 alloc_info.descriptorPool = ds_pool;
7881 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007882 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007883 ASSERT_VK_SUCCESS(err);
7884
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007885 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
7886 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
7887 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
7888
7889 VkPipelineVertexInputStateCreateInfo vi_ci = {};
7890 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
7891 vi_ci.pNext = nullptr;
7892 vi_ci.vertexBindingDescriptionCount = 0;
7893 vi_ci.pVertexBindingDescriptions = nullptr;
7894 vi_ci.vertexAttributeDescriptionCount = 0;
7895 vi_ci.pVertexAttributeDescriptions = nullptr;
7896
7897 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
7898 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
7899 pipe_ms_state_ci.pNext = NULL;
7900 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
7901 pipe_ms_state_ci.sampleShadingEnable = 0;
7902 pipe_ms_state_ci.minSampleShading = 1.0;
7903 pipe_ms_state_ci.pSampleMask = NULL;
7904
Tobin Ehlise68360f2015-10-01 11:15:13 -06007905 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007906 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
7907 pipeline_layout_ci.setLayoutCount = 1;
7908 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007909
7910 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007911 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007912 ASSERT_VK_SUCCESS(err);
7913
7914 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
7915 // Set scissor as dynamic to avoid second error
7916 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007917 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
7918 dyn_state_ci.dynamicStateCount = 1;
7919 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007920
Cody Northropeb3a6c12015-10-05 14:44:45 -06007921 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07007922 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06007923
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007924 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007925 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
7926 // 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 +08007927 shaderStages[0] = vs.GetStageCreateInfo();
7928 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007929
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007930 VkPipelineRasterizationStateCreateInfo rs_state_ci = {};
7931 rs_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
7932 rs_state_ci.polygonMode = VK_POLYGON_MODE_FILL;
7933 rs_state_ci.cullMode = VK_CULL_MODE_BACK_BIT;
7934 rs_state_ci.frontFace = VK_FRONT_FACE_COUNTER_CLOCKWISE;
7935 rs_state_ci.depthClampEnable = VK_FALSE;
7936 rs_state_ci.rasterizerDiscardEnable = VK_FALSE;
7937 rs_state_ci.depthBiasEnable = VK_FALSE;
7938
Tobin Ehlise68360f2015-10-01 11:15:13 -06007939 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007940 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
7941 gp_ci.stageCount = 2;
7942 gp_ci.pStages = shaderStages;
Karl Schultzdfdb8d42016-03-08 10:30:21 -07007943 gp_ci.pRasterizationState = &rs_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007944 // Not setting VP state w/o dynamic vp state should cause validation error
7945 gp_ci.pViewportState = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -07007946 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski9d5eda22016-12-16 14:30:01 -07007947 gp_ci.pVertexInputState = &vi_ci;
7948 gp_ci.pInputAssemblyState = &ia_ci;
7949 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07007950 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
7951 gp_ci.layout = pipeline_layout;
7952 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007953
7954 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007955 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007956
7957 VkPipeline pipeline;
7958 VkPipelineCache pipelineCache;
7959
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007960 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007961 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007962 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007963
Chris Forbes8f36a8a2016-04-07 13:21:07 +12007964 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06007965
Chia-I Wuf7458c52015-10-26 21:10:41 +08007966 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
7967 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
7968 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
7969 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06007970}
Mark Lobodzinski73169e22016-12-16 14:01:17 -07007971
7972// Create PSO w/o non-zero viewportCount but no viewport data, then run second test where dynamic scissor count doesn't match PSO
7973// scissor count
Karl Schultz6addd812016-02-02 17:17:23 -07007974TEST_F(VkLayerTest, PSOViewportCountWithoutDataAndDynScissorMismatch) {
7975 VkResult err;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007976
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07007977 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02110);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06007978
Tobin Ehlise68360f2015-10-01 11:15:13 -06007979 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007980
7981 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07007982 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12007983 return;
7984 }
7985
Tobin Ehlise68360f2015-10-01 11:15:13 -06007986 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlise68360f2015-10-01 11:15:13 -06007987
Chia-I Wu1b99bb22015-10-27 19:25:11 +08007988 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007989 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
7990 ds_type_count.descriptorCount = 1;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007991
7992 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07007993 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
7994 ds_pool_ci.maxSets = 1;
7995 ds_pool_ci.poolSizeCount = 1;
7996 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlise68360f2015-10-01 11:15:13 -06007997
7998 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06007999 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008000 ASSERT_VK_SUCCESS(err);
8001
8002 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008003 dsl_binding.binding = 0;
8004 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8005 dsl_binding.descriptorCount = 1;
8006 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008007
8008 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008009 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8010 ds_layout_ci.bindingCount = 1;
8011 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008012
8013 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008014 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008015 ASSERT_VK_SUCCESS(err);
8016
8017 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008018 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +08008019 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -07008020 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -06008021 alloc_info.descriptorPool = ds_pool;
8022 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008023 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008024 ASSERT_VK_SUCCESS(err);
8025
8026 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008027 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8028 pipeline_layout_ci.setLayoutCount = 1;
8029 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008030
8031 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008032 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008033 ASSERT_VK_SUCCESS(err);
8034
8035 VkPipelineViewportStateCreateInfo vp_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008036 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8037 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008038 vp_state_ci.pViewports = NULL; // Null vp w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008039 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008040 vp_state_ci.pScissors = NULL; // Scissor is dynamic (below) so this won't cause error
Tobin Ehlise68360f2015-10-01 11:15:13 -06008041
8042 VkDynamicState sc_state = VK_DYNAMIC_STATE_SCISSOR;
8043 // Set scissor as dynamic to avoid that error
8044 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008045 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8046 dyn_state_ci.dynamicStateCount = 1;
8047 dyn_state_ci.pDynamicStates = &sc_state;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008048
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008049 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8050 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8051 pipe_ms_state_ci.pNext = NULL;
8052 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8053 pipe_ms_state_ci.sampleShadingEnable = 0;
8054 pipe_ms_state_ci.minSampleShading = 1.0;
8055 pipe_ms_state_ci.pSampleMask = NULL;
8056
Cody Northropeb3a6c12015-10-05 14:44:45 -06008057 VkPipelineShaderStageCreateInfo shaderStages[2];
Karl Schultz6addd812016-02-02 17:17:23 -07008058 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
Tobin Ehlise68360f2015-10-01 11:15:13 -06008059
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008060 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008061 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8062 // 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 +08008063 shaderStages[0] = vs.GetStageCreateInfo();
8064 shaderStages[1] = fs.GetStageCreateInfo();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008065
Cody Northropf6622dc2015-10-06 10:33:21 -06008066 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8067 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8068 vi_ci.pNext = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008069 vi_ci.vertexBindingDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008070 vi_ci.pVertexBindingDescriptions = nullptr;
Chia-I Wud50a7d72015-10-26 20:48:51 +08008071 vi_ci.vertexAttributeDescriptionCount = 0;
Cody Northropf6622dc2015-10-06 10:33:21 -06008072 vi_ci.pVertexAttributeDescriptions = nullptr;
8073
8074 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8075 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8076 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8077
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008078 VkPipelineRasterizationStateCreateInfo rs_ci = {};
Chia-I Wu1b99bb22015-10-27 19:25:11 +08008079 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008080 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Cody Northropf6622dc2015-10-06 10:33:21 -06008081 rs_ci.pNext = nullptr;
8082
Mark Youngc89c6312016-03-31 16:03:20 -06008083 VkPipelineColorBlendAttachmentState att = {};
8084 att.blendEnable = VK_FALSE;
8085 att.colorWriteMask = 0xf;
8086
Cody Northropf6622dc2015-10-06 10:33:21 -06008087 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8088 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8089 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008090 cb_ci.attachmentCount = 1;
8091 cb_ci.pAttachments = &att;
Cody Northropf6622dc2015-10-06 10:33:21 -06008092
Tobin Ehlise68360f2015-10-01 11:15:13 -06008093 VkGraphicsPipelineCreateInfo gp_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008094 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8095 gp_ci.stageCount = 2;
8096 gp_ci.pStages = shaderStages;
8097 gp_ci.pVertexInputState = &vi_ci;
8098 gp_ci.pInputAssemblyState = &ia_ci;
8099 gp_ci.pViewportState = &vp_state_ci;
8100 gp_ci.pRasterizationState = &rs_ci;
8101 gp_ci.pColorBlendState = &cb_ci;
8102 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski73169e22016-12-16 14:01:17 -07008103 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008104 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8105 gp_ci.layout = pipeline_layout;
8106 gp_ci.renderPass = renderPass();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008107
8108 VkPipelineCacheCreateInfo pc_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -07008109 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
Tobin Ehlise68360f2015-10-01 11:15:13 -06008110
8111 VkPipeline pipeline;
8112 VkPipelineCache pipelineCache;
8113
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008114 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008115 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008116 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008117
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008118 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008119
Tobin Ehlisd332f282015-10-02 11:00:56 -06008120 // Now hit second fail case where we set scissor w/ different count than PSO
Karl Schultz6addd812016-02-02 17:17:23 -07008121 // First need to successfully create the PSO from above by setting
8122 // pViewports
Mike Weiblen95dd0f92016-10-19 12:28:27 -06008123 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 -07008124
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008125 VkViewport vp = {}; // Just need dummy vp to point to
Karl Schultz6addd812016-02-02 17:17:23 -07008126 vp_state_ci.pViewports = &vp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008127 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008128 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008129 m_commandBuffer->BeginCommandBuffer();
8130 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008131 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008132 VkRect2D scissors[1] = {}; // don't care about data
Karl Schultz6addd812016-02-02 17:17:23 -07008133 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008134 vkCmdSetScissor(m_commandBuffer->GetBufferHandle(), 1, 1, scissors);
Karl Schultz6addd812016-02-02 17:17:23 -07008135 Draw(1, 0, 0, 0);
8136
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008137 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008138
8139 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8140 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8141 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8142 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008143 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Karl Schultz6addd812016-02-02 17:17:23 -07008144}
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008145
8146// 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 -07008147// viewportCount
8148TEST_F(VkLayerTest, PSOScissorCountWithoutDataAndDynViewportMismatch) {
8149 VkResult err;
8150
Mark Lobodzinskid04c7862016-12-16 13:17:49 -07008151 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02111);
Karl Schultz6addd812016-02-02 17:17:23 -07008152
8153 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008154
8155 if (!m_device->phy().features().multiViewport) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07008156 printf(" Device does not support multiple viewports/scissors; skipped.\n");
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008157 return;
8158 }
8159
Karl Schultz6addd812016-02-02 17:17:23 -07008160 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8161
8162 VkDescriptorPoolSize ds_type_count = {};
8163 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8164 ds_type_count.descriptorCount = 1;
8165
8166 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8167 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8168 ds_pool_ci.maxSets = 1;
8169 ds_pool_ci.poolSizeCount = 1;
8170 ds_pool_ci.pPoolSizes = &ds_type_count;
8171
8172 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008173 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Karl Schultz6addd812016-02-02 17:17:23 -07008174 ASSERT_VK_SUCCESS(err);
8175
8176 VkDescriptorSetLayoutBinding dsl_binding = {};
8177 dsl_binding.binding = 0;
8178 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8179 dsl_binding.descriptorCount = 1;
8180 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8181
8182 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8183 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8184 ds_layout_ci.bindingCount = 1;
8185 ds_layout_ci.pBindings = &dsl_binding;
8186
8187 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008188 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008189 ASSERT_VK_SUCCESS(err);
8190
8191 VkDescriptorSet descriptorSet;
8192 VkDescriptorSetAllocateInfo alloc_info = {};
8193 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8194 alloc_info.descriptorSetCount = 1;
8195 alloc_info.descriptorPool = ds_pool;
8196 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008197 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Karl Schultz6addd812016-02-02 17:17:23 -07008198 ASSERT_VK_SUCCESS(err);
8199
8200 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8201 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8202 pipeline_layout_ci.setLayoutCount = 1;
8203 pipeline_layout_ci.pSetLayouts = &ds_layout;
8204
8205 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008206 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Karl Schultz6addd812016-02-02 17:17:23 -07008207 ASSERT_VK_SUCCESS(err);
8208
8209 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8210 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8211 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008212 vp_state_ci.pScissors = NULL; // Null scissor w/ count of 1 should cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008213 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008214 vp_state_ci.pViewports = NULL; // vp is dynamic (below) so this won't cause error
Karl Schultz6addd812016-02-02 17:17:23 -07008215
8216 VkDynamicState vp_state = VK_DYNAMIC_STATE_VIEWPORT;
8217 // Set scissor as dynamic to avoid that error
8218 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8219 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8220 dyn_state_ci.dynamicStateCount = 1;
8221 dyn_state_ci.pDynamicStates = &vp_state;
8222
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008223 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
8224 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
8225 pipe_ms_state_ci.pNext = NULL;
8226 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
8227 pipe_ms_state_ci.sampleShadingEnable = 0;
8228 pipe_ms_state_ci.minSampleShading = 1.0;
8229 pipe_ms_state_ci.pSampleMask = NULL;
8230
Karl Schultz6addd812016-02-02 17:17:23 -07008231 VkPipelineShaderStageCreateInfo shaderStages[2];
8232 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8233
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008234 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008235 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
8236 // 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 -07008237 shaderStages[0] = vs.GetStageCreateInfo();
8238 shaderStages[1] = fs.GetStageCreateInfo();
8239
8240 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8241 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8242 vi_ci.pNext = nullptr;
8243 vi_ci.vertexBindingDescriptionCount = 0;
8244 vi_ci.pVertexBindingDescriptions = nullptr;
8245 vi_ci.vertexAttributeDescriptionCount = 0;
8246 vi_ci.pVertexAttributeDescriptions = nullptr;
8247
8248 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8249 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8250 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8251
8252 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8253 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008254 rs_ci.lineWidth = m_device->props.limits.lineWidthRange[0];
Karl Schultz6addd812016-02-02 17:17:23 -07008255 rs_ci.pNext = nullptr;
8256
Mark Youngc89c6312016-03-31 16:03:20 -06008257 VkPipelineColorBlendAttachmentState att = {};
8258 att.blendEnable = VK_FALSE;
8259 att.colorWriteMask = 0xf;
8260
Karl Schultz6addd812016-02-02 17:17:23 -07008261 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8262 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8263 cb_ci.pNext = nullptr;
Mark Youngc89c6312016-03-31 16:03:20 -06008264 cb_ci.attachmentCount = 1;
8265 cb_ci.pAttachments = &att;
Karl Schultz6addd812016-02-02 17:17:23 -07008266
8267 VkGraphicsPipelineCreateInfo gp_ci = {};
8268 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8269 gp_ci.stageCount = 2;
8270 gp_ci.pStages = shaderStages;
8271 gp_ci.pVertexInputState = &vi_ci;
8272 gp_ci.pInputAssemblyState = &ia_ci;
8273 gp_ci.pViewportState = &vp_state_ci;
8274 gp_ci.pRasterizationState = &rs_ci;
8275 gp_ci.pColorBlendState = &cb_ci;
8276 gp_ci.pDynamicState = &dyn_state_ci;
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008277 gp_ci.pMultisampleState = &pipe_ms_state_ci;
Karl Schultz6addd812016-02-02 17:17:23 -07008278 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8279 gp_ci.layout = pipeline_layout;
8280 gp_ci.renderPass = renderPass();
8281
8282 VkPipelineCacheCreateInfo pc_ci = {};
8283 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8284
8285 VkPipeline pipeline;
8286 VkPipelineCache pipelineCache;
8287
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008288 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Karl Schultz6addd812016-02-02 17:17:23 -07008289 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008290 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Karl Schultz6addd812016-02-02 17:17:23 -07008291
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008292 m_errorMonitor->VerifyFound();
Karl Schultz6addd812016-02-02 17:17:23 -07008293
8294 // Now hit second fail case where we set scissor w/ different count than PSO
8295 // First need to successfully create the PSO from above by setting
8296 // pViewports
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008297 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8298 "Dynamic viewport(s) 0 are used by pipeline state object, ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008299
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008300 VkRect2D sc = {}; // Just need dummy vp to point to
Tobin Ehlisd332f282015-10-02 11:00:56 -06008301 vp_state_ci.pScissors = &sc;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008302 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008303 ASSERT_VK_SUCCESS(err);
Tony Barbour552f6c02016-12-21 14:34:07 -07008304 m_commandBuffer->BeginCommandBuffer();
8305 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008306 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Lobodzinski96647ab2016-12-16 14:21:04 -07008307 VkViewport viewports[1] = {};
8308 viewports[0].width = 8;
8309 viewports[0].height = 8;
Tobin Ehlisd332f282015-10-02 11:00:56 -06008310 // Count of 2 doesn't match PSO count of 1
Chris Forbesc08a6ca2016-07-28 14:14:07 +12008311 vkCmdSetViewport(m_commandBuffer->GetBufferHandle(), 1, 1, viewports);
Tobin Ehlisd332f282015-10-02 11:00:56 -06008312 Draw(1, 0, 0, 0);
8313
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008314 m_errorMonitor->VerifyFound();
Tobin Ehlise68360f2015-10-01 11:15:13 -06008315
Chia-I Wuf7458c52015-10-26 21:10:41 +08008316 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8317 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8318 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8319 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008320 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Tobin Ehlise68360f2015-10-01 11:15:13 -06008321}
8322
Mark Young7394fdd2016-03-31 14:56:43 -06008323TEST_F(VkLayerTest, PSOLineWidthInvalid) {
8324 VkResult err;
8325
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008326 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008327
8328 ASSERT_NO_FATAL_FAILURE(InitState());
8329 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8330
8331 VkDescriptorPoolSize ds_type_count = {};
8332 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8333 ds_type_count.descriptorCount = 1;
8334
8335 VkDescriptorPoolCreateInfo ds_pool_ci = {};
8336 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
8337 ds_pool_ci.maxSets = 1;
8338 ds_pool_ci.poolSizeCount = 1;
8339 ds_pool_ci.pPoolSizes = &ds_type_count;
8340
8341 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008342 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Young7394fdd2016-03-31 14:56:43 -06008343 ASSERT_VK_SUCCESS(err);
8344
8345 VkDescriptorSetLayoutBinding dsl_binding = {};
8346 dsl_binding.binding = 0;
8347 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
8348 dsl_binding.descriptorCount = 1;
8349 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
8350
8351 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
8352 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
8353 ds_layout_ci.bindingCount = 1;
8354 ds_layout_ci.pBindings = &dsl_binding;
8355
8356 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008357 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008358 ASSERT_VK_SUCCESS(err);
8359
8360 VkDescriptorSet descriptorSet;
8361 VkDescriptorSetAllocateInfo alloc_info = {};
8362 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
8363 alloc_info.descriptorSetCount = 1;
8364 alloc_info.descriptorPool = ds_pool;
8365 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008366 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Young7394fdd2016-03-31 14:56:43 -06008367 ASSERT_VK_SUCCESS(err);
8368
8369 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
8370 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
8371 pipeline_layout_ci.setLayoutCount = 1;
8372 pipeline_layout_ci.pSetLayouts = &ds_layout;
8373
8374 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008375 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Young7394fdd2016-03-31 14:56:43 -06008376 ASSERT_VK_SUCCESS(err);
8377
8378 VkPipelineViewportStateCreateInfo vp_state_ci = {};
8379 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
8380 vp_state_ci.scissorCount = 1;
8381 vp_state_ci.pScissors = NULL;
8382 vp_state_ci.viewportCount = 1;
8383 vp_state_ci.pViewports = NULL;
8384
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008385 VkDynamicState dynamic_states[3] = {VK_DYNAMIC_STATE_VIEWPORT, VK_DYNAMIC_STATE_SCISSOR, VK_DYNAMIC_STATE_LINE_WIDTH};
Mark Young7394fdd2016-03-31 14:56:43 -06008386 // Set scissor as dynamic to avoid that error
8387 VkPipelineDynamicStateCreateInfo dyn_state_ci = {};
8388 dyn_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
8389 dyn_state_ci.dynamicStateCount = 2;
8390 dyn_state_ci.pDynamicStates = dynamic_states;
8391
8392 VkPipelineShaderStageCreateInfo shaderStages[2];
8393 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
8394
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008395 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
8396 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008397 this); // TODO - We shouldn't need a fragment shader
8398 // but add it to be able to run on more devices
Mark Young7394fdd2016-03-31 14:56:43 -06008399 shaderStages[0] = vs.GetStageCreateInfo();
8400 shaderStages[1] = fs.GetStageCreateInfo();
8401
8402 VkPipelineVertexInputStateCreateInfo vi_ci = {};
8403 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
8404 vi_ci.pNext = nullptr;
8405 vi_ci.vertexBindingDescriptionCount = 0;
8406 vi_ci.pVertexBindingDescriptions = nullptr;
8407 vi_ci.vertexAttributeDescriptionCount = 0;
8408 vi_ci.pVertexAttributeDescriptions = nullptr;
8409
8410 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
8411 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
8412 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
8413
8414 VkPipelineRasterizationStateCreateInfo rs_ci = {};
8415 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
8416 rs_ci.pNext = nullptr;
Rene Lindsay144e4842017-01-20 14:27:15 -07008417 rs_ci.rasterizerDiscardEnable = VK_TRUE;
Mark Young7394fdd2016-03-31 14:56:43 -06008418
Mark Young47107952016-05-02 15:59:55 -06008419 // Check too low (line width of -1.0f).
8420 rs_ci.lineWidth = -1.0f;
Mark Young7394fdd2016-03-31 14:56:43 -06008421
8422 VkPipelineColorBlendAttachmentState att = {};
8423 att.blendEnable = VK_FALSE;
8424 att.colorWriteMask = 0xf;
8425
8426 VkPipelineColorBlendStateCreateInfo cb_ci = {};
8427 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
8428 cb_ci.pNext = nullptr;
8429 cb_ci.attachmentCount = 1;
8430 cb_ci.pAttachments = &att;
8431
8432 VkGraphicsPipelineCreateInfo gp_ci = {};
8433 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
8434 gp_ci.stageCount = 2;
8435 gp_ci.pStages = shaderStages;
8436 gp_ci.pVertexInputState = &vi_ci;
8437 gp_ci.pInputAssemblyState = &ia_ci;
8438 gp_ci.pViewportState = &vp_state_ci;
8439 gp_ci.pRasterizationState = &rs_ci;
8440 gp_ci.pColorBlendState = &cb_ci;
8441 gp_ci.pDynamicState = &dyn_state_ci;
8442 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
8443 gp_ci.layout = pipeline_layout;
8444 gp_ci.renderPass = renderPass();
8445
8446 VkPipelineCacheCreateInfo pc_ci = {};
8447 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
8448
8449 VkPipeline pipeline;
8450 VkPipelineCache pipelineCache;
8451
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008452 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008453 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008454 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008455
8456 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008457 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008458
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008459 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008460
8461 // Check too high (line width of 65536.0f).
8462 rs_ci.lineWidth = 65536.0f;
8463
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008464 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008465 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008466 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008467
8468 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -06008469 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008470
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008471 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to -1");
Mark Young7394fdd2016-03-31 14:56:43 -06008472
8473 dyn_state_ci.dynamicStateCount = 3;
8474
8475 rs_ci.lineWidth = 1.0f;
8476
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008477 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Mark Young7394fdd2016-03-31 14:56:43 -06008478 ASSERT_VK_SUCCESS(err);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008479 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tony Barbour552f6c02016-12-21 14:34:07 -07008480 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008481 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline);
Mark Young7394fdd2016-03-31 14:56:43 -06008482
8483 // Check too low with dynamic setting.
Mark Young47107952016-05-02 15:59:55 -06008484 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), -1.0f);
Mark Young7394fdd2016-03-31 14:56:43 -06008485 m_errorMonitor->VerifyFound();
8486
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008487 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attempt to set lineWidth to 65536");
Mark Young7394fdd2016-03-31 14:56:43 -06008488
8489 // Check too high with dynamic setting.
8490 vkCmdSetLineWidth(m_commandBuffer->GetBufferHandle(), 65536.0f);
8491 m_errorMonitor->VerifyFound();
Tony Barbour552f6c02016-12-21 14:34:07 -07008492 m_commandBuffer->EndCommandBuffer();
Mark Young7394fdd2016-03-31 14:56:43 -06008493
8494 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
8495 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
8496 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
8497 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06008498 vkDestroyPipeline(m_device->device(), pipeline, NULL);
Mark Young7394fdd2016-03-31 14:56:43 -06008499}
8500
Karl Schultz6addd812016-02-02 17:17:23 -07008501TEST_F(VkLayerTest, NullRenderPass) {
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008502 // Bind a NULL RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008503 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Schuchardt0b1f2f82016-12-28 15:11:20 -07008504 "vkCmdBeginRenderPass: required parameter pRenderPassBegin specified as NULL");
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008505
8506 ASSERT_NO_FATAL_FAILURE(InitState());
8507 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008508
Tony Barbour552f6c02016-12-21 14:34:07 -07008509 m_commandBuffer->BeginCommandBuffer();
Karl Schultz6addd812016-02-02 17:17:23 -07008510 // Don't care about RenderPass handle b/c error should be flagged before
8511 // that
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008512 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), NULL, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008513
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008514 m_errorMonitor->VerifyFound();
Tobin Ehlis98aa0ed2015-06-25 16:27:19 -06008515}
8516
Karl Schultz6addd812016-02-02 17:17:23 -07008517TEST_F(VkLayerTest, RenderPassWithinRenderPass) {
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008518 // Bind a BeginRenderPass within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008519 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8520 "It is invalid to issue this call inside an active render pass");
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008521
8522 ASSERT_NO_FATAL_FAILURE(InitState());
8523 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008524
Tony Barbour552f6c02016-12-21 14:34:07 -07008525 m_commandBuffer->BeginCommandBuffer();
8526 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Karl Schultz6addd812016-02-02 17:17:23 -07008527 // Just create a dummy Renderpass that's non-NULL so we can get to the
8528 // proper error
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008529 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlisaf1f3a42015-06-25 15:46:59 -06008530
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008531 m_errorMonitor->VerifyFound();
Tobin Ehlis49eb23d2015-05-22 12:38:55 -06008532}
8533
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008534TEST_F(VkLayerTest, RenderPassClearOpMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008535 TEST_DESCRIPTION(
8536 "Begin a renderPass where clearValueCount is less than"
8537 "the number of renderPass attachments that use loadOp"
8538 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008539
8540 ASSERT_NO_FATAL_FAILURE(InitState());
8541 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8542
8543 // Create a renderPass with a single attachment that uses loadOp CLEAR
8544 VkAttachmentReference attach = {};
8545 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8546 VkSubpassDescription subpass = {};
8547 subpass.inputAttachmentCount = 1;
8548 subpass.pInputAttachments = &attach;
8549 VkRenderPassCreateInfo rpci = {};
8550 rpci.subpassCount = 1;
8551 rpci.pSubpasses = &subpass;
8552 rpci.attachmentCount = 1;
8553 VkAttachmentDescription attach_desc = {};
Rene Lindsay4bf0e4c2017-01-31 14:20:34 -07008554 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008555 // Set loadOp to CLEAR
8556 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8557 rpci.pAttachments = &attach_desc;
8558 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8559 VkRenderPass rp;
8560 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8561
8562 VkCommandBufferInheritanceInfo hinfo = {};
8563 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
8564 hinfo.renderPass = VK_NULL_HANDLE;
8565 hinfo.subpass = 0;
8566 hinfo.framebuffer = VK_NULL_HANDLE;
8567 hinfo.occlusionQueryEnable = VK_FALSE;
8568 hinfo.queryFlags = 0;
8569 hinfo.pipelineStatistics = 0;
8570 VkCommandBufferBeginInfo info = {};
8571 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8572 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8573 info.pInheritanceInfo = &hinfo;
8574
8575 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8576 VkRenderPassBeginInfo rp_begin = {};
8577 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8578 rp_begin.pNext = NULL;
8579 rp_begin.renderPass = renderPass();
8580 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008581 rp_begin.clearValueCount = 0; // Should be 1
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008582
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07008583 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00442);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008584
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008585 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008586
8587 m_errorMonitor->VerifyFound();
Mark Lobodzinski5c70ebd2016-06-09 13:45:00 -06008588
8589 vkDestroyRenderPass(m_device->device(), rp, NULL);
Tobin Ehlis5a1c0332016-05-31 13:59:26 -06008590}
8591
Slawomir Cygan0808f392016-11-28 17:53:23 +01008592TEST_F(VkLayerTest, RenderPassClearOpTooManyValues) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008593 TEST_DESCRIPTION(
8594 "Begin a renderPass where clearValueCount is greater than"
8595 "the number of renderPass attachments that use loadOp"
8596 "VK_ATTACHMENT_LOAD_OP_CLEAR.");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008597
8598 ASSERT_NO_FATAL_FAILURE(InitState());
8599 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8600
8601 // Create a renderPass with a single attachment that uses loadOp CLEAR
8602 VkAttachmentReference attach = {};
8603 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
8604 VkSubpassDescription subpass = {};
8605 subpass.inputAttachmentCount = 1;
8606 subpass.pInputAttachments = &attach;
8607 VkRenderPassCreateInfo rpci = {};
8608 rpci.subpassCount = 1;
8609 rpci.pSubpasses = &subpass;
8610 rpci.attachmentCount = 1;
8611 VkAttachmentDescription attach_desc = {};
8612 attach_desc.format = VK_FORMAT_B8G8R8A8_UNORM;
8613 // Set loadOp to CLEAR
8614 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
8615 rpci.pAttachments = &attach_desc;
8616 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
8617 VkRenderPass rp;
8618 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
8619
8620 VkCommandBufferBeginInfo info = {};
8621 info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
8622 info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
8623
8624 vkBeginCommandBuffer(m_commandBuffer->handle(), &info);
8625 VkRenderPassBeginInfo rp_begin = {};
8626 rp_begin.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
8627 rp_begin.pNext = NULL;
8628 rp_begin.renderPass = renderPass();
8629 rp_begin.framebuffer = framebuffer();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008630 rp_begin.clearValueCount = 2; // Should be 1
Slawomir Cygan0808f392016-11-28 17:53:23 +01008631
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008632 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
8633 " has a clearValueCount of"
8634 " 2 but only first 1 entries in pClearValues array are used");
Slawomir Cygan0808f392016-11-28 17:53:23 +01008635
8636 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rp_begin, VK_SUBPASS_CONTENTS_INLINE);
8637
8638 m_errorMonitor->VerifyFound();
8639
8640 vkDestroyRenderPass(m_device->device(), rp, NULL);
8641}
8642
Cody Northrop3bb4d962016-05-09 16:15:57 -06008643TEST_F(VkLayerTest, EndCommandBufferWithinRenderPass) {
Cody Northrop3bb4d962016-05-09 16:15:57 -06008644 TEST_DESCRIPTION("End a command buffer with an active render pass");
8645
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008646 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8647 "It is invalid to issue this call inside an active render pass");
Cody Northrop3bb4d962016-05-09 16:15:57 -06008648
8649 ASSERT_NO_FATAL_FAILURE(InitState());
8650 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8651
Tony Barbour552f6c02016-12-21 14:34:07 -07008652 m_commandBuffer->BeginCommandBuffer();
8653 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
8654 vkEndCommandBuffer(m_commandBuffer->handle());
Cody Northrop3bb4d962016-05-09 16:15:57 -06008655
8656 m_errorMonitor->VerifyFound();
8657
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008658 // TODO: Add test for VK_COMMAND_BUFFER_LEVEL_SECONDARY
8659 // TODO: Add test for VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT
Cody Northrop3bb4d962016-05-09 16:15:57 -06008660}
8661
Karl Schultz6addd812016-02-02 17:17:23 -07008662TEST_F(VkLayerTest, FillBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008663 // Call CmdFillBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008664 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8665 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008666
8667 ASSERT_NO_FATAL_FAILURE(InitState());
8668 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008669
Tony Barbour552f6c02016-12-21 14:34:07 -07008670 m_commandBuffer->BeginCommandBuffer();
8671 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008672
8673 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008674 vk_testing::Buffer dstBuffer;
8675 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008676
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008677 m_commandBuffer->FillBuffer(dstBuffer.handle(), 0, 4, 0x11111111);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008678
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008679 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008680}
8681
Karl Schultz6addd812016-02-02 17:17:23 -07008682TEST_F(VkLayerTest, UpdateBufferWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008683 // Call CmdUpdateBuffer within an active renderpass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008684 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8685 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008686
8687 ASSERT_NO_FATAL_FAILURE(InitState());
8688 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008689
Tony Barbour552f6c02016-12-21 14:34:07 -07008690 m_commandBuffer->BeginCommandBuffer();
8691 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008692
8693 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008694 vk_testing::Buffer dstBuffer;
8695 dstBuffer.init_as_dst(*m_device, (VkDeviceSize)1024, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008696
Karl Schultz6addd812016-02-02 17:17:23 -07008697 VkDeviceSize dstOffset = 0;
Rene Lindsay32d26902017-02-02 16:49:24 -07008698 uint32_t Data[] = {1, 2, 3, 4, 5, 6, 7, 8};
8699 VkDeviceSize dataSize = sizeof(Data) / sizeof(uint32_t);
8700 vkCmdUpdateBuffer(m_commandBuffer->GetBufferHandle(), dstBuffer.handle(), dstOffset, dataSize, &Data);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008701
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008702 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008703}
8704
Karl Schultz6addd812016-02-02 17:17:23 -07008705TEST_F(VkLayerTest, ClearColorImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008706 // Call CmdClearColorImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008707 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8708 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008709
8710 ASSERT_NO_FATAL_FAILURE(InitState());
8711 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008712
Tony Barbour552f6c02016-12-21 14:34:07 -07008713 m_commandBuffer->BeginCommandBuffer();
8714 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008715
Michael Lentine0a369f62016-02-03 16:51:46 -06008716 VkClearColorValue clear_color;
8717 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
Karl Schultz6addd812016-02-02 17:17:23 -07008718 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8719 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
8720 const int32_t tex_width = 32;
8721 const int32_t tex_height = 32;
8722 VkImageCreateInfo image_create_info = {};
8723 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
8724 image_create_info.pNext = NULL;
8725 image_create_info.imageType = VK_IMAGE_TYPE_2D;
8726 image_create_info.format = tex_format;
8727 image_create_info.extent.width = tex_width;
8728 image_create_info.extent.height = tex_height;
8729 image_create_info.extent.depth = 1;
8730 image_create_info.mipLevels = 1;
8731 image_create_info.arrayLayers = 1;
8732 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
8733 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
8734 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008735
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008736 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008737 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008738
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008739 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008740
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07008741 m_errorMonitor->SetUnexpectedError("image must have been created with VK_IMAGE_USAGE_TRANSFER_DST_BIT usage flag");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008742 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1, &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008743
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008744 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008745}
8746
Karl Schultz6addd812016-02-02 17:17:23 -07008747TEST_F(VkLayerTest, ClearDepthStencilImageWithinRenderPass) {
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008748 // Call CmdClearDepthStencilImage within an active RenderPass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008749 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8750 "It is invalid to issue this call inside an active render pass");
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008751
8752 ASSERT_NO_FATAL_FAILURE(InitState());
8753 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008754
Tony Barbourf887b162017-03-09 10:06:46 -07008755 auto depth_format = find_depth_stencil_format(m_device);
8756 if (!depth_format) {
8757 printf(" No Depth + Stencil format found. Skipped.\n");
8758 return;
8759 }
8760
Tony Barbour552f6c02016-12-21 14:34:07 -07008761 m_commandBuffer->BeginCommandBuffer();
8762 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008763
8764 VkClearDepthStencilValue clear_value = {0};
Dustin Gravesa2e5c942016-02-11 18:28:06 -07008765 VkMemoryPropertyFlags reqs = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008766 VkImageCreateInfo image_create_info = vk_testing::Image::create_info();
8767 image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -07008768 image_create_info.format = depth_format;
Karl Schultz6addd812016-02-02 17:17:23 -07008769 image_create_info.extent.width = 64;
8770 image_create_info.extent.height = 64;
8771 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
8772 image_create_info.usage = VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008773
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008774 vk_testing::Image dstImage;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008775 dstImage.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008776
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008777 const VkImageSubresourceRange range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_DEPTH_BIT);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008778
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07008779 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), dstImage.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_value, 1,
8780 &range);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008781
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008782 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008783}
8784
Karl Schultz6addd812016-02-02 17:17:23 -07008785TEST_F(VkLayerTest, ClearColorAttachmentsOutsideRenderPass) {
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008786 // Call CmdClearAttachmentss outside of an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07008787 VkResult err;
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008788
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008789 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8790 "vkCmdClearAttachments(): This call "
8791 "must be issued inside an active "
8792 "render pass");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06008793
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008794 ASSERT_NO_FATAL_FAILURE(InitState());
8795 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008796
8797 // Start no RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +08008798 err = m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008799 ASSERT_VK_SUCCESS(err);
8800
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -06008801 VkClearAttachment color_attachment;
8802 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8803 color_attachment.clearValue.color.float32[0] = 0;
8804 color_attachment.clearValue.color.float32[1] = 0;
8805 color_attachment.clearValue.color.float32[2] = 0;
8806 color_attachment.clearValue.color.float32[3] = 0;
8807 color_attachment.colorAttachment = 0;
Karl Schultz6addd812016-02-02 17:17:23 -07008808 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008809 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008810
Chris Forbes8f36a8a2016-04-07 13:21:07 +12008811 m_errorMonitor->VerifyFound();
Mark Lobodzinskid5639502015-09-24 09:51:47 -06008812}
8813
Chris Forbes3b97e932016-09-07 11:29:24 +12008814TEST_F(VkLayerTest, RenderPassExcessiveNextSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008815 TEST_DESCRIPTION(
8816 "Test that an error is produced when CmdNextSubpass is "
8817 "called too many times in a renderpass instance");
Chris Forbes3b97e932016-09-07 11:29:24 +12008818
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008819 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8820 "vkCmdNextSubpass(): Attempted to advance "
8821 "beyond final subpass");
Chris Forbes3b97e932016-09-07 11:29:24 +12008822
8823 ASSERT_NO_FATAL_FAILURE(InitState());
8824 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8825
Tony Barbour552f6c02016-12-21 14:34:07 -07008826 m_commandBuffer->BeginCommandBuffer();
8827 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes3b97e932016-09-07 11:29:24 +12008828
8829 // error here.
8830 vkCmdNextSubpass(m_commandBuffer->GetBufferHandle(), VK_SUBPASS_CONTENTS_INLINE);
8831 m_errorMonitor->VerifyFound();
8832
Tony Barbour552f6c02016-12-21 14:34:07 -07008833 m_commandBuffer->EndRenderPass();
8834 m_commandBuffer->EndCommandBuffer();
Chris Forbes3b97e932016-09-07 11:29:24 +12008835}
8836
Chris Forbes6d624702016-09-07 13:57:05 +12008837TEST_F(VkLayerTest, RenderPassEndedBeforeFinalSubpass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008838 TEST_DESCRIPTION(
8839 "Test that an error is produced when CmdEndRenderPass is "
8840 "called before the final subpass has been reached");
Chris Forbes6d624702016-09-07 13:57:05 +12008841
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008842 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8843 "vkCmdEndRenderPass(): Called before reaching "
8844 "final subpass");
Chris Forbes6d624702016-09-07 13:57:05 +12008845
8846 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008847 VkSubpassDescription sd[2] = {{0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr},
8848 {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, nullptr, 0, nullptr}};
Chris Forbes6d624702016-09-07 13:57:05 +12008849
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008850 VkRenderPassCreateInfo rcpi = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 2, sd, 0, nullptr};
Chris Forbes6d624702016-09-07 13:57:05 +12008851
8852 VkRenderPass rp;
8853 VkResult err = vkCreateRenderPass(m_device->device(), &rcpi, nullptr, &rp);
8854 ASSERT_VK_SUCCESS(err);
8855
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008856 VkFramebufferCreateInfo fbci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 16, 16, 1};
Chris Forbes6d624702016-09-07 13:57:05 +12008857
8858 VkFramebuffer fb;
8859 err = vkCreateFramebuffer(m_device->device(), &fbci, nullptr, &fb);
8860 ASSERT_VK_SUCCESS(err);
8861
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008862 m_commandBuffer->BeginCommandBuffer(); // no implicit RP begin
Chris Forbes6d624702016-09-07 13:57:05 +12008863
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008864 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 +12008865
8866 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
8867
8868 // Error here.
8869 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
8870 m_errorMonitor->VerifyFound();
8871
8872 // Clean up.
8873 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
8874 vkDestroyRenderPass(m_device->device(), rp, nullptr);
8875}
8876
Karl Schultz9e66a292016-04-21 15:57:51 -06008877TEST_F(VkLayerTest, BufferMemoryBarrierNoBuffer) {
8878 // Try to add a buffer memory barrier with no buffer.
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008879 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8880 "required parameter pBufferMemoryBarriers[0].buffer specified as VK_NULL_HANDLE");
Karl Schultz9e66a292016-04-21 15:57:51 -06008881
8882 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbour552f6c02016-12-21 14:34:07 -07008883 m_commandBuffer->BeginCommandBuffer();
Karl Schultz9e66a292016-04-21 15:57:51 -06008884
8885 VkBufferMemoryBarrier buf_barrier = {};
8886 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8887 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8888 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8889 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8890 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8891 buf_barrier.buffer = VK_NULL_HANDLE;
8892 buf_barrier.offset = 0;
8893 buf_barrier.size = VK_WHOLE_SIZE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008894 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8895 nullptr, 1, &buf_barrier, 0, nullptr);
Karl Schultz9e66a292016-04-21 15:57:51 -06008896
8897 m_errorMonitor->VerifyFound();
8898}
8899
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008900TEST_F(VkLayerTest, InvalidBarriers) {
8901 TEST_DESCRIPTION("A variety of ways to get VK_INVALID_BARRIER ");
8902
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008903 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Barriers cannot be set during subpass");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008904
8905 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf887b162017-03-09 10:06:46 -07008906 auto depth_format = find_depth_stencil_format(m_device);
8907 if (!depth_format) {
8908 printf(" No Depth + Stencil format found. Skipped.\n");
8909 return;
8910 }
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008911 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
8912
8913 VkMemoryBarrier mem_barrier = {};
8914 mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER;
8915 mem_barrier.pNext = NULL;
8916 mem_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8917 mem_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
Tony Barbour552f6c02016-12-21 14:34:07 -07008918 m_commandBuffer->BeginCommandBuffer();
8919 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008920 // BeginCommandBuffer() starts a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008921 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 1,
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008922 &mem_barrier, 0, nullptr, 0, nullptr);
8923 m_errorMonitor->VerifyFound();
8924
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008925 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Image Layout cannot be transitioned to UNDEFINED");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008926 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008927 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 -06008928 ASSERT_TRUE(image.initialized());
8929 VkImageMemoryBarrier img_barrier = {};
8930 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
8931 img_barrier.pNext = NULL;
8932 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8933 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8934 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8935 // New layout can't be UNDEFINED
8936 img_barrier.newLayout = VK_IMAGE_LAYOUT_UNDEFINED;
8937 img_barrier.image = image.handle();
8938 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8939 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8940 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
8941 img_barrier.subresourceRange.baseArrayLayer = 0;
8942 img_barrier.subresourceRange.baseMipLevel = 0;
8943 img_barrier.subresourceRange.layerCount = 1;
8944 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008945 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8946 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008947 m_errorMonitor->VerifyFound();
8948 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
8949
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07008950 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
8951 "Subresource must have the sum of the "
8952 "baseArrayLayer");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008953 // baseArrayLayer + layerCount must be <= image's arrayLayers
8954 img_barrier.subresourceRange.baseArrayLayer = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008955 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8956 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008957 m_errorMonitor->VerifyFound();
8958 img_barrier.subresourceRange.baseArrayLayer = 0;
8959
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008960 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Subresource must have the sum of the baseMipLevel");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008961 // baseMipLevel + levelCount must be <= image's mipLevels
8962 img_barrier.subresourceRange.baseMipLevel = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008963 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8964 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008965 m_errorMonitor->VerifyFound();
8966 img_barrier.subresourceRange.baseMipLevel = 0;
8967
Mike Weiblen7053aa32017-01-25 15:21:10 -07008968 // levelCount must be non-zero.
8969 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
8970 img_barrier.subresourceRange.levelCount = 0;
8971 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8972 nullptr, 0, nullptr, 1, &img_barrier);
8973 m_errorMonitor->VerifyFound();
8974 img_barrier.subresourceRange.levelCount = 1;
8975
8976 // layerCount must be non-zero.
8977 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
8978 img_barrier.subresourceRange.layerCount = 0;
8979 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
8980 nullptr, 0, nullptr, 1, &img_barrier);
8981 m_errorMonitor->VerifyFound();
8982 img_barrier.subresourceRange.layerCount = 1;
8983
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008984 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 -06008985 vk_testing::Buffer buffer;
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07008986 VkMemoryPropertyFlags mem_reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
8987 buffer.init_as_src_and_dst(*m_device, 256, mem_reqs);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06008988 VkBufferMemoryBarrier buf_barrier = {};
8989 buf_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER;
8990 buf_barrier.pNext = NULL;
8991 buf_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
8992 buf_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
8993 buf_barrier.buffer = buffer.handle();
8994 buf_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8995 buf_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
8996 buf_barrier.offset = 0;
8997 buf_barrier.size = VK_WHOLE_SIZE;
8998 // Can't send buffer barrier during a render pass
Mark Lobodzinskice751c62016-09-08 10:45:35 -06008999 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9000 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009001 m_errorMonitor->VerifyFound();
9002 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
9003
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009004 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which is not less than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009005 buf_barrier.offset = 257;
9006 // Offset greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009007 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9008 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009009 m_errorMonitor->VerifyFound();
9010 buf_barrier.offset = 0;
9011
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009012 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "whose sum is greater than total size");
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009013 buf_barrier.size = 257;
9014 // Size greater than total size
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009015 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9016 nullptr, 1, &buf_barrier, 0, nullptr);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009017 m_errorMonitor->VerifyFound();
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009018
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009019 // Now exercise barrier aspect bit errors, first DS
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009020 m_errorMonitor->SetDesiredFailureMsg(
9021 VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -06009022 "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 -06009023 VkDepthStencilObj ds_image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -07009024 ds_image.Init(m_device, 128, 128, depth_format);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009025 ASSERT_TRUE(ds_image.initialized());
Tobin Ehlis15684a02016-07-21 14:55:26 -06009026 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
9027 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009028 img_barrier.image = ds_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009029
9030 // Not having DEPTH or STENCIL set is an error
Rene Lindsay4834cba2017-02-02 17:18:56 -07009031 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009032 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9033 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009034 m_errorMonitor->VerifyFound();
Dave Houltonfbf52152017-01-06 12:55:29 -07009035
9036 // Having anything other than DEPTH or STENCIL is an error
9037 m_errorMonitor->SetDesiredFailureMsg(
9038 VK_DEBUG_REPORT_ERROR_BIT_EXT,
9039 "Combination depth/stencil image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT and VK_IMAGE_ASPECT_STENCIL_BIT set.");
9040 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
9041 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9042 nullptr, 0, nullptr, 1, &img_barrier);
9043 m_errorMonitor->VerifyFound();
9044
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009045 // Now test depth-only
9046 VkFormatProperties format_props;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009047 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &format_props);
9048 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009049 VkDepthStencilObj d_image(m_device);
9050 d_image.Init(m_device, 128, 128, VK_FORMAT_D16_UNORM);
9051 ASSERT_TRUE(d_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009052 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009053 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009054 img_barrier.image = d_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009055
9056 // DEPTH bit must be set
9057 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9058 "Depth-only image formats must have the VK_IMAGE_ASPECT_DEPTH_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009059 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009060 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9061 0, nullptr, 0, nullptr, 1, &img_barrier);
9062 m_errorMonitor->VerifyFound();
9063
9064 // No bits other than DEPTH may be set
9065 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9066 "Depth-only image formats can have only the VK_IMAGE_ASPECT_DEPTH_BIT set.");
9067 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009068 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9069 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009070 m_errorMonitor->VerifyFound();
9071 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009072
9073 // Now test stencil-only
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009074 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &format_props);
9075 if (format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT) {
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009076 VkDepthStencilObj s_image(m_device);
9077 s_image.Init(m_device, 128, 128, VK_FORMAT_S8_UINT);
9078 ASSERT_TRUE(s_image.initialized());
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009079 img_barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
Tobin Ehlis15684a02016-07-21 14:55:26 -06009080 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009081 img_barrier.image = s_image.handle();
Tobin Ehlis15684a02016-07-21 14:55:26 -06009082 // Use of COLOR aspect on depth image is error
Dave Houltonf3229d52017-02-21 15:59:08 -07009083 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9084 "Stencil-only image formats must have the VK_IMAGE_ASPECT_STENCIL_BIT set.");
Tobin Ehlis15684a02016-07-21 14:55:26 -06009085 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009086 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0,
9087 0, nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009088 m_errorMonitor->VerifyFound();
9089 }
Dave Houltonfbf52152017-01-06 12:55:29 -07009090
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009091 // Finally test color
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009092 VkImageObj c_image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009093 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 -06009094 ASSERT_TRUE(c_image.initialized());
9095 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9096 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
9097 img_barrier.image = c_image.handle();
Dave Houltonfbf52152017-01-06 12:55:29 -07009098
9099 // COLOR bit must be set
9100 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9101 "Color image formats must have the VK_IMAGE_ASPECT_COLOR_BIT set.");
Rene Lindsay4834cba2017-02-02 17:18:56 -07009102 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Dave Houltonfbf52152017-01-06 12:55:29 -07009103 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9104 nullptr, 0, nullptr, 1, &img_barrier);
9105 m_errorMonitor->VerifyFound();
9106
9107 // No bits other than COLOR may be set
9108 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9109 "Color image formats must have ONLY the VK_IMAGE_ASPECT_COLOR_BIT set.");
9110 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009111 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
9112 nullptr, 0, nullptr, 1, &img_barrier);
Tobin Ehlis17b2e7b2016-07-21 09:43:29 -06009113 m_errorMonitor->VerifyFound();
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009114
9115 // Attempt to mismatch barriers/waitEvents calls with incompatible queues
9116
9117 // Create command pool with incompatible queueflags
9118 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
9119 uint32_t queue_family_index = UINT32_MAX;
9120 for (uint32_t i = 0; i < queue_props.size(); i++) {
9121 if ((queue_props[i].queueFlags & VK_QUEUE_COMPUTE_BIT) == 0) {
9122 queue_family_index = i;
9123 break;
9124 }
9125 }
9126 if (queue_family_index == UINT32_MAX) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009127 printf(" No non-compute queue found; skipped.\n");
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009128 return;
9129 }
9130 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02513);
9131
9132 VkCommandPool command_pool;
9133 VkCommandPoolCreateInfo pool_create_info{};
9134 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
9135 pool_create_info.queueFamilyIndex = queue_family_index;
9136 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
9137 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
9138
9139 // Allocate a command buffer
9140 VkCommandBuffer bad_command_buffer;
9141 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
9142 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
9143 command_buffer_allocate_info.commandPool = command_pool;
9144 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
9145 command_buffer_allocate_info.commandBufferCount = 1;
9146 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &bad_command_buffer));
9147
9148 VkCommandBufferBeginInfo cbbi = {};
9149 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
9150 vkBeginCommandBuffer(bad_command_buffer, &cbbi);
9151 buf_barrier.offset = 0;
9152 buf_barrier.size = VK_WHOLE_SIZE;
9153 vkCmdPipelineBarrier(bad_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 1,
9154 &buf_barrier, 0, nullptr);
9155 m_errorMonitor->VerifyFound();
9156
9157 if ((queue_props[queue_family_index].queueFlags & VK_QUEUE_GRAPHICS_BIT) == 0) {
9158 vkEndCommandBuffer(bad_command_buffer);
9159 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009160 printf(" The non-compute queue does not support graphics; skipped.\n");
Mark Lobodzinskibdf378a2016-12-12 17:11:50 -07009161 return;
9162 }
9163 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02510);
9164 VkEvent event;
9165 VkEventCreateInfo event_create_info{};
9166 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
9167 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
9168 vkCmdWaitEvents(bad_command_buffer, 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, nullptr, 0,
9169 nullptr, 0, nullptr);
9170 m_errorMonitor->VerifyFound();
9171
9172 vkEndCommandBuffer(bad_command_buffer);
9173 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
Tony Barbour7fd5c0f2016-05-03 16:11:53 -06009174}
9175
Tony Barbour18ba25c2016-09-29 13:42:40 -06009176TEST_F(VkLayerTest, LayoutFromPresentWithoutAccessMemoryRead) {
9177 // Transition an image away from PRESENT_SRC_KHR without ACCESS_MEMORY_READ in srcAccessMask
9178
Mark Lobodzinski729a8d32017-01-26 12:16:30 -07009179 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "must have required access bit");
Tony Barbour18ba25c2016-09-29 13:42:40 -06009180 ASSERT_NO_FATAL_FAILURE(InitState());
9181 VkImageObj image(m_device);
Tony Barbour256c80a2016-10-05 13:23:46 -06009182 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbour18ba25c2016-09-29 13:42:40 -06009183 ASSERT_TRUE(image.initialized());
9184
9185 VkImageMemoryBarrier barrier = {};
9186 VkImageSubresourceRange range;
9187 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
9188 barrier.srcAccessMask = 0;
9189 barrier.srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT;
9190 barrier.dstAccessMask = VK_ACCESS_MEMORY_READ_BIT;
9191 barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
9192 barrier.newLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9193 barrier.image = image.handle();
9194 range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9195 range.baseMipLevel = 0;
9196 range.levelCount = 1;
9197 range.baseArrayLayer = 0;
9198 range.layerCount = 1;
9199 barrier.subresourceRange = range;
9200 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
9201 cmdbuf.BeginCommandBuffer();
9202 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9203 &barrier);
9204 barrier.oldLayout = VK_IMAGE_LAYOUT_PRESENT_SRC_KHR;
9205 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
9206 barrier.srcAccessMask = 0;
9207 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
9208 cmdbuf.PipelineBarrier(VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0, nullptr, 0, nullptr, 1,
9209 &barrier);
9210
9211 m_errorMonitor->VerifyFound();
9212}
9213
Karl Schultz6addd812016-02-02 17:17:23 -07009214TEST_F(VkLayerTest, IdxBufferAlignmentError) {
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009215 // Bind a BeginRenderPass within an active RenderPass
Karl Schultz6addd812016-02-02 17:17:23 -07009216 VkResult err;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009217
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009218 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdBindIndexBuffer() offset (0x7) does not fall on ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009219
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009220 ASSERT_NO_FATAL_FAILURE(InitState());
9221 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009222 uint32_t qfi = 0;
9223 VkBufferCreateInfo buffCI = {};
Karl Schultz6addd812016-02-02 17:17:23 -07009224 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9225 buffCI.size = 1024;
9226 buffCI.usage = VK_BUFFER_USAGE_INDEX_BUFFER_BIT;
9227 buffCI.queueFamilyIndexCount = 1;
9228 buffCI.pQueueFamilyIndices = &qfi;
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009229
9230 VkBuffer ib;
Chia-I Wuf7458c52015-10-26 21:10:41 +08009231 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009232 ASSERT_VK_SUCCESS(err);
9233
Tony Barbour552f6c02016-12-21 14:34:07 -07009234 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009235 ASSERT_VK_SUCCESS(err);
Karl Schultz6addd812016-02-02 17:17:23 -07009236 // vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(),
9237 // VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009238 // Should error before calling to driver so don't care about actual data
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07009239 m_errorMonitor->SetUnexpectedError(
9240 "If buffer is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object");
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009241 vkCmdBindIndexBuffer(m_commandBuffer->GetBufferHandle(), ib, 7, VK_INDEX_TYPE_UINT16);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009242
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009243 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -06009244
Chia-I Wuf7458c52015-10-26 21:10:41 +08009245 vkDestroyBuffer(m_device->device(), ib, NULL);
Tobin Ehlisc4c23182015-09-17 12:24:13 -06009246}
9247
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009248TEST_F(VkLayerTest, InvalidQueueFamilyIndex) {
9249 // Create an out-of-range queueFamilyIndex
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009250 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
9251 "vkCreateBuffer: pCreateInfo->pQueueFamilyIndices[0] (777) must be one "
9252 "of the indices specified when the device was created, via the "
9253 "VkDeviceQueueCreateInfo structure.");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009254
9255 ASSERT_NO_FATAL_FAILURE(InitState());
9256 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
9257 VkBufferCreateInfo buffCI = {};
9258 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9259 buffCI.size = 1024;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009260 buffCI.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009261 buffCI.queueFamilyIndexCount = 1;
9262 // Introduce failure by specifying invalid queue_family_index
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009263 uint32_t qfi[2];
9264 qfi[0] = 777;
9265
9266 buffCI.pQueueFamilyIndices = qfi;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009267 buffCI.sharingMode = VK_SHARING_MODE_CONCURRENT; // qfi only matters in CONCURRENT mode
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009268
9269 VkBuffer ib;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07009270 m_errorMonitor->SetUnexpectedError(
9271 "If sharingMode is VK_SHARING_MODE_CONCURRENT, queueFamilyIndexCount must be greater than 1");
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009272 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib);
9273
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009274 m_errorMonitor->VerifyFound();
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009275
9276 if (m_device->queue_props.size() > 2) {
Tony Barbour75db7402017-03-09 14:51:36 -07009277 VkBuffer ib2;
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009278 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "which was not created allowing concurrent");
9279
9280 // Create buffer shared to queue families 1 and 2, but submitted on queue family 0
9281 buffCI.queueFamilyIndexCount = 2;
9282 qfi[0] = 1;
9283 qfi[1] = 2;
Tony Barbour75db7402017-03-09 14:51:36 -07009284 vkCreateBuffer(m_device->device(), &buffCI, NULL, &ib2);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009285 VkDeviceMemory mem;
9286 VkMemoryRequirements mem_reqs;
Tony Barbour75db7402017-03-09 14:51:36 -07009287 vkGetBufferMemoryRequirements(m_device->device(), ib2, &mem_reqs);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009288
9289 VkMemoryAllocateInfo alloc_info = {};
9290 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9291 alloc_info.allocationSize = 1024;
9292 bool pass = false;
9293 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
9294 if (!pass) {
Tony Barbour75db7402017-03-09 14:51:36 -07009295 vkDestroyBuffer(m_device->device(), ib2, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009296 return;
9297 }
9298 vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
Tony Barbour75db7402017-03-09 14:51:36 -07009299 vkBindBufferMemory(m_device->device(), ib2, mem, 0);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009300
9301 m_commandBuffer->begin();
Tony Barbour75db7402017-03-09 14:51:36 -07009302 vkCmdFillBuffer(m_commandBuffer->handle(), ib2, 0, 16, 5);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009303 m_commandBuffer->end();
9304 QueueCommandBuffer(false);
9305 m_errorMonitor->VerifyFound();
Tony Barbour75db7402017-03-09 14:51:36 -07009306 vkDestroyBuffer(m_device->device(), ib2, NULL);
9307 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski4761d212017-02-28 13:12:44 -07009308 }
9309
Tony Barbourdf4c0042016-06-01 15:55:43 -06009310 vkDestroyBuffer(m_device->device(), ib, NULL);
Mark Lobodzinski52a6e7d2016-02-25 15:09:52 -07009311}
9312
Karl Schultz6addd812016-02-02 17:17:23 -07009313TEST_F(VkLayerTest, ExecuteCommandsPrimaryCB) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009314 TEST_DESCRIPTION(
9315 "Attempt vkCmdExecuteCommands with a primary command buffer"
9316 " (should only be secondary)");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -06009317
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009318 ASSERT_NO_FATAL_FAILURE(InitState());
9319 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009320
Chris Forbesf29a84f2016-10-06 18:39:28 +13009321 // An empty primary command buffer
9322 VkCommandBufferObj cb(m_device, m_commandPool);
9323 cb.BeginCommandBuffer();
9324 cb.EndCommandBuffer();
Tobin Ehlis0c94db02016-07-19 10:49:32 -06009325
Chris Forbesf29a84f2016-10-06 18:39:28 +13009326 m_commandBuffer->BeginCommandBuffer();
9327 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
9328 VkCommandBuffer handle = cb.handle();
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009329
Chris Forbesf29a84f2016-10-06 18:39:28 +13009330 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdExecuteCommands() called w/ Primary Cmd Buffer ");
9331 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &handle);
Chris Forbes8f36a8a2016-04-07 13:21:07 +12009332 m_errorMonitor->VerifyFound();
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07009333
9334 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be pending execution");
Tobin Ehlis4b34ddc2015-09-17 14:18:16 -06009335}
9336
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009337TEST_F(VkLayerTest, DSUsageBitsErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009338 TEST_DESCRIPTION(
9339 "Attempt to update descriptor sets for images and buffers "
9340 "that do not have correct usage bits sets.");
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009341 VkResult err;
9342
9343 ASSERT_NO_FATAL_FAILURE(InitState());
9344 VkDescriptorPoolSize ds_type_count[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9345 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9346 ds_type_count[i].type = VkDescriptorType(i);
9347 ds_type_count[i].descriptorCount = 1;
9348 }
9349 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9350 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9351 ds_pool_ci.pNext = NULL;
9352 ds_pool_ci.maxSets = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9353 ds_pool_ci.poolSizeCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9354 ds_pool_ci.pPoolSizes = ds_type_count;
9355
9356 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009357 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009358 ASSERT_VK_SUCCESS(err);
9359
9360 // Create 10 layouts where each has a single descriptor of different type
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009361 VkDescriptorSetLayoutBinding dsl_binding[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009362 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9363 dsl_binding[i].binding = 0;
9364 dsl_binding[i].descriptorType = VkDescriptorType(i);
9365 dsl_binding[i].descriptorCount = 1;
9366 dsl_binding[i].stageFlags = VK_SHADER_STAGE_ALL;
9367 dsl_binding[i].pImmutableSamplers = NULL;
9368 }
9369
9370 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9371 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9372 ds_layout_ci.pNext = NULL;
9373 ds_layout_ci.bindingCount = 1;
9374 VkDescriptorSetLayout ds_layouts[VK_DESCRIPTOR_TYPE_RANGE_SIZE];
9375 for (uint32_t i = 0; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
9376 ds_layout_ci.pBindings = dsl_binding + i;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009377 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, ds_layouts + i);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009378 ASSERT_VK_SUCCESS(err);
9379 }
9380 VkDescriptorSet descriptor_sets[VK_DESCRIPTOR_TYPE_RANGE_SIZE] = {};
9381 VkDescriptorSetAllocateInfo alloc_info = {};
9382 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9383 alloc_info.descriptorSetCount = VK_DESCRIPTOR_TYPE_RANGE_SIZE;
9384 alloc_info.descriptorPool = ds_pool;
9385 alloc_info.pSetLayouts = ds_layouts;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009386 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, descriptor_sets);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009387 ASSERT_VK_SUCCESS(err);
9388
9389 // Create a buffer & bufferView to be used for invalid updates
9390 VkBufferCreateInfo buff_ci = {};
9391 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
Tony Barbour415497c2017-01-24 10:06:09 -07009392 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009393 buff_ci.size = 256;
9394 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
Tony Barbour415497c2017-01-24 10:06:09 -07009395 VkBuffer buffer, storage_texel_buffer;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009396 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9397 ASSERT_VK_SUCCESS(err);
Tony Barbour415497c2017-01-24 10:06:09 -07009398
9399 // Create another buffer to use in testing the UNIFORM_TEXEL_BUFFER case
9400 buff_ci.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
9401 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &storage_texel_buffer);
9402 ASSERT_VK_SUCCESS(err);
9403
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009404 VkMemoryRequirements mem_reqs;
9405 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
9406 VkMemoryAllocateInfo mem_alloc_info = {};
9407 mem_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9408 mem_alloc_info.pNext = NULL;
9409 mem_alloc_info.memoryTypeIndex = 0;
9410 mem_alloc_info.allocationSize = mem_reqs.size;
9411 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9412 if (!pass) {
9413 vkDestroyBuffer(m_device->device(), buffer, NULL);
9414 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9415 return;
9416 }
9417 VkDeviceMemory mem;
9418 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &mem);
9419 ASSERT_VK_SUCCESS(err);
9420 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9421 ASSERT_VK_SUCCESS(err);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009422
9423 VkBufferViewCreateInfo buff_view_ci = {};
9424 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
9425 buff_view_ci.buffer = buffer;
9426 buff_view_ci.format = VK_FORMAT_R8_UNORM;
9427 buff_view_ci.range = VK_WHOLE_SIZE;
9428 VkBufferView buff_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009429 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buff_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009430 ASSERT_VK_SUCCESS(err);
9431
Tony Barbour415497c2017-01-24 10:06:09 -07009432 // Now get resources / view for storage_texel_buffer
9433 vkGetBufferMemoryRequirements(m_device->device(), storage_texel_buffer, &mem_reqs);
9434 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc_info, 0);
9435 if (!pass) {
9436 vkDestroyBuffer(m_device->device(), buffer, NULL);
9437 vkDestroyBufferView(m_device->device(), buff_view, NULL);
9438 vkFreeMemory(m_device->device(), mem, NULL);
9439 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
9440 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9441 return;
9442 }
9443 VkDeviceMemory storage_texel_buffer_mem;
9444 VkBufferView storage_texel_buffer_view;
9445 err = vkAllocateMemory(m_device->device(), &mem_alloc_info, NULL, &storage_texel_buffer_mem);
9446 ASSERT_VK_SUCCESS(err);
9447 err = vkBindBufferMemory(m_device->device(), storage_texel_buffer, storage_texel_buffer_mem, 0);
9448 ASSERT_VK_SUCCESS(err);
9449 buff_view_ci.buffer = storage_texel_buffer;
9450 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &storage_texel_buffer_view);
9451 ASSERT_VK_SUCCESS(err);
9452
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009453 // Create an image to be used for invalid updates
Tony Barbour4b4a4222017-01-24 11:46:34 -07009454 // Find a format / tiling for COLOR_ATTACHMENT
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009455 VkImageCreateInfo image_ci = {};
Tony Barbour4b4a4222017-01-24 11:46:34 -07009456 image_ci.format = VK_FORMAT_UNDEFINED;
9457 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
9458 VkFormat format = static_cast<VkFormat>(f);
9459 VkFormatProperties fProps = m_device->format_properties(format);
9460 if (fProps.linearTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9461 image_ci.format = format;
9462 image_ci.tiling = VK_IMAGE_TILING_LINEAR;
9463 break;
9464 } else if (fProps.optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT) {
9465 image_ci.format = format;
9466 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
9467 break;
9468 }
9469 }
9470 if (image_ci.format == VK_FORMAT_UNDEFINED) {
9471 return;
9472 }
9473
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009474 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9475 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009476 image_ci.extent.width = 64;
9477 image_ci.extent.height = 64;
9478 image_ci.extent.depth = 1;
9479 image_ci.mipLevels = 1;
9480 image_ci.arrayLayers = 1;
9481 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009482 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009483 image_ci.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009484 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9485 VkImage image;
9486 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9487 ASSERT_VK_SUCCESS(err);
9488 // Bind memory to image
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009489 VkDeviceMemory image_mem;
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009490
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009491 VkMemoryAllocateInfo mem_alloc = {};
9492 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9493 mem_alloc.pNext = NULL;
9494 mem_alloc.allocationSize = 0;
9495 mem_alloc.memoryTypeIndex = 0;
9496 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9497 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009498 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009499 ASSERT_TRUE(pass);
9500 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9501 ASSERT_VK_SUCCESS(err);
9502 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9503 ASSERT_VK_SUCCESS(err);
9504 // Now create view for image
9505 VkImageViewCreateInfo image_view_ci = {};
9506 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9507 image_view_ci.image = image;
Tony Barbour4b4a4222017-01-24 11:46:34 -07009508 image_view_ci.format = image_ci.format;
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009509 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9510 image_view_ci.subresourceRange.layerCount = 1;
9511 image_view_ci.subresourceRange.baseArrayLayer = 0;
9512 image_view_ci.subresourceRange.levelCount = 1;
9513 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
9514 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009515 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009516 ASSERT_VK_SUCCESS(err);
9517
9518 VkDescriptorBufferInfo buff_info = {};
9519 buff_info.buffer = buffer;
9520 VkDescriptorImageInfo img_info = {};
9521 img_info.imageView = image_view;
9522 VkWriteDescriptorSet descriptor_write = {};
9523 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9524 descriptor_write.dstBinding = 0;
9525 descriptor_write.descriptorCount = 1;
9526 descriptor_write.pTexelBufferView = &buff_view;
9527 descriptor_write.pBufferInfo = &buff_info;
9528 descriptor_write.pImageInfo = &img_info;
9529
9530 // These error messages align with VkDescriptorType struct
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009531 UNIQUE_VALIDATION_ERROR_CODE error_codes[] = {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009532 VALIDATION_ERROR_00943, // placeholder, no error for SAMPLER descriptor
9533 VALIDATION_ERROR_00943, // COMBINED_IMAGE_SAMPLER
9534 VALIDATION_ERROR_00943, // SAMPLED_IMAGE
9535 VALIDATION_ERROR_00943, // STORAGE_IMAGE
9536 VALIDATION_ERROR_00950, // UNIFORM_TEXEL_BUFFER
9537 VALIDATION_ERROR_00951, // STORAGE_TEXEL_BUFFER
9538 VALIDATION_ERROR_00946, // UNIFORM_BUFFER
9539 VALIDATION_ERROR_00947, // STORAGE_BUFFER
9540 VALIDATION_ERROR_00946, // UNIFORM_BUFFER_DYNAMIC
9541 VALIDATION_ERROR_00947, // STORAGE_BUFFER_DYNAMIC
9542 VALIDATION_ERROR_00943 // INPUT_ATTACHMENT
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009543 };
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009544 // Start loop at 1 as SAMPLER desc type has no usage bit error
9545 for (uint32_t i = 1; i < VK_DESCRIPTOR_TYPE_RANGE_SIZE; ++i) {
Tony Barbour415497c2017-01-24 10:06:09 -07009546 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9547 // Now check for UNIFORM_TEXEL_BUFFER using storage_texel_buffer_view
9548 descriptor_write.pTexelBufferView = &storage_texel_buffer_view;
9549 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009550 descriptor_write.descriptorType = VkDescriptorType(i);
9551 descriptor_write.dstSet = descriptor_sets[i];
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009552 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_codes[i]);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009553
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009554 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009555
9556 m_errorMonitor->VerifyFound();
9557 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[i], NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009558 if (VkDescriptorType(i) == VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER) {
9559 descriptor_write.pTexelBufferView = &buff_view;
9560 }
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009561 }
Tony Barbour415497c2017-01-24 10:06:09 -07009562
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009563 vkDestroyDescriptorSetLayout(m_device->device(), ds_layouts[0], NULL);
9564 vkDestroyImage(m_device->device(), image, NULL);
Tony Barbourdf4c0042016-06-01 15:55:43 -06009565 vkFreeMemory(m_device->device(), image_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009566 vkDestroyImageView(m_device->device(), image_view, NULL);
9567 vkDestroyBuffer(m_device->device(), buffer, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009568 vkDestroyBuffer(m_device->device(), storage_texel_buffer, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009569 vkDestroyBufferView(m_device->device(), buff_view, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009570 vkDestroyBufferView(m_device->device(), storage_texel_buffer_view, NULL);
Tobin Ehlis76f8b0b2017-01-02 13:21:21 -07009571 vkFreeMemory(m_device->device(), mem, NULL);
Tony Barbour415497c2017-01-24 10:06:09 -07009572 vkFreeMemory(m_device->device(), storage_texel_buffer_mem, NULL);
Tobin Ehlis17826bd2016-05-25 11:12:50 -06009573 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9574}
9575
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009576TEST_F(VkLayerTest, DSBufferInfoErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009577 TEST_DESCRIPTION(
9578 "Attempt to update buffer descriptor set that has incorrect "
9579 "parameters in VkDescriptorBufferInfo struct. This includes:\n"
9580 "1. offset value greater than buffer size\n"
9581 "2. range value of 0\n"
9582 "3. range value greater than buffer (size - offset)");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009583 VkResult err;
9584
9585 ASSERT_NO_FATAL_FAILURE(InitState());
9586 VkDescriptorPoolSize ds_type_count = {};
9587 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9588 ds_type_count.descriptorCount = 1;
9589
9590 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9591 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9592 ds_pool_ci.pNext = NULL;
9593 ds_pool_ci.maxSets = 1;
9594 ds_pool_ci.poolSizeCount = 1;
9595 ds_pool_ci.pPoolSizes = &ds_type_count;
9596
9597 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009598 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009599 ASSERT_VK_SUCCESS(err);
9600
9601 // Create layout with single uniform buffer descriptor
9602 VkDescriptorSetLayoutBinding dsl_binding = {};
9603 dsl_binding.binding = 0;
9604 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9605 dsl_binding.descriptorCount = 1;
9606 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9607 dsl_binding.pImmutableSamplers = NULL;
9608
9609 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9610 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9611 ds_layout_ci.pNext = NULL;
9612 ds_layout_ci.bindingCount = 1;
9613 ds_layout_ci.pBindings = &dsl_binding;
9614 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009615 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009616 ASSERT_VK_SUCCESS(err);
9617
9618 VkDescriptorSet descriptor_set = {};
9619 VkDescriptorSetAllocateInfo alloc_info = {};
9620 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9621 alloc_info.descriptorSetCount = 1;
9622 alloc_info.descriptorPool = ds_pool;
9623 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009624 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009625 ASSERT_VK_SUCCESS(err);
9626
9627 // Create a buffer to be used for invalid updates
9628 VkBufferCreateInfo buff_ci = {};
9629 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9630 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
9631 buff_ci.size = 256;
9632 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9633 VkBuffer buffer;
9634 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
9635 ASSERT_VK_SUCCESS(err);
9636 // Have to bind memory to buffer before descriptor update
9637 VkMemoryAllocateInfo mem_alloc = {};
9638 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9639 mem_alloc.pNext = NULL;
9640 mem_alloc.allocationSize = 256;
9641 mem_alloc.memoryTypeIndex = 0;
9642
9643 VkMemoryRequirements mem_reqs;
9644 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009645 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009646 if (!pass) {
9647 vkDestroyBuffer(m_device->device(), buffer, NULL);
9648 return;
9649 }
9650
9651 VkDeviceMemory mem;
9652 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
9653 ASSERT_VK_SUCCESS(err);
9654 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
9655 ASSERT_VK_SUCCESS(err);
9656
9657 VkDescriptorBufferInfo buff_info = {};
9658 buff_info.buffer = buffer;
9659 // First make offset 1 larger than buffer size
9660 buff_info.offset = 257;
9661 buff_info.range = VK_WHOLE_SIZE;
9662 VkWriteDescriptorSet descriptor_write = {};
9663 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9664 descriptor_write.dstBinding = 0;
9665 descriptor_write.descriptorCount = 1;
9666 descriptor_write.pTexelBufferView = nullptr;
9667 descriptor_write.pBufferInfo = &buff_info;
9668 descriptor_write.pImageInfo = nullptr;
9669
9670 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9671 descriptor_write.dstSet = descriptor_set;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009672 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00959);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009673
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07009674 m_errorMonitor->SetUnexpectedError(
9675 "If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, the offset member of "
9676 "any given element of pBufferInfo must be a multiple of VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009677 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9678
9679 m_errorMonitor->VerifyFound();
9680 // Now cause error due to range of 0
9681 buff_info.offset = 0;
9682 buff_info.range = 0;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00960);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009684
9685 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9686
9687 m_errorMonitor->VerifyFound();
9688 // Now cause error due to range exceeding buffer size - offset
9689 buff_info.offset = 128;
9690 buff_info.range = 200;
Tobin Ehlis56e1bc32017-01-02 10:09:07 -07009691 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00961);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009692
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07009693 m_errorMonitor->SetUnexpectedError(
9694 "If descriptorType is VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER or VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC, the offset member of "
9695 "any given element of pBufferInfo must be a multiple of VkPhysicalDeviceLimits::minUniformBufferOffsetAlignment");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009696 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9697
9698 m_errorMonitor->VerifyFound();
Mark Lobodzinski4bb54092016-07-06 14:27:19 -06009699 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009700 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9701 vkDestroyBuffer(m_device->device(), buffer, NULL);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -07009702 m_errorMonitor->SetUnexpectedError(
9703 "descriptorPool must have been created with the VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT flag");
Tobin Ehlis585f66d2016-07-01 18:23:58 -06009704 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
9705 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9706}
9707
Tobin Ehlis845887e2017-02-02 19:01:44 -07009708TEST_F(VkLayerTest, DSBufferLimitErrors) {
9709 TEST_DESCRIPTION(
9710 "Attempt to update buffer descriptor set that has VkDescriptorBufferInfo values that violate device limits.\n"
9711 "Test cases include:\n"
9712 "1. range of uniform buffer update exceeds maxUniformBufferRange\n"
9713 "2. offset of uniform buffer update is not multiple of minUniformBufferOffsetAlignment\n"
9714 "3. range of storage buffer update exceeds maxStorageBufferRange\n"
9715 "4. offset of storage buffer update is not multiple of minStorageBufferOffsetAlignment");
9716 VkResult err;
9717
9718 ASSERT_NO_FATAL_FAILURE(InitState());
9719 VkDescriptorPoolSize ds_type_count[2] = {};
9720 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9721 ds_type_count[0].descriptorCount = 1;
9722 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9723 ds_type_count[1].descriptorCount = 1;
9724
9725 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9726 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9727 ds_pool_ci.pNext = NULL;
9728 ds_pool_ci.maxSets = 1;
9729 ds_pool_ci.poolSizeCount = 2;
9730 ds_pool_ci.pPoolSizes = ds_type_count;
9731
9732 VkDescriptorPool ds_pool;
9733 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
9734 ASSERT_VK_SUCCESS(err);
9735
9736 // Create layout with single uniform buffer & single storage buffer descriptor
9737 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
9738 dsl_binding[0].binding = 0;
9739 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9740 dsl_binding[0].descriptorCount = 1;
9741 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
9742 dsl_binding[0].pImmutableSamplers = NULL;
9743 dsl_binding[1].binding = 1;
9744 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9745 dsl_binding[1].descriptorCount = 1;
9746 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
9747 dsl_binding[1].pImmutableSamplers = NULL;
9748
9749 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9750 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9751 ds_layout_ci.pNext = NULL;
9752 ds_layout_ci.bindingCount = 2;
9753 ds_layout_ci.pBindings = dsl_binding;
9754 VkDescriptorSetLayout ds_layout;
9755 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
9756 ASSERT_VK_SUCCESS(err);
9757
9758 VkDescriptorSet descriptor_set = {};
9759 VkDescriptorSetAllocateInfo alloc_info = {};
9760 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9761 alloc_info.descriptorSetCount = 1;
9762 alloc_info.descriptorPool = ds_pool;
9763 alloc_info.pSetLayouts = &ds_layout;
9764 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
9765 ASSERT_VK_SUCCESS(err);
9766
9767 // Create a buffer to be used for invalid updates
9768 auto max_ub_range = m_device->props.limits.maxUniformBufferRange;
9769 auto min_ub_align = m_device->props.limits.minUniformBufferOffsetAlignment;
9770 auto max_sb_range = m_device->props.limits.maxStorageBufferRange;
9771 auto min_sb_align = m_device->props.limits.minStorageBufferOffsetAlignment;
9772 VkBufferCreateInfo ub_ci = {};
9773 ub_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9774 ub_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
9775 ub_ci.size = max_ub_range + 128; // Make buffer bigger than range limit
9776 ub_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9777 VkBuffer uniform_buffer;
9778 err = vkCreateBuffer(m_device->device(), &ub_ci, NULL, &uniform_buffer);
9779 ASSERT_VK_SUCCESS(err);
9780 VkBufferCreateInfo sb_ci = {};
9781 sb_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
9782 sb_ci.usage = VK_BUFFER_USAGE_STORAGE_BUFFER_BIT;
9783 sb_ci.size = max_sb_range + 128; // Make buffer bigger than range limit
9784 sb_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9785 VkBuffer storage_buffer;
9786 err = vkCreateBuffer(m_device->device(), &sb_ci, NULL, &storage_buffer);
9787 ASSERT_VK_SUCCESS(err);
9788 // Have to bind memory to buffer before descriptor update
9789 VkMemoryAllocateInfo mem_alloc = {};
9790 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9791 mem_alloc.pNext = NULL;
9792 mem_alloc.allocationSize = ub_ci.size + sb_ci.size + 1024; // additional buffer for offset
9793 mem_alloc.memoryTypeIndex = 0;
9794
Cort Stratton77a0d592017-02-17 13:14:13 -08009795 VkMemoryRequirements ub_mem_reqs, sb_mem_reqs;
9796 vkGetBufferMemoryRequirements(m_device->device(), uniform_buffer, &ub_mem_reqs);
9797 bool pass = m_device->phy().set_memory_type(ub_mem_reqs.memoryTypeBits, &mem_alloc, 0);
9798 vkGetBufferMemoryRequirements(m_device->device(), storage_buffer, &sb_mem_reqs);
9799 pass &= m_device->phy().set_memory_type(sb_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009800 if (!pass) {
Tobin Ehlis15c83792017-02-07 10:09:33 -07009801 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009802 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009803 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9804 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009805 return;
9806 }
9807
9808 VkDeviceMemory mem;
9809 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
Tobin Ehlis15c83792017-02-07 10:09:33 -07009810 if (VK_SUCCESS != err) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -07009811 printf(" Failed to allocate memory in DSBufferLimitErrors; skipped.\n");
Tobin Ehlis15c83792017-02-07 10:09:33 -07009812 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9813 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9814 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9815 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9816 return;
9817 }
Tobin Ehlis845887e2017-02-02 19:01:44 -07009818 ASSERT_VK_SUCCESS(err);
9819 err = vkBindBufferMemory(m_device->device(), uniform_buffer, mem, 0);
9820 ASSERT_VK_SUCCESS(err);
Cort Stratton77a0d592017-02-17 13:14:13 -08009821 auto sb_offset = (ub_ci.size + sb_mem_reqs.alignment - 1) & ~(sb_mem_reqs.alignment - 1);
Tobin Ehlis845887e2017-02-02 19:01:44 -07009822 err = vkBindBufferMemory(m_device->device(), storage_buffer, mem, sb_offset);
9823 ASSERT_VK_SUCCESS(err);
9824
9825 VkDescriptorBufferInfo buff_info = {};
9826 buff_info.buffer = uniform_buffer;
9827 buff_info.range = ub_ci.size; // This will exceed limit
9828 VkWriteDescriptorSet descriptor_write = {};
9829 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9830 descriptor_write.dstBinding = 0;
9831 descriptor_write.descriptorCount = 1;
9832 descriptor_write.pTexelBufferView = nullptr;
9833 descriptor_write.pBufferInfo = &buff_info;
9834 descriptor_write.pImageInfo = nullptr;
9835
9836 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
9837 descriptor_write.dstSet = descriptor_set;
9838 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00948);
9839 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9840 m_errorMonitor->VerifyFound();
9841
9842 // Reduce size of range to acceptable limit & cause offset error
9843 buff_info.range = max_ub_range;
9844 buff_info.offset = min_ub_align - 1;
9845 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00944);
9846 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9847 m_errorMonitor->VerifyFound();
9848
9849 // Now break storage updates
9850 buff_info.buffer = storage_buffer;
9851 buff_info.range = sb_ci.size; // This will exceed limit
9852 buff_info.offset = 0; // Reset offset for this update
9853
9854 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
9855 descriptor_write.dstBinding = 1;
9856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00949);
9857 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9858 m_errorMonitor->VerifyFound();
9859
9860 // Reduce size of range to acceptable limit & cause offset error
9861 buff_info.range = max_sb_range;
9862 buff_info.offset = min_sb_align - 1;
9863 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00945);
9864 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9865 m_errorMonitor->VerifyFound();
9866
9867 vkFreeMemory(m_device->device(), mem, NULL);
9868 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9869 vkDestroyBuffer(m_device->device(), uniform_buffer, NULL);
9870 vkDestroyBuffer(m_device->device(), storage_buffer, NULL);
9871 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
9872}
9873
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009874TEST_F(VkLayerTest, DSAspectBitsErrors) {
9875 // TODO : Initially only catching case where DEPTH & STENCIL aspect bits
9876 // are set, but could expand this test to hit more cases.
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009877 TEST_DESCRIPTION(
9878 "Attempt to update descriptor sets for images "
9879 "that do not have correct aspect bits sets.");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009880 VkResult err;
9881
9882 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf887b162017-03-09 10:06:46 -07009883 auto depth_format = find_depth_stencil_format(m_device);
9884 if (!depth_format) {
9885 printf(" No Depth + Stencil format found. Skipped.\n");
9886 return;
9887 }
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009888 VkDescriptorPoolSize ds_type_count = {};
9889 ds_type_count.type = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9890 ds_type_count.descriptorCount = 1;
9891
9892 VkDescriptorPoolCreateInfo ds_pool_ci = {};
9893 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
9894 ds_pool_ci.pNext = NULL;
9895 ds_pool_ci.maxSets = 5;
9896 ds_pool_ci.poolSizeCount = 1;
9897 ds_pool_ci.pPoolSizes = &ds_type_count;
9898
9899 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009900 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009901 ASSERT_VK_SUCCESS(err);
9902
9903 VkDescriptorSetLayoutBinding dsl_binding = {};
9904 dsl_binding.binding = 0;
9905 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9906 dsl_binding.descriptorCount = 1;
9907 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
9908 dsl_binding.pImmutableSamplers = NULL;
9909
9910 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
9911 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
9912 ds_layout_ci.pNext = NULL;
9913 ds_layout_ci.bindingCount = 1;
9914 ds_layout_ci.pBindings = &dsl_binding;
9915 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009916 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009917 ASSERT_VK_SUCCESS(err);
9918
9919 VkDescriptorSet descriptor_set = {};
9920 VkDescriptorSetAllocateInfo alloc_info = {};
9921 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
9922 alloc_info.descriptorSetCount = 1;
9923 alloc_info.descriptorPool = ds_pool;
9924 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009925 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009926 ASSERT_VK_SUCCESS(err);
9927
9928 // Create an image to be used for invalid updates
9929 VkImageCreateInfo image_ci = {};
9930 image_ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
9931 image_ci.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -07009932 image_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009933 image_ci.extent.width = 64;
9934 image_ci.extent.height = 64;
9935 image_ci.extent.depth = 1;
9936 image_ci.mipLevels = 1;
9937 image_ci.arrayLayers = 1;
9938 image_ci.samples = VK_SAMPLE_COUNT_1_BIT;
Mark Young2d1fa302017-03-02 10:13:09 -07009939 image_ci.tiling = VK_IMAGE_TILING_OPTIMAL;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009940 image_ci.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
9941 image_ci.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
9942 image_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
9943 VkImage image;
9944 err = vkCreateImage(m_device->device(), &image_ci, NULL, &image);
9945 ASSERT_VK_SUCCESS(err);
9946 // Bind memory to image
9947 VkMemoryRequirements mem_reqs;
9948 VkDeviceMemory image_mem;
9949 bool pass;
9950 VkMemoryAllocateInfo mem_alloc = {};
9951 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
9952 mem_alloc.pNext = NULL;
9953 mem_alloc.allocationSize = 0;
9954 mem_alloc.memoryTypeIndex = 0;
9955 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
9956 mem_alloc.allocationSize = mem_reqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009957 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009958 ASSERT_TRUE(pass);
9959 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &image_mem);
9960 ASSERT_VK_SUCCESS(err);
9961 err = vkBindImageMemory(m_device->device(), image, image_mem, 0);
9962 ASSERT_VK_SUCCESS(err);
9963 // Now create view for image
9964 VkImageViewCreateInfo image_view_ci = {};
9965 image_view_ci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
9966 image_view_ci.image = image;
Tony Barbourf887b162017-03-09 10:06:46 -07009967 image_view_ci.format = depth_format;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009968 image_view_ci.viewType = VK_IMAGE_VIEW_TYPE_2D;
9969 image_view_ci.subresourceRange.layerCount = 1;
9970 image_view_ci.subresourceRange.baseArrayLayer = 0;
9971 image_view_ci.subresourceRange.levelCount = 1;
9972 // Setting both depth & stencil aspect bits is illegal for descriptor
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009973 image_view_ci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009974
9975 VkImageView image_view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009976 err = vkCreateImageView(m_device->device(), &image_view_ci, NULL, &image_view);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009977 ASSERT_VK_SUCCESS(err);
9978
9979 VkDescriptorImageInfo img_info = {};
9980 img_info.imageView = image_view;
9981 VkWriteDescriptorSet descriptor_write = {};
9982 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
9983 descriptor_write.dstBinding = 0;
9984 descriptor_write.descriptorCount = 1;
9985 descriptor_write.pTexelBufferView = NULL;
9986 descriptor_write.pBufferInfo = NULL;
9987 descriptor_write.pImageInfo = &img_info;
9988 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT;
9989 descriptor_write.dstSet = descriptor_set;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -07009990 const char *error_msg =
9991 " please only set either VK_IMAGE_ASPECT_DEPTH_BIT "
9992 "or VK_IMAGE_ASPECT_STENCIL_BIT ";
Mark Lobodzinskice751c62016-09-08 10:45:35 -06009993 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, error_msg);
Tobin Ehlis2fc296b2016-06-15 14:05:27 -06009994
9995 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
9996
9997 m_errorMonitor->VerifyFound();
9998 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
9999 vkDestroyImage(m_device->device(), image, NULL);
10000 vkFreeMemory(m_device->device(), image_mem, NULL);
10001 vkDestroyImageView(m_device->device(), image_view, NULL);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070010002 m_errorMonitor->SetUnexpectedError(
10003 "descriptorPool must have been created with the VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT flag");
Tobin Ehlis2fc296b2016-06-15 14:05:27 -060010004 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
10005 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10006}
10007
Karl Schultz6addd812016-02-02 17:17:23 -070010008TEST_F(VkLayerTest, DSTypeMismatch) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010009 // Create DS w/ layout of one type and attempt Update w/ mis-matched type
Karl Schultz6addd812016-02-02 17:17:23 -070010010 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010011
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010012 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10013 " binding #0 with type VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER but update "
10014 "type is VK_DESCRIPTOR_TYPE_SAMPLER");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010015
Tobin Ehlis3b780662015-05-28 12:11:26 -060010016 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010017 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010018 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010019 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10020 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010021
10022 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010023 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10024 ds_pool_ci.pNext = NULL;
10025 ds_pool_ci.maxSets = 1;
10026 ds_pool_ci.poolSizeCount = 1;
10027 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010028
Tobin Ehlis3b780662015-05-28 12:11:26 -060010029 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010030 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010031 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010032 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010033 dsl_binding.binding = 0;
10034 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10035 dsl_binding.descriptorCount = 1;
10036 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10037 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010038
Tony Barboureb254902015-07-15 12:50:33 -060010039 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010040 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10041 ds_layout_ci.pNext = NULL;
10042 ds_layout_ci.bindingCount = 1;
10043 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010044
Tobin Ehlis3b780662015-05-28 12:11:26 -060010045 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010046 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010047 ASSERT_VK_SUCCESS(err);
10048
10049 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010050 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010051 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010052 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010053 alloc_info.descriptorPool = ds_pool;
10054 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010055 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010056 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010057
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010058 VkSamplerCreateInfo sampler_ci = {};
10059 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10060 sampler_ci.pNext = NULL;
10061 sampler_ci.magFilter = VK_FILTER_NEAREST;
10062 sampler_ci.minFilter = VK_FILTER_NEAREST;
10063 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10064 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10065 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10066 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10067 sampler_ci.mipLodBias = 1.0;
10068 sampler_ci.anisotropyEnable = VK_FALSE;
10069 sampler_ci.maxAnisotropy = 1;
10070 sampler_ci.compareEnable = VK_FALSE;
10071 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10072 sampler_ci.minLod = 1.0;
10073 sampler_ci.maxLod = 1.0;
10074 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10075 sampler_ci.unnormalizedCoordinates = VK_FALSE;
10076 VkSampler sampler;
10077 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10078 ASSERT_VK_SUCCESS(err);
10079
10080 VkDescriptorImageInfo info = {};
10081 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010082
10083 VkWriteDescriptorSet descriptor_write;
10084 memset(&descriptor_write, 0, sizeof(descriptor_write));
10085 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010086 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010087 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010088 // This is a mismatched type for the layout which expects BUFFER
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010089 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010090 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010091
10092 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10093
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010094 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010095
Chia-I Wuf7458c52015-10-26 21:10:41 +080010096 vkDestroySampler(m_device->device(), sampler, NULL);
10097 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10098 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010099}
10100
Karl Schultz6addd812016-02-02 17:17:23 -070010101TEST_F(VkLayerTest, DSUpdateOutOfBounds) {
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010102 // For overlapping Update, have arrayIndex exceed that of layout
Karl Schultz6addd812016-02-02 17:17:23 -070010103 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010104
Tobin Ehlisf922ef82016-11-30 10:19:14 -070010105 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00938);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010106
Tobin Ehlis3b780662015-05-28 12:11:26 -060010107 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010108 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010109 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010110 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10111 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010112
10113 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010114 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10115 ds_pool_ci.pNext = NULL;
10116 ds_pool_ci.maxSets = 1;
10117 ds_pool_ci.poolSizeCount = 1;
10118 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060010119
Tobin Ehlis3b780662015-05-28 12:11:26 -060010120 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010121 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010122 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010123
Tony Barboureb254902015-07-15 12:50:33 -060010124 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010125 dsl_binding.binding = 0;
10126 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10127 dsl_binding.descriptorCount = 1;
10128 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10129 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010130
10131 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010132 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10133 ds_layout_ci.pNext = NULL;
10134 ds_layout_ci.bindingCount = 1;
10135 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010136
Tobin Ehlis3b780662015-05-28 12:11:26 -060010137 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010138 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010139 ASSERT_VK_SUCCESS(err);
10140
10141 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010142 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010143 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010144 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010145 alloc_info.descriptorPool = ds_pool;
10146 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010147 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010148 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010149
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010150 // Correctly update descriptor to avoid "NOT_UPDATED" error
10151 VkDescriptorBufferInfo buff_info = {};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010152 buff_info.buffer = VkBuffer(0); // Don't care about buffer handle for this test
Tobin Ehlis30db8f82016-05-05 08:19:48 -060010153 buff_info.offset = 0;
10154 buff_info.range = 1024;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010155
10156 VkWriteDescriptorSet descriptor_write;
10157 memset(&descriptor_write, 0, sizeof(descriptor_write));
10158 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010159 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010160 descriptor_write.dstArrayElement = 1; /* This index out of bounds for the update */
Chia-I Wud50a7d72015-10-26 20:48:51 +080010161 descriptor_write.descriptorCount = 1;
Tobin Ehlis0a43bde2016-05-03 08:31:08 -060010162 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10163 descriptor_write.pBufferInfo = &buff_info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010164
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070010165 m_errorMonitor->SetUnexpectedError("required parameter pDescriptorWrites");
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010166 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10167
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010168 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010169
Chia-I Wuf7458c52015-10-26 21:10:41 +080010170 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10171 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010172}
10173
Karl Schultz6addd812016-02-02 17:17:23 -070010174TEST_F(VkLayerTest, InvalidDSUpdateIndex) {
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010175 // Create layout w/ count of 1 and attempt update to that layout w/ binding index 2
Karl Schultz6addd812016-02-02 17:17:23 -070010176 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010177
Tobin Ehlisc8d352d2016-11-21 10:33:40 -070010178 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00936);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010179
Tobin Ehlis3b780662015-05-28 12:11:26 -060010180 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010181 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010182 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010183 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10184 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010185
10186 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010187 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10188 ds_pool_ci.pNext = NULL;
10189 ds_pool_ci.maxSets = 1;
10190 ds_pool_ci.poolSizeCount = 1;
10191 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010192
Tobin Ehlis3b780662015-05-28 12:11:26 -060010193 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010194 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010195 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010196
Tony Barboureb254902015-07-15 12:50:33 -060010197 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010198 dsl_binding.binding = 0;
10199 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10200 dsl_binding.descriptorCount = 1;
10201 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10202 dsl_binding.pImmutableSamplers = NULL;
Tony Barboureb254902015-07-15 12:50:33 -060010203
10204 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010205 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10206 ds_layout_ci.pNext = NULL;
10207 ds_layout_ci.bindingCount = 1;
10208 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010209 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010210 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010211 ASSERT_VK_SUCCESS(err);
10212
10213 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010214 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010215 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010216 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010217 alloc_info.descriptorPool = ds_pool;
10218 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010219 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010220 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010221
Tony Barboureb254902015-07-15 12:50:33 -060010222 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010223 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10224 sampler_ci.pNext = NULL;
10225 sampler_ci.magFilter = VK_FILTER_NEAREST;
10226 sampler_ci.minFilter = VK_FILTER_NEAREST;
10227 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10228 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10229 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10230 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10231 sampler_ci.mipLodBias = 1.0;
10232 sampler_ci.anisotropyEnable = VK_FALSE;
10233 sampler_ci.maxAnisotropy = 1;
10234 sampler_ci.compareEnable = VK_FALSE;
10235 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10236 sampler_ci.minLod = 1.0;
10237 sampler_ci.maxLod = 1.0;
10238 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10239 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tony Barboureb254902015-07-15 12:50:33 -060010240
Tobin Ehlis3b780662015-05-28 12:11:26 -060010241 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010242 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010243 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010244
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010245 VkDescriptorImageInfo info = {};
10246 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010247
10248 VkWriteDescriptorSet descriptor_write;
10249 memset(&descriptor_write, 0, sizeof(descriptor_write));
10250 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010251 descriptor_write.dstSet = descriptorSet;
10252 descriptor_write.dstBinding = 2;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010253 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010254 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010255 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010256 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010257
10258 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10259
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010260 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010261
Chia-I Wuf7458c52015-10-26 21:10:41 +080010262 vkDestroySampler(m_device->device(), sampler, NULL);
10263 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10264 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010265}
10266
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010267TEST_F(VkLayerTest, DSUpdateEmptyBinding) {
10268 // Create layout w/ empty binding and attempt to update it
10269 VkResult err;
10270
10271 ASSERT_NO_FATAL_FAILURE(InitState());
10272
10273 VkDescriptorPoolSize ds_type_count = {};
10274 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10275 ds_type_count.descriptorCount = 1;
10276
10277 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10278 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10279 ds_pool_ci.pNext = NULL;
10280 ds_pool_ci.maxSets = 1;
10281 ds_pool_ci.poolSizeCount = 1;
10282 ds_pool_ci.pPoolSizes = &ds_type_count;
10283
10284 VkDescriptorPool ds_pool;
10285 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
10286 ASSERT_VK_SUCCESS(err);
10287
10288 VkDescriptorSetLayoutBinding dsl_binding = {};
10289 dsl_binding.binding = 0;
10290 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10291 dsl_binding.descriptorCount = 0;
10292 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10293 dsl_binding.pImmutableSamplers = NULL;
10294
10295 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10296 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10297 ds_layout_ci.pNext = NULL;
10298 ds_layout_ci.bindingCount = 1;
10299 ds_layout_ci.pBindings = &dsl_binding;
10300 VkDescriptorSetLayout ds_layout;
10301 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
10302 ASSERT_VK_SUCCESS(err);
10303
10304 VkDescriptorSet descriptor_set;
10305 VkDescriptorSetAllocateInfo alloc_info = {};
10306 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
10307 alloc_info.descriptorSetCount = 1;
10308 alloc_info.descriptorPool = ds_pool;
10309 alloc_info.pSetLayouts = &ds_layout;
10310 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
10311 ASSERT_VK_SUCCESS(err);
10312
10313 VkSamplerCreateInfo sampler_ci = {};
10314 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10315 sampler_ci.magFilter = VK_FILTER_NEAREST;
10316 sampler_ci.minFilter = VK_FILTER_NEAREST;
10317 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10318 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10319 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10320 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10321 sampler_ci.mipLodBias = 1.0;
10322 sampler_ci.maxAnisotropy = 1;
10323 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10324 sampler_ci.minLod = 1.0;
10325 sampler_ci.maxLod = 1.0;
10326 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10327
10328 VkSampler sampler;
10329 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
10330 ASSERT_VK_SUCCESS(err);
10331
10332 VkDescriptorImageInfo info = {};
10333 info.sampler = sampler;
10334
10335 VkWriteDescriptorSet descriptor_write;
10336 memset(&descriptor_write, 0, sizeof(descriptor_write));
10337 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
10338 descriptor_write.dstSet = descriptor_set;
10339 descriptor_write.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010340 descriptor_write.descriptorCount = 1; // Lie here to avoid parameter_validation error
Tobin Ehlise202b2d2016-11-21 10:36:16 -070010341 // This is the wrong type, but empty binding error will be flagged first
10342 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10343 descriptor_write.pImageInfo = &info;
10344
10345 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02348);
10346 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10347 m_errorMonitor->VerifyFound();
10348
10349 vkDestroySampler(m_device->device(), sampler, NULL);
10350 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10351 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
10352}
10353
Karl Schultz6addd812016-02-02 17:17:23 -070010354TEST_F(VkLayerTest, InvalidDSUpdateStruct) {
10355 // Call UpdateDS w/ struct type other than valid VK_STRUCTUR_TYPE_UPDATE_*
10356 // types
10357 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010358
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010359 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 -060010360
Tobin Ehlis3b780662015-05-28 12:11:26 -060010361 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski209b5292015-09-17 09:44:05 -060010362
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010363 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010364 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10365 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010366
10367 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010368 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10369 ds_pool_ci.pNext = NULL;
10370 ds_pool_ci.maxSets = 1;
10371 ds_pool_ci.poolSizeCount = 1;
10372 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010373
Tobin Ehlis3b780662015-05-28 12:11:26 -060010374 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010375 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010376 ASSERT_VK_SUCCESS(err);
Tony Barboureb254902015-07-15 12:50:33 -060010377 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010378 dsl_binding.binding = 0;
10379 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10380 dsl_binding.descriptorCount = 1;
10381 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10382 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010383
Tony Barboureb254902015-07-15 12:50:33 -060010384 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010385 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10386 ds_layout_ci.pNext = NULL;
10387 ds_layout_ci.bindingCount = 1;
10388 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010389
Tobin Ehlis3b780662015-05-28 12:11:26 -060010390 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010391 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010392 ASSERT_VK_SUCCESS(err);
10393
10394 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010395 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010396 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010397 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010398 alloc_info.descriptorPool = ds_pool;
10399 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010400 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010401 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010402
Tony Barboureb254902015-07-15 12:50:33 -060010403 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010404 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10405 sampler_ci.pNext = NULL;
10406 sampler_ci.magFilter = VK_FILTER_NEAREST;
10407 sampler_ci.minFilter = VK_FILTER_NEAREST;
10408 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10409 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10410 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10411 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10412 sampler_ci.mipLodBias = 1.0;
10413 sampler_ci.anisotropyEnable = VK_FALSE;
10414 sampler_ci.maxAnisotropy = 1;
10415 sampler_ci.compareEnable = VK_FALSE;
10416 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10417 sampler_ci.minLod = 1.0;
10418 sampler_ci.maxLod = 1.0;
10419 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10420 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010421 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010422 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010423 ASSERT_VK_SUCCESS(err);
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010424
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010425 VkDescriptorImageInfo info = {};
10426 info.sampler = sampler;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010427
10428 VkWriteDescriptorSet descriptor_write;
10429 memset(&descriptor_write, 0, sizeof(descriptor_write));
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010430 descriptor_write.sType = (VkStructureType)0x99999999; /* Intentionally broken struct type */
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010431 descriptor_write.dstSet = descriptorSet;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010432 descriptor_write.descriptorCount = 1;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010433 // This is the wrong type, but out of bounds will be flagged first
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010434 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
Courtney Goeltzenleuchter4cb6d922015-10-23 13:38:14 -060010435 descriptor_write.pImageInfo = &info;
Chia-I Wu9d00ed72015-05-25 16:27:55 +080010436
10437 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10438
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010439 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010440
Chia-I Wuf7458c52015-10-26 21:10:41 +080010441 vkDestroySampler(m_device->device(), sampler, NULL);
10442 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10443 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010444}
10445
Karl Schultz6addd812016-02-02 17:17:23 -070010446TEST_F(VkLayerTest, SampleDescriptorUpdateError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010447 // Create a single Sampler descriptor and send it an invalid Sampler
Karl Schultz6addd812016-02-02 17:17:23 -070010448 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010449
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070010450 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00942);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010451
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010452 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010453 // TODO : Farm Descriptor setup code to helper function(s) to reduce copied
10454 // code
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010455 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010456 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLER;
10457 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010458
10459 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010460 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10461 ds_pool_ci.pNext = NULL;
10462 ds_pool_ci.maxSets = 1;
10463 ds_pool_ci.poolSizeCount = 1;
10464 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010465
10466 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010467 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010468 ASSERT_VK_SUCCESS(err);
10469
10470 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010471 dsl_binding.binding = 0;
10472 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10473 dsl_binding.descriptorCount = 1;
10474 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10475 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010476
10477 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010478 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10479 ds_layout_ci.pNext = NULL;
10480 ds_layout_ci.bindingCount = 1;
10481 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010482 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010483 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010484 ASSERT_VK_SUCCESS(err);
10485
10486 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010487 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010488 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010489 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010490 alloc_info.descriptorPool = ds_pool;
10491 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010492 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010493 ASSERT_VK_SUCCESS(err);
10494
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010495 VkSampler sampler = (VkSampler)((size_t)0xbaadbeef); // Sampler with invalid handle
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010496
10497 VkDescriptorImageInfo descriptor_info;
10498 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10499 descriptor_info.sampler = sampler;
10500
10501 VkWriteDescriptorSet descriptor_write;
10502 memset(&descriptor_write, 0, sizeof(descriptor_write));
10503 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010504 descriptor_write.dstSet = descriptorSet;
10505 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010506 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010507 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10508 descriptor_write.pImageInfo = &descriptor_info;
10509
10510 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10511
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010512 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010513
Chia-I Wuf7458c52015-10-26 21:10:41 +080010514 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10515 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010516}
10517
Karl Schultz6addd812016-02-02 17:17:23 -070010518TEST_F(VkLayerTest, ImageViewDescriptorUpdateError) {
10519 // Create a single combined Image/Sampler descriptor and send it an invalid
10520 // imageView
10521 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010522
Karl Schultzf78bcdd2016-11-30 12:36:01 -070010523 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00943);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010524
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010525 ASSERT_NO_FATAL_FAILURE(InitState());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010526 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010527 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10528 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010529
10530 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010531 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10532 ds_pool_ci.pNext = NULL;
10533 ds_pool_ci.maxSets = 1;
10534 ds_pool_ci.poolSizeCount = 1;
10535 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010536
10537 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010538 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010539 ASSERT_VK_SUCCESS(err);
10540
10541 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010542 dsl_binding.binding = 0;
10543 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10544 dsl_binding.descriptorCount = 1;
10545 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10546 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010547
10548 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010549 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10550 ds_layout_ci.pNext = NULL;
10551 ds_layout_ci.bindingCount = 1;
10552 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010553 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010554 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010555 ASSERT_VK_SUCCESS(err);
10556
10557 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010558 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010559 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010560 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010561 alloc_info.descriptorPool = ds_pool;
10562 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010563 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010564 ASSERT_VK_SUCCESS(err);
10565
10566 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010567 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10568 sampler_ci.pNext = NULL;
10569 sampler_ci.magFilter = VK_FILTER_NEAREST;
10570 sampler_ci.minFilter = VK_FILTER_NEAREST;
10571 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10572 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10573 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10574 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10575 sampler_ci.mipLodBias = 1.0;
10576 sampler_ci.anisotropyEnable = VK_FALSE;
10577 sampler_ci.maxAnisotropy = 1;
10578 sampler_ci.compareEnable = VK_FALSE;
10579 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10580 sampler_ci.minLod = 1.0;
10581 sampler_ci.maxLod = 1.0;
10582 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10583 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010584
10585 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010586 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010587 ASSERT_VK_SUCCESS(err);
10588
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010589 VkImageView view = (VkImageView)((size_t)0xbaadbeef); // invalid imageView object
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010590
10591 VkDescriptorImageInfo descriptor_info;
10592 memset(&descriptor_info, 0, sizeof(VkDescriptorImageInfo));
10593 descriptor_info.sampler = sampler;
10594 descriptor_info.imageView = view;
10595
10596 VkWriteDescriptorSet descriptor_write;
10597 memset(&descriptor_write, 0, sizeof(descriptor_write));
10598 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010599 descriptor_write.dstSet = descriptorSet;
10600 descriptor_write.dstBinding = 0;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010601 descriptor_write.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010602 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
10603 descriptor_write.pImageInfo = &descriptor_info;
10604
10605 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10606
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010607 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010608
Chia-I Wuf7458c52015-10-26 21:10:41 +080010609 vkDestroySampler(m_device->device(), sampler, NULL);
10610 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10611 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060010612}
10613
Karl Schultz6addd812016-02-02 17:17:23 -070010614TEST_F(VkLayerTest, CopyDescriptorUpdateErrors) {
10615 // Create DS w/ layout of 2 types, write update 1 and attempt to copy-update
10616 // into the other
10617 VkResult err;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010618
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010619 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10620 " binding #1 with type "
10621 "VK_DESCRIPTOR_TYPE_SAMPLER. Types do "
10622 "not match.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010623
Tobin Ehlis04356f92015-10-27 16:35:27 -060010624 ASSERT_NO_FATAL_FAILURE(InitState());
Karl Schultz6addd812016-02-02 17:17:23 -070010625 // VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010626 VkDescriptorPoolSize ds_type_count[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010627 ds_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10628 ds_type_count[0].descriptorCount = 1;
10629 ds_type_count[1].type = VK_DESCRIPTOR_TYPE_SAMPLER;
10630 ds_type_count[1].descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010631
10632 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010633 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10634 ds_pool_ci.pNext = NULL;
10635 ds_pool_ci.maxSets = 1;
10636 ds_pool_ci.poolSizeCount = 2;
10637 ds_pool_ci.pPoolSizes = ds_type_count;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010638
10639 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010640 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010641 ASSERT_VK_SUCCESS(err);
10642 VkDescriptorSetLayoutBinding dsl_binding[2] = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010643 dsl_binding[0].binding = 0;
10644 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10645 dsl_binding[0].descriptorCount = 1;
10646 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
10647 dsl_binding[0].pImmutableSamplers = NULL;
10648 dsl_binding[1].binding = 1;
10649 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10650 dsl_binding[1].descriptorCount = 1;
10651 dsl_binding[1].stageFlags = VK_SHADER_STAGE_ALL;
10652 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010653
10654 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010655 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10656 ds_layout_ci.pNext = NULL;
10657 ds_layout_ci.bindingCount = 2;
10658 ds_layout_ci.pBindings = dsl_binding;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010659
10660 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010661 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010662 ASSERT_VK_SUCCESS(err);
10663
10664 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010665 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010666 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010667 alloc_info.descriptorSetCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010668 alloc_info.descriptorPool = ds_pool;
10669 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010670 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010671 ASSERT_VK_SUCCESS(err);
10672
10673 VkSamplerCreateInfo sampler_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010674 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
10675 sampler_ci.pNext = NULL;
10676 sampler_ci.magFilter = VK_FILTER_NEAREST;
10677 sampler_ci.minFilter = VK_FILTER_NEAREST;
10678 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
10679 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10680 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10681 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
10682 sampler_ci.mipLodBias = 1.0;
10683 sampler_ci.anisotropyEnable = VK_FALSE;
10684 sampler_ci.maxAnisotropy = 1;
10685 sampler_ci.compareEnable = VK_FALSE;
10686 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
10687 sampler_ci.minLod = 1.0;
10688 sampler_ci.maxLod = 1.0;
10689 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
10690 sampler_ci.unnormalizedCoordinates = VK_FALSE;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010691
10692 VkSampler sampler;
Chia-I Wuf7458c52015-10-26 21:10:41 +080010693 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010694 ASSERT_VK_SUCCESS(err);
10695
10696 VkDescriptorImageInfo info = {};
10697 info.sampler = sampler;
10698
10699 VkWriteDescriptorSet descriptor_write;
10700 memset(&descriptor_write, 0, sizeof(VkWriteDescriptorSet));
10701 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010702 descriptor_write.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010703 descriptor_write.dstBinding = 1; // SAMPLER binding from layout above
Chia-I Wud50a7d72015-10-26 20:48:51 +080010704 descriptor_write.descriptorCount = 1;
Tobin Ehlis04356f92015-10-27 16:35:27 -060010705 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER;
10706 descriptor_write.pImageInfo = &info;
10707 // This write update should succeed
10708 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
10709 // Now perform a copy update that fails due to type mismatch
10710 VkCopyDescriptorSet copy_ds_update;
10711 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10712 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10713 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010714 copy_ds_update.srcBinding = 1; // Copy from SAMPLER binding
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010715 copy_ds_update.dstSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010716 copy_ds_update.dstBinding = 0; // ERROR : copy to UNIFORM binding
10717 copy_ds_update.descriptorCount = 1; // copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010718 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10719
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010720 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010721 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010722 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 -060010723 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10724 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10725 copy_ds_update.srcSet = descriptorSet;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010726 copy_ds_update.srcBinding = 3; // ERROR : Invalid binding for matching layout
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010727 copy_ds_update.dstSet = descriptorSet;
10728 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010729 copy_ds_update.descriptorCount = 1; // Copy 1 descriptor
Tobin Ehlis04356f92015-10-27 16:35:27 -060010730 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10731
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010732 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010733
Tobin Ehlis04356f92015-10-27 16:35:27 -060010734 // Now perform a copy update that fails due to binding out of bounds
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010735 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
10736 " binding#1 with offset index of 1 plus "
10737 "update array offset of 0 and update of "
10738 "5 descriptors oversteps total number "
10739 "of descriptors in set: 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010740
Tobin Ehlis04356f92015-10-27 16:35:27 -060010741 memset(&copy_ds_update, 0, sizeof(VkCopyDescriptorSet));
10742 copy_ds_update.sType = VK_STRUCTURE_TYPE_COPY_DESCRIPTOR_SET;
10743 copy_ds_update.srcSet = descriptorSet;
10744 copy_ds_update.srcBinding = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010745 copy_ds_update.dstSet = descriptorSet;
10746 copy_ds_update.dstBinding = 0;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010747 copy_ds_update.descriptorCount = 5; // ERROR copy 5 descriptors (out of bounds for layout)
Tobin Ehlis04356f92015-10-27 16:35:27 -060010748 vkUpdateDescriptorSets(m_device->device(), 0, NULL, 1, &copy_ds_update);
10749
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010750 m_errorMonitor->VerifyFound();
Tobin Ehlis04356f92015-10-27 16:35:27 -060010751
Chia-I Wuf7458c52015-10-26 21:10:41 +080010752 vkDestroySampler(m_device->device(), sampler, NULL);
10753 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10754 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis04356f92015-10-27 16:35:27 -060010755}
10756
Karl Schultz6addd812016-02-02 17:17:23 -070010757TEST_F(VkLayerTest, NumSamplesMismatch) {
10758 // Create CommandBuffer where MSAA samples doesn't match RenderPass
10759 // sampleCount
10760 VkResult err;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010761
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010762 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Num samples mismatch! ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060010763
Tobin Ehlis3b780662015-05-28 12:11:26 -060010764 ASSERT_NO_FATAL_FAILURE(InitState());
10765 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chia-I Wu1b99bb22015-10-27 19:25:11 +080010766 VkDescriptorPoolSize ds_type_count = {};
Tony Barboureb254902015-07-15 12:50:33 -060010767 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010768 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010769
10770 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010771 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10772 ds_pool_ci.pNext = NULL;
10773 ds_pool_ci.maxSets = 1;
10774 ds_pool_ci.poolSizeCount = 1;
10775 ds_pool_ci.pPoolSizes = &ds_type_count;
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060010776
Tobin Ehlis3b780662015-05-28 12:11:26 -060010777 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010778 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010779 ASSERT_VK_SUCCESS(err);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010780
Tony Barboureb254902015-07-15 12:50:33 -060010781 VkDescriptorSetLayoutBinding dsl_binding = {};
Chia-I Wud46e6ae2015-10-31 00:31:16 +080010782 dsl_binding.binding = 0;
Tony Barboureb254902015-07-15 12:50:33 -060010783 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Chia-I Wu02124482015-11-06 06:42:02 +080010784 dsl_binding.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060010785 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10786 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010787
Tony Barboureb254902015-07-15 12:50:33 -060010788 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10789 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10790 ds_layout_ci.pNext = NULL;
Chia-I Wud50a7d72015-10-26 20:48:51 +080010791 ds_layout_ci.bindingCount = 1;
Jon Ashburn6e23c1f2015-12-30 18:01:16 -070010792 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060010793
Tobin Ehlis3b780662015-05-28 12:11:26 -060010794 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010795 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010796 ASSERT_VK_SUCCESS(err);
10797
10798 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080010799 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080010800 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070010801 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060010802 alloc_info.descriptorPool = ds_pool;
10803 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010804 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010805 ASSERT_VK_SUCCESS(err);
10806
Tony Barboureb254902015-07-15 12:50:33 -060010807 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010808 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070010809 pipe_ms_state_ci.pNext = NULL;
10810 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
10811 pipe_ms_state_ci.sampleShadingEnable = 0;
10812 pipe_ms_state_ci.minSampleShading = 1.0;
10813 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010814
Tony Barboureb254902015-07-15 12:50:33 -060010815 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070010816 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10817 pipeline_layout_ci.pNext = NULL;
10818 pipeline_layout_ci.setLayoutCount = 1;
10819 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis3b780662015-05-28 12:11:26 -060010820
10821 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010822 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis3b780662015-05-28 12:11:26 -060010823 ASSERT_VK_SUCCESS(err);
10824
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010825 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010826 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 -060010827 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010828 VkPipelineObj pipe(m_device);
10829 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060010830 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060010831 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060010832 pipe.SetMSAA(&pipe_ms_state_ci);
10833 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010834
Tony Barbour552f6c02016-12-21 14:34:07 -070010835 m_commandBuffer->BeginCommandBuffer();
10836 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010837 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis3b780662015-05-28 12:11:26 -060010838
Rene Lindsay3bdc7a42017-01-06 13:20:15 -070010839 VkViewport viewport = {0, 0, 16, 16, 0, 1};
10840 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
10841 VkRect2D scissor = {{0, 0}, {16, 16}};
10842 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
10843
Mark Young29927482016-05-04 14:38:51 -060010844 // Render triangle (the error should trigger on the attempt to draw).
10845 Draw(3, 1, 0, 0);
10846
10847 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070010848 m_commandBuffer->EndRenderPass();
10849 m_commandBuffer->EndCommandBuffer();
Mark Young29927482016-05-04 14:38:51 -060010850
Chris Forbes8f36a8a2016-04-07 13:21:07 +120010851 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060010852
Chia-I Wuf7458c52015-10-26 21:10:41 +080010853 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10854 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10855 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis49eb23d2015-05-22 12:38:55 -060010856}
Mark Young29927482016-05-04 14:38:51 -060010857
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010858TEST_F(VkLayerTest, RenderPassIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010859 TEST_DESCRIPTION(
10860 "Hit RenderPass incompatible cases. "
10861 "Initial case is drawing with an active renderpass that's "
10862 "not compatible with the bound pipeline state object's creation renderpass");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010863 VkResult err;
10864
10865 ASSERT_NO_FATAL_FAILURE(InitState());
10866 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10867
10868 VkDescriptorSetLayoutBinding dsl_binding = {};
10869 dsl_binding.binding = 0;
10870 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10871 dsl_binding.descriptorCount = 1;
10872 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10873 dsl_binding.pImmutableSamplers = NULL;
10874
10875 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10876 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10877 ds_layout_ci.pNext = NULL;
10878 ds_layout_ci.bindingCount = 1;
10879 ds_layout_ci.pBindings = &dsl_binding;
10880
10881 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010882 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010883 ASSERT_VK_SUCCESS(err);
10884
10885 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
10886 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
10887 pipeline_layout_ci.pNext = NULL;
10888 pipeline_layout_ci.setLayoutCount = 1;
10889 pipeline_layout_ci.pSetLayouts = &ds_layout;
10890
10891 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010892 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010893 ASSERT_VK_SUCCESS(err);
10894
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010895 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070010896 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 -060010897 // but add it to be able to run on more devices
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010898 // Create a renderpass that will be incompatible with default renderpass
10899 VkAttachmentReference attach = {};
10900 attach.layout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
10901 VkAttachmentReference color_att = {};
10902 color_att.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
10903 VkSubpassDescription subpass = {};
10904 subpass.inputAttachmentCount = 1;
10905 subpass.pInputAttachments = &attach;
10906 subpass.colorAttachmentCount = 1;
10907 subpass.pColorAttachments = &color_att;
10908 VkRenderPassCreateInfo rpci = {};
10909 rpci.subpassCount = 1;
10910 rpci.pSubpasses = &subpass;
10911 rpci.attachmentCount = 1;
10912 VkAttachmentDescription attach_desc = {};
10913 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
Cody Northropbd16af12016-06-21 09:25:48 -060010914 // Format incompatible with PSO RP color attach format B8G8R8A8_UNORM
10915 attach_desc.format = VK_FORMAT_R8G8B8A8_UNORM;
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010916 rpci.pAttachments = &attach_desc;
10917 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
10918 VkRenderPass rp;
10919 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
10920 VkPipelineObj pipe(m_device);
10921 pipe.AddShader(&vs);
10922 pipe.AddShader(&fs);
10923 pipe.AddColorAttachment();
10924 VkViewport view_port = {};
10925 m_viewports.push_back(view_port);
10926 pipe.SetViewport(m_viewports);
10927 VkRect2D rect = {};
10928 m_scissors.push_back(rect);
10929 pipe.SetScissor(m_scissors);
10930 pipe.CreateVKPipeline(pipeline_layout, renderPass());
10931
10932 VkCommandBufferInheritanceInfo cbii = {};
10933 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
10934 cbii.renderPass = rp;
10935 cbii.subpass = 0;
10936 VkCommandBufferBeginInfo cbbi = {};
10937 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
10938 cbbi.pInheritanceInfo = &cbii;
10939 vkBeginCommandBuffer(m_commandBuffer->handle(), &cbbi);
10940 VkRenderPassBeginInfo rpbi = {};
10941 rpbi.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
10942 rpbi.framebuffer = m_framebuffer;
10943 rpbi.renderPass = rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010944 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
10945 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010946
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010947 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, " is incompatible w/ gfx pipeline ");
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010948 // Render triangle (the error should trigger on the attempt to draw).
10949 Draw(3, 1, 0, 0);
10950
10951 // Finalize recording of the command buffer
Tony Barbour552f6c02016-12-21 14:34:07 -070010952 m_commandBuffer->EndRenderPass();
10953 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis85aa15a2016-06-15 10:52:37 -060010954
10955 m_errorMonitor->VerifyFound();
10956
10957 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
10958 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
10959 vkDestroyRenderPass(m_device->device(), rp, NULL);
10960}
10961
Mark Youngc89c6312016-03-31 16:03:20 -060010962TEST_F(VkLayerTest, NumBlendAttachMismatch) {
10963 // Create Pipeline where the number of blend attachments doesn't match the
10964 // number of color attachments. In this case, we don't add any color
10965 // blend attachments even though we have a color attachment.
10966 VkResult err;
10967
Tobin Ehlis974c0d92017-02-01 13:31:22 -070010968 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02109);
Mark Youngc89c6312016-03-31 16:03:20 -060010969
10970 ASSERT_NO_FATAL_FAILURE(InitState());
10971 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
10972 VkDescriptorPoolSize ds_type_count = {};
10973 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10974 ds_type_count.descriptorCount = 1;
10975
10976 VkDescriptorPoolCreateInfo ds_pool_ci = {};
10977 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
10978 ds_pool_ci.pNext = NULL;
10979 ds_pool_ci.maxSets = 1;
10980 ds_pool_ci.poolSizeCount = 1;
10981 ds_pool_ci.pPoolSizes = &ds_type_count;
10982
10983 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060010984 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Mark Youngc89c6312016-03-31 16:03:20 -060010985 ASSERT_VK_SUCCESS(err);
10986
10987 VkDescriptorSetLayoutBinding dsl_binding = {};
10988 dsl_binding.binding = 0;
10989 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
10990 dsl_binding.descriptorCount = 1;
10991 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
10992 dsl_binding.pImmutableSamplers = NULL;
10993
10994 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
10995 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
10996 ds_layout_ci.pNext = NULL;
10997 ds_layout_ci.bindingCount = 1;
10998 ds_layout_ci.pBindings = &dsl_binding;
10999
11000 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011001 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011002 ASSERT_VK_SUCCESS(err);
11003
11004 VkDescriptorSet descriptorSet;
11005 VkDescriptorSetAllocateInfo alloc_info = {};
11006 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11007 alloc_info.descriptorSetCount = 1;
11008 alloc_info.descriptorPool = ds_pool;
11009 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011010 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Mark Youngc89c6312016-03-31 16:03:20 -060011011 ASSERT_VK_SUCCESS(err);
11012
11013 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011014 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Youngc89c6312016-03-31 16:03:20 -060011015 pipe_ms_state_ci.pNext = NULL;
11016 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11017 pipe_ms_state_ci.sampleShadingEnable = 0;
11018 pipe_ms_state_ci.minSampleShading = 1.0;
11019 pipe_ms_state_ci.pSampleMask = NULL;
11020
11021 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11022 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11023 pipeline_layout_ci.pNext = NULL;
11024 pipeline_layout_ci.setLayoutCount = 1;
11025 pipeline_layout_ci.pSetLayouts = &ds_layout;
11026
11027 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011028 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Mark Youngc89c6312016-03-31 16:03:20 -060011029 ASSERT_VK_SUCCESS(err);
11030
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011031 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011032 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 -060011033 // but add it to be able to run on more devices
Mark Youngc89c6312016-03-31 16:03:20 -060011034 VkPipelineObj pipe(m_device);
11035 pipe.AddShader(&vs);
11036 pipe.AddShader(&fs);
11037 pipe.SetMSAA(&pipe_ms_state_ci);
11038 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011039 m_errorMonitor->VerifyFound();
Mark Youngc89c6312016-03-31 16:03:20 -060011040
11041 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11042 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11043 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
11044}
Mark Young29927482016-05-04 14:38:51 -060011045
Mark Muellerd4914412016-06-13 17:52:06 -060011046TEST_F(VkLayerTest, MissingClearAttachment) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011047 TEST_DESCRIPTION(
11048 "Points to a wrong colorAttachment index in a VkClearAttachment "
11049 "structure passed to vkCmdClearAttachments");
Cody Northropc31a84f2016-08-22 10:41:47 -060011050 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070011051 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01114);
Mark Muellerd4914412016-06-13 17:52:06 -060011052
11053 VKTriangleTest(bindStateVertShaderText, bindStateFragShaderText, BsoFailCmdClearAttachments);
11054 m_errorMonitor->VerifyFound();
11055}
11056
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011057TEST_F(VkLayerTest, CmdClearAttachmentTests) {
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011058 TEST_DESCRIPTION("Various tests for validating usage of vkCmdClearAttachments");
11059 VkResult err;
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011060
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011061 ASSERT_NO_FATAL_FAILURE(InitState());
11062 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011063
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011064 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011065 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11066 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011067
11068 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011069 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11070 ds_pool_ci.pNext = NULL;
11071 ds_pool_ci.maxSets = 1;
11072 ds_pool_ci.poolSizeCount = 1;
11073 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011074
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011075 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011076 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011077 ASSERT_VK_SUCCESS(err);
11078
Tony Barboureb254902015-07-15 12:50:33 -060011079 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011080 dsl_binding.binding = 0;
11081 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11082 dsl_binding.descriptorCount = 1;
11083 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11084 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011085
Tony Barboureb254902015-07-15 12:50:33 -060011086 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011087 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11088 ds_layout_ci.pNext = NULL;
11089 ds_layout_ci.bindingCount = 1;
11090 ds_layout_ci.pBindings = &dsl_binding;
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011091
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011092 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011093 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011094 ASSERT_VK_SUCCESS(err);
11095
11096 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011097 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011098 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011099 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011100 alloc_info.descriptorPool = ds_pool;
11101 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011102 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011103 ASSERT_VK_SUCCESS(err);
11104
Tony Barboureb254902015-07-15 12:50:33 -060011105 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011106 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011107 pipe_ms_state_ci.pNext = NULL;
11108 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_4_BIT;
11109 pipe_ms_state_ci.sampleShadingEnable = 0;
11110 pipe_ms_state_ci.minSampleShading = 1.0;
11111 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011112
Tony Barboureb254902015-07-15 12:50:33 -060011113 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011114 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11115 pipeline_layout_ci.pNext = NULL;
11116 pipeline_layout_ci.setLayoutCount = 1;
11117 pipeline_layout_ci.pSetLayouts = &ds_layout;
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011118
11119 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011120 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011121 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski209b5292015-09-17 09:44:05 -060011122
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011123 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Karl Schultzbdb75952016-04-19 11:36:49 -060011124 // We shouldn't need a fragment shader but add it to be able to run
Karl Schultz6addd812016-02-02 17:17:23 -070011125 // on more devices
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011126 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011127
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011128 VkPipelineObj pipe(m_device);
11129 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011130 pipe.AddShader(&fs);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011131 pipe.SetMSAA(&pipe_ms_state_ci);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011132 m_errorMonitor->SetUnexpectedError(
11133 "If pColorBlendState is not NULL, The attachmentCount member of pColorBlendState must be equal to the colorAttachmentCount "
11134 "used to create subpass");
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011135 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011136
Tony Barbour552f6c02016-12-21 14:34:07 -070011137 m_commandBuffer->BeginCommandBuffer();
11138 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011139
Karl Schultz6addd812016-02-02 17:17:23 -070011140 // Main thing we care about for this test is that the VkImage obj we're
11141 // clearing matches Color Attachment of FB
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011142 // Also pass down other dummy params to keep driver and paramchecker happy
Courtney Goeltzenleuchterc9323e02015-10-15 16:51:05 -060011143 VkClearAttachment color_attachment;
11144 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11145 color_attachment.clearValue.color.float32[0] = 1.0;
11146 color_attachment.clearValue.color.float32[1] = 1.0;
11147 color_attachment.clearValue.color.float32[2] = 1.0;
11148 color_attachment.clearValue.color.float32[3] = 1.0;
11149 color_attachment.colorAttachment = 0;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011150 VkClearRect clear_rect = {{{0, 0}, {(uint32_t)m_width, (uint32_t)m_height}}};
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011151
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011152 // Call for full-sized FB Color attachment prior to issuing a Draw
11153 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070011154 "vkCmdClearAttachments() issued on command buffer object ");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011155 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011156 m_errorMonitor->VerifyFound();
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011157
Mark Lobodzinskie0d1f4f2017-01-18 15:44:53 -070011158 clear_rect.rect.extent.width = renderPassBeginInfo().renderArea.extent.width + 4;
11159 clear_rect.rect.extent.height = clear_rect.rect.extent.height / 2;
11160 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01115);
11161 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
11162 m_errorMonitor->VerifyFound();
11163
11164 clear_rect.rect.extent.width = (uint32_t)m_width / 2;
11165 clear_rect.layerCount = 2;
11166 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01116);
11167 vkCmdClearAttachments(m_commandBuffer->GetBufferHandle(), 1, &color_attachment, 1, &clear_rect);
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011168 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011169
Chia-I Wuf7458c52015-10-26 21:10:41 +080011170 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11171 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11172 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis53eddda2015-07-01 16:46:13 -060011173}
11174
Karl Schultz6addd812016-02-02 17:17:23 -070011175TEST_F(VkLayerTest, VtxBufferBadIndex) {
11176 VkResult err;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011177
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011178 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11179 "but no vertex buffers are attached to this Pipeline State Object");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060011180
Tobin Ehlis502480b2015-06-24 15:53:07 -060011181 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisd332f282015-10-02 11:00:56 -060011182 ASSERT_NO_FATAL_FAILURE(InitViewport());
Tobin Ehlis502480b2015-06-24 15:53:07 -060011183 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Tony Barboureb254902015-07-15 12:50:33 -060011184
Chia-I Wu1b99bb22015-10-27 19:25:11 +080011185 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011186 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11187 ds_type_count.descriptorCount = 1;
Tony Barboureb254902015-07-15 12:50:33 -060011188
11189 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011190 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11191 ds_pool_ci.pNext = NULL;
11192 ds_pool_ci.maxSets = 1;
11193 ds_pool_ci.poolSizeCount = 1;
11194 ds_pool_ci.pPoolSizes = &ds_type_count;
Tony Barboureb254902015-07-15 12:50:33 -060011195
Courtney Goeltzenleuchterfe908d32015-09-16 16:12:45 -060011196 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011197 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011198 ASSERT_VK_SUCCESS(err);
11199
Tony Barboureb254902015-07-15 12:50:33 -060011200 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011201 dsl_binding.binding = 0;
11202 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
11203 dsl_binding.descriptorCount = 1;
11204 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
11205 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011206
Tony Barboureb254902015-07-15 12:50:33 -060011207 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011208 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11209 ds_layout_ci.pNext = NULL;
11210 ds_layout_ci.bindingCount = 1;
11211 ds_layout_ci.pBindings = &dsl_binding;
Tony Barboureb254902015-07-15 12:50:33 -060011212
Tobin Ehlis502480b2015-06-24 15:53:07 -060011213 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011214 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011215 ASSERT_VK_SUCCESS(err);
11216
11217 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080011218 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080011219 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070011220 alloc_info.descriptorSetCount = 1;
Courtney Goeltzenleuchterbee18a92015-10-23 14:21:05 -060011221 alloc_info.descriptorPool = ds_pool;
11222 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011223 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011224 ASSERT_VK_SUCCESS(err);
11225
Tony Barboureb254902015-07-15 12:50:33 -060011226 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011227 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070011228 pipe_ms_state_ci.pNext = NULL;
11229 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11230 pipe_ms_state_ci.sampleShadingEnable = 0;
11231 pipe_ms_state_ci.minSampleShading = 1.0;
11232 pipe_ms_state_ci.pSampleMask = NULL;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011233
Tony Barboureb254902015-07-15 12:50:33 -060011234 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070011235 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11236 pipeline_layout_ci.pNext = NULL;
11237 pipeline_layout_ci.setLayoutCount = 1;
11238 pipeline_layout_ci.pSetLayouts = &ds_layout;
11239 VkPipelineLayout pipeline_layout;
Tobin Ehlis502480b2015-06-24 15:53:07 -060011240
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011241 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011242 ASSERT_VK_SUCCESS(err);
11243
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011244 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011245 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 -060011246 // but add it to be able to run on more devices
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011247 VkPipelineObj pipe(m_device);
11248 pipe.AddShader(&vs);
Tony Barbour1c94d372015-08-06 11:21:08 -060011249 pipe.AddShader(&fs);
Mark Youngc89c6312016-03-31 16:03:20 -060011250 pipe.AddColorAttachment();
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011251 pipe.SetMSAA(&pipe_ms_state_ci);
Tobin Ehlisd332f282015-10-02 11:00:56 -060011252 pipe.SetViewport(m_viewports);
11253 pipe.SetScissor(m_scissors);
Tony Barbour62e1a5b2015-08-06 10:16:07 -060011254 pipe.CreateVKPipeline(pipeline_layout, renderPass());
Tony Barbourfe3351b2015-07-28 10:17:20 -060011255
Tony Barbour552f6c02016-12-21 14:34:07 -070011256 m_commandBuffer->BeginCommandBuffer();
11257 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011258 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisf7bf4502015-09-09 15:12:35 -060011259 // Don't care about actual data, just need to get to draw to flag error
11260 static const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011261 VkConstantBufferObj vbo(m_device, sizeof(vbo_data), sizeof(float), (const void *)&vbo_data);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011262 BindVertexBuffer(&vbo, (VkDeviceSize)0, 1); // VBO idx 1, but no VBO in PSO
Courtney Goeltzenleuchter08c26372015-09-23 12:31:50 -060011263 Draw(1, 0, 0, 0);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011264
Chris Forbes8f36a8a2016-04-07 13:21:07 +120011265 m_errorMonitor->VerifyFound();
Mike Stroyand1c84a52015-08-18 14:40:24 -060011266
Chia-I Wuf7458c52015-10-26 21:10:41 +080011267 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11268 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
11269 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Tobin Ehlis502480b2015-06-24 15:53:07 -060011270}
Mark Muellerdfe37552016-07-07 14:47:42 -060011271
Mark Mueller2ee294f2016-08-04 12:59:48 -060011272TEST_F(VkLayerTest, MismatchCountQueueCreateRequestedFeature) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011273 TEST_DESCRIPTION(
11274 "Use an invalid count in a vkEnumeratePhysicalDevices call."
11275 "Use invalid Queue Family Index in vkCreateDevice");
Cody Northropc31a84f2016-08-22 10:41:47 -060011276 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Mueller2ee294f2016-08-04 12:59:48 -060011277
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011278 const char *invalid_queueFamilyIndex_message =
11279 "Invalid queue create request in vkCreateDevice(). Invalid "
11280 "queueFamilyIndex ";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011281
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011282 const char *unavailable_feature_message = "While calling vkCreateDevice(), requesting feature #";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011283
Mark Mueller880fce52016-08-17 15:23:23 -060011284 // The following test fails with recent NVidia drivers.
11285 // By the time core_validation is reached, the NVidia
11286 // driver has sanitized the invalid condition and core_validation
11287 // is not introduced to the failure condition. This is not the case
11288 // with AMD and Mesa drivers. Futher investigation is required
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011289 // uint32_t count = static_cast<uint32_t>(~0);
11290 // VkPhysicalDevice physical_device;
11291 // vkEnumeratePhysicalDevices(instance(), &count, &physical_device);
11292 // m_errorMonitor->VerifyFound();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011293
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011294 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queueFamilyIndex_message);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011295 float queue_priority = 0.0;
11296
11297 VkDeviceQueueCreateInfo queue_create_info = {};
11298 queue_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11299 queue_create_info.queueCount = 1;
11300 queue_create_info.pQueuePriorities = &queue_priority;
11301 queue_create_info.queueFamilyIndex = static_cast<uint32_t>(~0);
11302
11303 VkPhysicalDeviceFeatures features = m_device->phy().features();
11304 VkDevice testDevice;
11305 VkDeviceCreateInfo device_create_info = {};
11306 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11307 device_create_info.queueCreateInfoCount = 1;
11308 device_create_info.pQueueCreateInfos = &queue_create_info;
11309 device_create_info.pEnabledFeatures = &features;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011310 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011311 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11312 m_errorMonitor->VerifyFound();
11313
11314 queue_create_info.queueFamilyIndex = 1;
11315
11316 unsigned feature_count = sizeof(VkPhysicalDeviceFeatures) / sizeof(VkBool32);
11317 VkBool32 *feature_array = reinterpret_cast<VkBool32 *>(&features);
11318 for (unsigned i = 0; i < feature_count; i++) {
11319 if (VK_FALSE == feature_array[i]) {
11320 feature_array[i] = VK_TRUE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011321 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, unavailable_feature_message);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011322 device_create_info.pEnabledFeatures = &features;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011323 m_errorMonitor->SetUnexpectedError(
11324 "You requested features that are unavailable on this device. You should first query feature availability by "
11325 "calling vkGetPhysicalDeviceFeatures().");
11326 m_errorMonitor->SetUnexpectedError("Failed to create device chain.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011327 vkCreateDevice(gpu(), &device_create_info, nullptr, &testDevice);
11328 m_errorMonitor->VerifyFound();
11329 break;
11330 }
11331 }
11332}
11333
Tobin Ehlis16edf082016-11-21 12:33:49 -070011334TEST_F(VkLayerTest, InvalidQueryPoolCreate) {
11335 TEST_DESCRIPTION("Attempt to create a query pool for PIPELINE_STATISTICS without enabling pipeline stats for the device.");
11336
11337 ASSERT_NO_FATAL_FAILURE(InitState());
11338
11339 const std::vector<VkQueueFamilyProperties> queue_props = m_device->queue_props;
11340 std::vector<VkDeviceQueueCreateInfo> queue_info;
11341 queue_info.reserve(queue_props.size());
11342 std::vector<std::vector<float>> queue_priorities;
11343 for (uint32_t i = 0; i < (uint32_t)queue_props.size(); i++) {
11344 VkDeviceQueueCreateInfo qi{};
11345 qi.sType = VK_STRUCTURE_TYPE_DEVICE_QUEUE_CREATE_INFO;
11346 qi.queueFamilyIndex = i;
11347 qi.queueCount = queue_props[i].queueCount;
11348 queue_priorities.emplace_back(qi.queueCount, 0.0f);
11349 qi.pQueuePriorities = queue_priorities[i].data();
11350 queue_info.push_back(qi);
11351 }
11352
11353 std::vector<const char *> device_extension_names;
11354
11355 VkDevice local_device;
11356 VkDeviceCreateInfo device_create_info = {};
11357 auto features = m_device->phy().features();
11358 // Intentionally disable pipeline stats
11359 features.pipelineStatisticsQuery = VK_FALSE;
11360 device_create_info.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
11361 device_create_info.pNext = NULL;
11362 device_create_info.queueCreateInfoCount = queue_info.size();
11363 device_create_info.pQueueCreateInfos = queue_info.data();
11364 device_create_info.enabledLayerCount = 0;
11365 device_create_info.ppEnabledLayerNames = NULL;
11366 device_create_info.pEnabledFeatures = &features;
11367 VkResult err = vkCreateDevice(gpu(), &device_create_info, nullptr, &local_device);
11368 ASSERT_VK_SUCCESS(err);
11369
11370 VkQueryPoolCreateInfo qpci{};
11371 qpci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11372 qpci.queryType = VK_QUERY_TYPE_PIPELINE_STATISTICS;
11373 qpci.queryCount = 1;
11374 VkQueryPool query_pool;
11375
11376 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01006);
11377 vkCreateQueryPool(local_device, &qpci, nullptr, &query_pool);
11378 m_errorMonitor->VerifyFound();
11379
11380 vkDestroyDevice(local_device, nullptr);
11381}
11382
Mark Mueller2ee294f2016-08-04 12:59:48 -060011383TEST_F(VkLayerTest, InvalidQueueIndexInvalidQuery) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011384 TEST_DESCRIPTION(
11385 "Use an invalid queue index in a vkCmdWaitEvents call."
11386 "End a command buffer with a query still in progress.");
Mark Mueller2ee294f2016-08-04 12:59:48 -060011387
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011388 const char *invalid_queue_index =
11389 "was created with sharingMode of VK_SHARING_MODE_EXCLUSIVE. If one "
11390 "of src- or dstQueueFamilyIndex is VK_QUEUE_FAMILY_IGNORED, both "
11391 "must be.";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011392
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011393 const char *invalid_query = "Ending command buffer with in progress query: queryPool 0x";
Mark Mueller2ee294f2016-08-04 12:59:48 -060011394
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011395 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_queue_index);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011396
11397 ASSERT_NO_FATAL_FAILURE(InitState());
11398
11399 VkEvent event;
11400 VkEventCreateInfo event_create_info{};
11401 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
11402 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
11403
Mark Mueller2ee294f2016-08-04 12:59:48 -060011404 VkQueue queue = VK_NULL_HANDLE;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011405 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011406
Tony Barbour552f6c02016-12-21 14:34:07 -070011407 m_commandBuffer->BeginCommandBuffer();
Mark Mueller2ee294f2016-08-04 12:59:48 -060011408
11409 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011410 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 -060011411 ASSERT_TRUE(image.initialized());
11412 VkImageMemoryBarrier img_barrier = {};
11413 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11414 img_barrier.pNext = NULL;
11415 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
11416 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
11417 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11418 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
11419 img_barrier.image = image.handle();
11420 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
Mark Lobodzinski2a74c5c2016-08-17 13:26:28 -060011421
11422 // QueueFamilyIndex must be VK_QUEUE_FAMILY_IGNORED, this verifies
11423 // that layer validation catches the case when it is not.
11424 img_barrier.dstQueueFamilyIndex = 0;
Mark Mueller2ee294f2016-08-04 12:59:48 -060011425 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11426 img_barrier.subresourceRange.baseArrayLayer = 0;
11427 img_barrier.subresourceRange.baseMipLevel = 0;
11428 img_barrier.subresourceRange.layerCount = 1;
11429 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011430 vkCmdWaitEvents(m_commandBuffer->handle(), 1, &event, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0,
11431 nullptr, 0, nullptr, 1, &img_barrier);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011432 m_errorMonitor->VerifyFound();
11433
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011434 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_query);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011435
11436 VkQueryPool query_pool;
11437 VkQueryPoolCreateInfo query_pool_create_info = {};
11438 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
11439 query_pool_create_info.queryType = VK_QUERY_TYPE_OCCLUSION;
11440 query_pool_create_info.queryCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011441 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011442
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011443 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0 /*startQuery*/, 1 /*queryCount*/);
Mark Mueller2ee294f2016-08-04 12:59:48 -060011444 vkCmdBeginQuery(m_commandBuffer->handle(), query_pool, 0, 0);
11445
11446 vkEndCommandBuffer(m_commandBuffer->handle());
11447 m_errorMonitor->VerifyFound();
11448
11449 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
11450 vkDestroyEvent(m_device->device(), event, nullptr);
11451}
11452
Mark Muellerdfe37552016-07-07 14:47:42 -060011453TEST_F(VkLayerTest, VertexBufferInvalid) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011454 TEST_DESCRIPTION(
11455 "Submit a command buffer using deleted vertex buffer, "
11456 "delete a buffer twice, use an invalid offset for each "
11457 "buffer type, and attempt to bind a null buffer");
Mark Muellerdfe37552016-07-07 14:47:42 -060011458
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011459 const char *deleted_buffer_in_command_buffer =
11460 "Cannot submit cmd buffer "
11461 "using deleted buffer ";
11462 const char *invalid_offset_message =
11463 "vkBindBufferMemory(): "
11464 "memoryOffset is 0x";
11465 const char *invalid_storage_buffer_offset_message =
11466 "vkBindBufferMemory(): "
11467 "storage memoryOffset "
11468 "is 0x";
11469 const char *invalid_texel_buffer_offset_message =
11470 "vkBindBufferMemory(): "
11471 "texel memoryOffset "
11472 "is 0x";
11473 const char *invalid_uniform_buffer_offset_message =
11474 "vkBindBufferMemory(): "
11475 "uniform memoryOffset "
11476 "is 0x";
Mark Muellerdfe37552016-07-07 14:47:42 -060011477
11478 ASSERT_NO_FATAL_FAILURE(InitState());
11479 ASSERT_NO_FATAL_FAILURE(InitViewport());
11480 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
11481
11482 VkPipelineMultisampleStateCreateInfo pipe_ms_state_ci = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011483 pipe_ms_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
Mark Muellerdfe37552016-07-07 14:47:42 -060011484 pipe_ms_state_ci.pNext = NULL;
11485 pipe_ms_state_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
11486 pipe_ms_state_ci.sampleShadingEnable = 0;
11487 pipe_ms_state_ci.minSampleShading = 1.0;
11488 pipe_ms_state_ci.pSampleMask = nullptr;
11489
11490 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11491 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11492 VkPipelineLayout pipeline_layout;
11493
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011494 VkResult err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, nullptr, &pipeline_layout);
Mark Muellerdfe37552016-07-07 14:47:42 -060011495 ASSERT_VK_SUCCESS(err);
11496
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011497 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
11498 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Muellerdfe37552016-07-07 14:47:42 -060011499 VkPipelineObj pipe(m_device);
11500 pipe.AddShader(&vs);
11501 pipe.AddShader(&fs);
11502 pipe.AddColorAttachment();
11503 pipe.SetMSAA(&pipe_ms_state_ci);
11504 pipe.SetViewport(m_viewports);
11505 pipe.SetScissor(m_scissors);
11506 pipe.CreateVKPipeline(pipeline_layout, renderPass());
11507
Tony Barbour552f6c02016-12-21 14:34:07 -070011508 m_commandBuffer->BeginCommandBuffer();
11509 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011510 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Mark Muellerdfe37552016-07-07 14:47:42 -060011511
11512 {
11513 // Create and bind a vertex buffer in a reduced scope, which will cause
11514 // it to be deleted upon leaving this scope
11515 const float vbo_data[3] = {1.f, 0.f, 1.f};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011516 VkVerticesObj draw_verticies(m_device, 1, 1, sizeof(vbo_data), 3, vbo_data);
Mark Muellerdfe37552016-07-07 14:47:42 -060011517 draw_verticies.BindVertexBuffers(m_commandBuffer->handle());
11518 draw_verticies.AddVertexInputToPipe(pipe);
11519 }
11520
11521 Draw(1, 0, 0, 0);
11522
Tony Barbour552f6c02016-12-21 14:34:07 -070011523 m_commandBuffer->EndRenderPass();
11524 m_commandBuffer->EndCommandBuffer();
Mark Muellerdfe37552016-07-07 14:47:42 -060011525
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011526 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, deleted_buffer_in_command_buffer);
Mark Muellerdfe37552016-07-07 14:47:42 -060011527 QueueCommandBuffer(false);
11528 m_errorMonitor->VerifyFound();
11529
11530 {
11531 // Create and bind a vertex buffer in a reduced scope, and delete it
11532 // twice, the second through the destructor
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011533 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eDoubleDelete);
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011534 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00680);
Mark Muellerdfe37552016-07-07 14:47:42 -060011535 buffer_test.TestDoubleDestroy();
11536 }
11537 m_errorMonitor->VerifyFound();
11538
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011539 m_errorMonitor->SetUnexpectedError("value of pCreateInfo->usage must not be 0");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011540 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidMemoryOffset)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011541 // Create and bind a memory buffer with an invalid offset.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011542 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011543 m_errorMonitor->SetUnexpectedError(
11544 "If buffer was created with the VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT or VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT, "
11545 "memoryOffset must be a multiple of VkPhysicalDeviceLimits::minTexelBufferOffsetAlignment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011546 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidMemoryOffset);
11547 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011548 m_errorMonitor->VerifyFound();
11549 }
11550
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011551 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset,
11552 VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011553 // Create and bind a memory buffer with an invalid offset again,
11554 // but look for a texel buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011555 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_texel_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011556 m_errorMonitor->SetUnexpectedError(
11557 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11558 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011559 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_TEXEL_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11560 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011561 m_errorMonitor->VerifyFound();
11562 }
11563
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011564 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011565 // Create and bind a memory buffer with an invalid offset again, but
11566 // look for a uniform buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011567 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_uniform_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011568 m_errorMonitor->SetUnexpectedError(
11569 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11570 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011571 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11572 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011573 m_errorMonitor->VerifyFound();
11574 }
11575
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011576 if (VkBufferTest::GetTestConditionValid(m_device, VkBufferTest::eInvalidDeviceOffset, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT)) {
Mark Muellerdfe37552016-07-07 14:47:42 -060011577 // Create and bind a memory buffer with an invalid offset again, but
11578 // look for a storage buffer message.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011579 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, invalid_storage_buffer_offset_message);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011580 m_errorMonitor->SetUnexpectedError(
11581 "memoryOffset must be an integer multiple of the alignment member of the VkMemoryRequirements structure returned from "
11582 "a call to vkGetBufferMemoryRequirements with buffer");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011583 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eInvalidDeviceOffset);
11584 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011585 m_errorMonitor->VerifyFound();
11586 }
11587
11588 {
11589 // Attempt to bind a null buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011590 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00799);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011591 m_errorMonitor->SetUnexpectedError("required parameter memory specified as VK_NULL_HANDLE");
11592 m_errorMonitor->SetUnexpectedError("memory must be a valid VkDeviceMemory handle");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011593 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eBindNullBuffer);
11594 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011595 m_errorMonitor->VerifyFound();
11596 }
11597
11598 {
11599 // Attempt to use an invalid handle to delete a buffer.
Karl Schultzf78bcdd2016-11-30 12:36:01 -070011600 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00622);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011601 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT, VkBufferTest::eFreeInvalidHandle);
11602 (void)buffer_test;
Mark Muellerdfe37552016-07-07 14:47:42 -060011603 }
11604 m_errorMonitor->VerifyFound();
11605
11606 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
11607}
11608
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011609// INVALID_IMAGE_LAYOUT tests (one other case is hit by MapMemWithoutHostVisibleBit and not here)
11610TEST_F(VkLayerTest, InvalidImageLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011611 TEST_DESCRIPTION(
11612 "Hit all possible validation checks associated with the "
11613 "DRAWSTATE_INVALID_IMAGE_LAYOUT enum. Generally these involve having"
11614 "images in the wrong layout when they're copied or transitioned.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011615 // 3 in ValidateCmdBufImageLayouts
11616 // * -1 Attempt to submit cmd buf w/ deleted image
11617 // * -2 Cmd buf submit of image w/ layout not matching first use w/ subresource
11618 // * -3 Cmd buf submit of image w/ layout not matching first use w/o subresource
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011619
11620 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf887b162017-03-09 10:06:46 -070011621 auto depth_format = find_depth_stencil_format(m_device);
11622 if (!depth_format) {
11623 printf(" No Depth + Stencil format found. Skipped.\n");
11624 return;
11625 }
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011626 // Create src & dst images to use for copy operations
11627 VkImage src_image;
11628 VkImage dst_image;
Cort3b021012016-12-07 12:00:57 -080011629 VkImage depth_image;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011630
11631 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
11632 const int32_t tex_width = 32;
11633 const int32_t tex_height = 32;
11634
11635 VkImageCreateInfo image_create_info = {};
11636 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
11637 image_create_info.pNext = NULL;
11638 image_create_info.imageType = VK_IMAGE_TYPE_2D;
11639 image_create_info.format = tex_format;
11640 image_create_info.extent.width = tex_width;
11641 image_create_info.extent.height = tex_height;
11642 image_create_info.extent.depth = 1;
11643 image_create_info.mipLevels = 1;
11644 image_create_info.arrayLayers = 4;
11645 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
11646 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
11647 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Cort3b021012016-12-07 12:00:57 -080011648 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011649 image_create_info.flags = 0;
11650
11651 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &src_image);
11652 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011653 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011654 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dst_image);
11655 ASSERT_VK_SUCCESS(err);
Cort3b021012016-12-07 12:00:57 -080011656 image_create_info.format = VK_FORMAT_D32_SFLOAT;
11657 image_create_info.usage |= VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
11658 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &depth_image);
11659 ASSERT_VK_SUCCESS(err);
11660
11661 // Allocate memory
11662 VkMemoryRequirements img_mem_reqs = {};
Cort530cf382016-12-08 09:59:47 -080011663 VkMemoryAllocateInfo mem_alloc = {};
Cort3b021012016-12-07 12:00:57 -080011664 VkDeviceMemory src_image_mem, dst_image_mem, depth_image_mem;
Cort530cf382016-12-08 09:59:47 -080011665 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
11666 mem_alloc.pNext = NULL;
11667 mem_alloc.allocationSize = 0;
11668 mem_alloc.memoryTypeIndex = 0;
Cort3b021012016-12-07 12:00:57 -080011669
11670 vkGetImageMemoryRequirements(m_device->device(), src_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011671 mem_alloc.allocationSize = img_mem_reqs.size;
11672 bool pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011673 ASSERT_TRUE(pass);
Cort530cf382016-12-08 09:59:47 -080011674 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &src_image_mem);
Cort3b021012016-12-07 12:00:57 -080011675 ASSERT_VK_SUCCESS(err);
11676
11677 vkGetImageMemoryRequirements(m_device->device(), dst_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011678 mem_alloc.allocationSize = img_mem_reqs.size;
11679 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011680 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011681 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &dst_image_mem);
Cort3b021012016-12-07 12:00:57 -080011682 ASSERT_VK_SUCCESS(err);
11683
11684 vkGetImageMemoryRequirements(m_device->device(), depth_image, &img_mem_reqs);
Cort530cf382016-12-08 09:59:47 -080011685 mem_alloc.allocationSize = img_mem_reqs.size;
11686 pass = m_device->phy().set_memory_type(img_mem_reqs.memoryTypeBits, &mem_alloc, 0);
Cort3b021012016-12-07 12:00:57 -080011687 ASSERT_VK_SUCCESS(err);
Cort530cf382016-12-08 09:59:47 -080011688 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &depth_image_mem);
Cort3b021012016-12-07 12:00:57 -080011689 ASSERT_VK_SUCCESS(err);
11690
11691 err = vkBindImageMemory(m_device->device(), src_image, src_image_mem, 0);
11692 ASSERT_VK_SUCCESS(err);
11693 err = vkBindImageMemory(m_device->device(), dst_image, dst_image_mem, 0);
11694 ASSERT_VK_SUCCESS(err);
11695 err = vkBindImageMemory(m_device->device(), depth_image, depth_image_mem, 0);
11696 ASSERT_VK_SUCCESS(err);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011697
Tony Barbour552f6c02016-12-21 14:34:07 -070011698 m_commandBuffer->BeginCommandBuffer();
Cort530cf382016-12-08 09:59:47 -080011699 VkImageCopy copy_region;
11700 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11701 copy_region.srcSubresource.mipLevel = 0;
11702 copy_region.srcSubresource.baseArrayLayer = 0;
11703 copy_region.srcSubresource.layerCount = 1;
11704 copy_region.srcOffset.x = 0;
11705 copy_region.srcOffset.y = 0;
11706 copy_region.srcOffset.z = 0;
11707 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11708 copy_region.dstSubresource.mipLevel = 0;
11709 copy_region.dstSubresource.baseArrayLayer = 0;
11710 copy_region.dstSubresource.layerCount = 1;
11711 copy_region.dstOffset.x = 0;
11712 copy_region.dstOffset.y = 0;
11713 copy_region.dstOffset.z = 0;
11714 copy_region.extent.width = 1;
11715 copy_region.extent.height = 1;
11716 copy_region.extent.depth = 1;
11717
11718 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11719 "Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011720 m_errorMonitor->SetUnexpectedError("Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011721 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 -060011722 m_errorMonitor->VerifyFound();
11723 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011724 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11725 "Cannot copy from an image whose source layout is "
11726 "VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current "
11727 "layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011728 m_errorMonitor->SetUnexpectedError(
11729 "srcImageLayout must be either of VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL");
Cort530cf382016-12-08 09:59:47 -080011730 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 -060011731 m_errorMonitor->VerifyFound();
11732 // Final src error is due to bad layout type
11733 m_errorMonitor->SetDesiredFailureMsg(
11734 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11735 "Layout for input image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_SRC_OPTIMAL or GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011736 m_errorMonitor->SetUnexpectedError(
11737 "Cannot copy from an image whose source layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout "
11738 "VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011739 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 -060011740 m_errorMonitor->VerifyFound();
11741 // Now verify same checks for dst
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11743 "Layout for output image should be TRANSFER_DST_OPTIMAL instead of GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011744 m_errorMonitor->SetUnexpectedError("Layout for input image should be TRANSFER_SRC_OPTIMAL instead of GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011745 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 -060011746 m_errorMonitor->VerifyFound();
11747 // Now cause error due to src image layout changing
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011748 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11749 "Cannot copy from an image whose dest layout is "
11750 "VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current "
11751 "layout VK_IMAGE_LAYOUT_GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011752 m_errorMonitor->SetUnexpectedError(
11753 "dstImageLayout must be either of VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL or VK_IMAGE_LAYOUT_GENERAL");
Cort530cf382016-12-08 09:59:47 -080011754 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 -060011755 m_errorMonitor->VerifyFound();
11756 m_errorMonitor->SetDesiredFailureMsg(
11757 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11758 "Layout for output image is VK_IMAGE_LAYOUT_UNDEFINED but can only be TRANSFER_DST_OPTIMAL or GENERAL.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070011759 m_errorMonitor->SetUnexpectedError(
11760 "Cannot copy from an image whose dest layout is VK_IMAGE_LAYOUT_UNDEFINED and doesn't match the current layout "
11761 "VK_IMAGE_LAYOUT_GENERAL.");
Cort530cf382016-12-08 09:59:47 -080011762 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 -060011763 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011764
Cort3b021012016-12-07 12:00:57 -080011765 // Convert dst and depth images to TRANSFER_DST for subsequent tests
11766 VkImageMemoryBarrier transfer_dst_image_barrier[1] = {};
11767 transfer_dst_image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
11768 transfer_dst_image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
11769 transfer_dst_image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
11770 transfer_dst_image_barrier[0].srcAccessMask = 0;
11771 transfer_dst_image_barrier[0].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT;
11772 transfer_dst_image_barrier[0].image = dst_image;
11773 transfer_dst_image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11774 transfer_dst_image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
11775 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11776 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11777 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11778 transfer_dst_image_barrier[0].image = depth_image;
11779 transfer_dst_image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
11780 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11781 NULL, 0, NULL, 1, transfer_dst_image_barrier);
11782
11783 // Cause errors due to clearing with invalid image layouts
Cort530cf382016-12-08 09:59:47 -080011784 VkClearColorValue color_clear_value = {};
11785 VkImageSubresourceRange clear_range;
11786 clear_range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
11787 clear_range.baseMipLevel = 0;
11788 clear_range.baseArrayLayer = 0;
11789 clear_range.layerCount = 1;
11790 clear_range.levelCount = 1;
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011791
Cort3b021012016-12-07 12:00:57 -080011792 // Fail due to explicitly prohibited layout for color clear (only GENERAL and TRANSFER_DST are permitted).
11793 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11794 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01086);
11795 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011796 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_UNDEFINED, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011797 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011798 // Fail due to provided layout not matching actual current layout for color clear.
11799 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01085);
Cort530cf382016-12-08 09:59:47 -080011800 m_commandBuffer->ClearColorImage(dst_image, VK_IMAGE_LAYOUT_GENERAL, &color_clear_value, 1, &clear_range);
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011801 m_errorMonitor->VerifyFound();
Cort3b021012016-12-07 12:00:57 -080011802
Cort530cf382016-12-08 09:59:47 -080011803 VkClearDepthStencilValue depth_clear_value = {};
11804 clear_range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
Cort3b021012016-12-07 12:00:57 -080011805
11806 // Fail due to explicitly prohibited layout for depth clear (only GENERAL and TRANSFER_DST are permitted).
11807 // Since the image is currently not in UNDEFINED layout, this will emit two errors.
11808 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01101);
11809 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011810 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_UNDEFINED, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011811 m_errorMonitor->VerifyFound();
11812 // Fail due to provided layout not matching actual current layout for depth clear.
11813 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01100);
Cort530cf382016-12-08 09:59:47 -080011814 m_commandBuffer->ClearDepthStencilImage(depth_image, VK_IMAGE_LAYOUT_GENERAL, &depth_clear_value, 1, &clear_range);
Cort3b021012016-12-07 12:00:57 -080011815 m_errorMonitor->VerifyFound();
Slawomir Cygan4f73b7f2016-11-28 19:17:38 +010011816
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011817 // Now cause error due to bad image layout transition in PipelineBarrier
11818 VkImageMemoryBarrier image_barrier[1] = {};
Cort3b021012016-12-07 12:00:57 -080011819 image_barrier[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011820 image_barrier[0].oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
Cort3b021012016-12-07 12:00:57 -080011821 image_barrier[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011822 image_barrier[0].image = src_image;
Cort3b021012016-12-07 12:00:57 -080011823 image_barrier[0].subresourceRange.layerCount = image_create_info.arrayLayers;
11824 image_barrier[0].subresourceRange.levelCount = image_create_info.mipLevels;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011825 image_barrier[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011826 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11827 "You cannot transition the layout of aspect 1 from "
11828 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL when "
11829 "current layout is VK_IMAGE_LAYOUT_GENERAL.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011830 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT, 0, 0,
11831 NULL, 0, NULL, 1, image_barrier);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011832 m_errorMonitor->VerifyFound();
11833
11834 // Finally some layout errors at RenderPass create time
11835 // Just hacking in specific state to get to the errors we want so don't copy this unless you know what you're doing.
11836 VkAttachmentReference attach = {};
11837 // perf warning for GENERAL layout w/ non-DS input attachment
11838 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11839 VkSubpassDescription subpass = {};
11840 subpass.inputAttachmentCount = 1;
11841 subpass.pInputAttachments = &attach;
11842 VkRenderPassCreateInfo rpci = {};
11843 rpci.subpassCount = 1;
11844 rpci.pSubpasses = &subpass;
11845 rpci.attachmentCount = 1;
11846 VkAttachmentDescription attach_desc = {};
11847 attach_desc.format = VK_FORMAT_UNDEFINED;
11848 rpci.pAttachments = &attach_desc;
Tobin Ehlis1efce022016-05-11 10:40:34 -060011849 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011850 VkRenderPass rp;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011851 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11852 "Layout for input attachment is GENERAL but should be READ_ONLY_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011853 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11854 m_errorMonitor->VerifyFound();
11855 // error w/ non-general layout
11856 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11857
11858 m_errorMonitor->SetDesiredFailureMsg(
11859 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11860 "Layout for input attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be READ_ONLY_OPTIMAL or GENERAL.");
11861 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11862 m_errorMonitor->VerifyFound();
11863 subpass.inputAttachmentCount = 0;
11864 subpass.colorAttachmentCount = 1;
11865 subpass.pColorAttachments = &attach;
11866 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11867 // perf warning for GENERAL layout on color attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011868 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11869 "Layout for color attachment is GENERAL but should be COLOR_ATTACHMENT_OPTIMAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011870 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11871 m_errorMonitor->VerifyFound();
11872 // error w/ non-color opt or GENERAL layout for color attachment
11873 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
11874 m_errorMonitor->SetDesiredFailureMsg(
11875 VK_DEBUG_REPORT_ERROR_BIT_EXT,
11876 "Layout for color attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be COLOR_ATTACHMENT_OPTIMAL or GENERAL.");
11877 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11878 m_errorMonitor->VerifyFound();
11879 subpass.colorAttachmentCount = 0;
11880 subpass.pDepthStencilAttachment = &attach;
11881 attach.layout = VK_IMAGE_LAYOUT_GENERAL;
11882 // perf warning for GENERAL layout on DS attachment
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011883 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT,
11884 "GENERAL layout for depth attachment may not give optimal performance.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011885 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11886 m_errorMonitor->VerifyFound();
11887 // error w/ non-ds opt or GENERAL layout for color attachment
11888 attach.layout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060011889 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11890 "Layout for depth attachment is VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL but can only be "
11891 "DEPTH_STENCIL_ATTACHMENT_OPTIMAL, DEPTH_STENCIL_READ_ONLY_OPTIMAL or GENERAL.");
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011892 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11893 m_errorMonitor->VerifyFound();
Tobin Ehlis1efce022016-05-11 10:40:34 -060011894 // For this error we need a valid renderpass so create default one
11895 attach.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11896 attach.attachment = 0;
Tony Barbourf887b162017-03-09 10:06:46 -070011897 attach_desc.format = depth_format;
Tobin Ehlis1efce022016-05-11 10:40:34 -060011898 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
11899 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
11900 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
11901 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
11902 // Can't do a CLEAR load on READ_ONLY initialLayout
11903 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
11904 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
11905 attach_desc.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070011906 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
11907 " with invalid first layout "
11908 "VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_"
11909 "ONLY_OPTIMAL");
Tobin Ehlis1efce022016-05-11 10:40:34 -060011910 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
11911 m_errorMonitor->VerifyFound();
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011912
Cort3b021012016-12-07 12:00:57 -080011913 vkFreeMemory(m_device->device(), src_image_mem, NULL);
11914 vkFreeMemory(m_device->device(), dst_image_mem, NULL);
11915 vkFreeMemory(m_device->device(), depth_image_mem, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011916 vkDestroyImage(m_device->device(), src_image, NULL);
11917 vkDestroyImage(m_device->device(), dst_image, NULL);
Cort3b021012016-12-07 12:00:57 -080011918 vkDestroyImage(m_device->device(), depth_image, NULL);
Tobin Ehlisc555a3c2016-05-04 14:08:34 -060011919}
Tobin Ehlisd8d89182016-07-18 20:13:11 -060011920
Tobin Ehlise0936662016-10-11 08:10:51 -060011921TEST_F(VkLayerTest, InvalidStorageImageLayout) {
11922 TEST_DESCRIPTION("Attempt to update a STORAGE_IMAGE descriptor w/o GENERAL layout.");
11923 VkResult err;
11924
11925 ASSERT_NO_FATAL_FAILURE(InitState());
11926
11927 const VkFormat tex_format = VK_FORMAT_R8G8B8A8_UNORM;
11928 VkImageTiling tiling;
11929 VkFormatProperties format_properties;
11930 vkGetPhysicalDeviceFormatProperties(gpu(), tex_format, &format_properties);
11931 if (format_properties.linearTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
11932 tiling = VK_IMAGE_TILING_LINEAR;
11933 } else if (format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT) {
11934 tiling = VK_IMAGE_TILING_OPTIMAL;
11935 } else {
Dave Houlton584d51e2017-02-16 12:52:54 -070011936 printf(" Device does not support VK_FORMAT_FEATURE_STORAGE_IMAGE_BIT; skipped.\n");
Tobin Ehlise0936662016-10-11 08:10:51 -060011937 return;
11938 }
11939
11940 VkDescriptorPoolSize ds_type = {};
11941 ds_type.type = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
11942 ds_type.descriptorCount = 1;
11943
11944 VkDescriptorPoolCreateInfo ds_pool_ci = {};
11945 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
11946 ds_pool_ci.maxSets = 1;
11947 ds_pool_ci.poolSizeCount = 1;
11948 ds_pool_ci.pPoolSizes = &ds_type;
11949 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
11950
11951 VkDescriptorPool ds_pool;
11952 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
11953 ASSERT_VK_SUCCESS(err);
11954
11955 VkDescriptorSetLayoutBinding dsl_binding = {};
11956 dsl_binding.binding = 0;
11957 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
11958 dsl_binding.descriptorCount = 1;
11959 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
11960 dsl_binding.pImmutableSamplers = NULL;
11961
11962 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
11963 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
11964 ds_layout_ci.pNext = NULL;
11965 ds_layout_ci.bindingCount = 1;
11966 ds_layout_ci.pBindings = &dsl_binding;
11967
11968 VkDescriptorSetLayout ds_layout;
11969 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
11970 ASSERT_VK_SUCCESS(err);
11971
11972 VkDescriptorSetAllocateInfo alloc_info = {};
11973 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
11974 alloc_info.descriptorSetCount = 1;
11975 alloc_info.descriptorPool = ds_pool;
11976 alloc_info.pSetLayouts = &ds_layout;
11977 VkDescriptorSet descriptor_set;
11978 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
11979 ASSERT_VK_SUCCESS(err);
11980
11981 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
11982 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
11983 pipeline_layout_ci.pNext = NULL;
11984 pipeline_layout_ci.setLayoutCount = 1;
11985 pipeline_layout_ci.pSetLayouts = &ds_layout;
11986 VkPipelineLayout pipeline_layout;
11987 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
11988 ASSERT_VK_SUCCESS(err);
11989
11990 VkImageObj image(m_device);
11991 image.init(32, 32, tex_format, VK_IMAGE_USAGE_STORAGE_BIT, tiling, 0);
11992 ASSERT_TRUE(image.initialized());
11993 VkImageView view = image.targetView(tex_format);
11994
11995 VkDescriptorImageInfo image_info = {};
11996 image_info.imageView = view;
11997 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
11998
11999 VkWriteDescriptorSet descriptor_write = {};
12000 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12001 descriptor_write.dstSet = descriptor_set;
12002 descriptor_write.dstBinding = 0;
12003 descriptor_write.descriptorCount = 1;
12004 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE;
12005 descriptor_write.pImageInfo = &image_info;
12006
12007 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
12008 " of VK_DESCRIPTOR_TYPE_STORAGE_IMAGE type is being updated with layout "
12009 "VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL but according to spec ");
12010 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12011 m_errorMonitor->VerifyFound();
12012
12013 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12014 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12015 vkFreeDescriptorSets(m_device->device(), ds_pool, 1, &descriptor_set);
12016 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12017}
12018
Mark Mueller93b938f2016-08-18 10:27:40 -060012019TEST_F(VkLayerTest, SimultaneousUse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012020 TEST_DESCRIPTION(
12021 "Use vkCmdExecuteCommands with invalid state "
12022 "in primary and secondary command buffers.");
Mark Mueller93b938f2016-08-18 10:27:40 -060012023
12024 ASSERT_NO_FATAL_FAILURE(InitState());
12025 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12026
Mike Weiblen95dd0f92016-10-19 12:28:27 -060012027 const char *simultaneous_use_message1 = "without VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set!";
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012028 const char *simultaneous_use_message2 =
12029 "does not have VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT set and "
12030 "will cause primary command buffer";
Mark Mueller93b938f2016-08-18 10:27:40 -060012031
12032 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012033 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060012034 command_buffer_allocate_info.commandPool = m_commandPool;
12035 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
12036 command_buffer_allocate_info.commandBufferCount = 1;
12037
12038 VkCommandBuffer secondary_command_buffer;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012039 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
Mark Mueller93b938f2016-08-18 10:27:40 -060012040 VkCommandBufferBeginInfo command_buffer_begin_info = {};
12041 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012042 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Mark Mueller93b938f2016-08-18 10:27:40 -060012043 command_buffer_inheritance_info.renderPass = m_renderPass;
12044 command_buffer_inheritance_info.framebuffer = m_framebuffer;
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012045
Mark Mueller93b938f2016-08-18 10:27:40 -060012046 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012047 command_buffer_begin_info.flags =
12048 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
Mark Mueller93b938f2016-08-18 10:27:40 -060012049 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
12050
12051 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
12052 vkEndCommandBuffer(secondary_command_buffer);
12053
Mark Mueller93b938f2016-08-18 10:27:40 -060012054 VkSubmitInfo submit_info = {};
12055 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12056 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012057 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller93b938f2016-08-18 10:27:40 -060012058
Mark Mueller4042b652016-09-05 22:52:21 -060012059 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012060 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
12061 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message1);
12062 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012063 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012064 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012065 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12066 vkEndCommandBuffer(m_commandBuffer->handle());
Mark Mueller93b938f2016-08-18 10:27:40 -060012067
Dave Houltonfbf52152017-01-06 12:55:29 -070012068 m_errorMonitor->ExpectSuccess(0);
Mark Mueller93b938f2016-08-18 10:27:40 -060012069 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070012070 m_errorMonitor->VerifyNotFound();
Mark Mueller93b938f2016-08-18 10:27:40 -060012071
Mark Mueller4042b652016-09-05 22:52:21 -060012072 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012073 m_errorMonitor->SetUnexpectedError("commandBuffer must not currently be pending execution");
12074 m_errorMonitor->SetUnexpectedError(
12075 "If commandBuffer was allocated from a VkCommandPool which did not have the "
12076 "VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT flag set, commandBuffer must be in the initial state");
Mark Mueller93b938f2016-08-18 10:27:40 -060012077 vkBeginCommandBuffer(m_commandBuffer->handle(), &command_buffer_begin_info);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012078 vkCmdBeginRenderPass(m_commandBuffer->handle(), &renderPassBeginInfo(), VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Mark Mueller4042b652016-09-05 22:52:21 -060012079
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012080 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, simultaneous_use_message2);
12081 vkCmdExecuteCommands(m_commandBuffer->handle(), 1, &secondary_command_buffer);
Mark Mueller93b938f2016-08-18 10:27:40 -060012082 m_errorMonitor->VerifyFound();
Mark Mueller4042b652016-09-05 22:52:21 -060012083 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
12084 vkEndCommandBuffer(m_commandBuffer->handle());
Rene Lindsay24cf6c52017-01-04 12:06:59 -070012085
12086 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012087
12088 m_errorMonitor->SetUnexpectedError("All elements of pCommandBuffers must not be pending execution");
Mark Mueller93b938f2016-08-18 10:27:40 -060012089}
12090
Tony Barbour626994c2017-02-08 15:29:37 -070012091TEST_F(VkLayerTest, SimultaneousUseOneShot) {
12092 TEST_DESCRIPTION(
12093 "Submit the same command buffer twice in one submit looking for simultaneous use and one time submit"
12094 "errors");
12095 const char *simultaneous_use_message = "is already in use and is not marked for simultaneous use";
12096 const char *one_shot_message = "VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT set, but has been submitted";
12097 ASSERT_NO_FATAL_FAILURE(InitState());
12098
12099 VkCommandBuffer cmd_bufs[2];
12100 VkCommandBufferAllocateInfo alloc_info;
12101 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12102 alloc_info.pNext = NULL;
12103 alloc_info.commandBufferCount = 2;
12104 alloc_info.commandPool = m_commandPool;
12105 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12106 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
12107
12108 VkCommandBufferBeginInfo cb_binfo;
12109 cb_binfo.pNext = NULL;
12110 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12111 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
12112 cb_binfo.flags = 0;
12113 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
12114 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12115 vkCmdSetViewport(cmd_bufs[0], 0, 1, &viewport);
12116 vkEndCommandBuffer(cmd_bufs[0]);
12117 VkCommandBuffer duplicates[2] = {cmd_bufs[0], cmd_bufs[0]};
12118
12119 VkSubmitInfo submit_info = {};
12120 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12121 submit_info.commandBufferCount = 2;
12122 submit_info.pCommandBuffers = duplicates;
12123 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, simultaneous_use_message);
12124 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12125 m_errorMonitor->VerifyFound();
12126 vkQueueWaitIdle(m_device->m_queue);
12127
12128 // Set one time use and now look for one time submit
12129 duplicates[0] = duplicates[1] = cmd_bufs[1];
12130 cb_binfo.flags = VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT | VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
12131 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
12132 vkCmdSetViewport(cmd_bufs[1], 0, 1, &viewport);
12133 vkEndCommandBuffer(cmd_bufs[1]);
12134 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, one_shot_message);
12135 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12136 m_errorMonitor->VerifyFound();
12137 vkQueueWaitIdle(m_device->m_queue);
12138}
12139
Tobin Ehlisb093da82017-01-19 12:05:27 -070012140TEST_F(VkLayerTest, StageMaskGsTsEnabled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012141 TEST_DESCRIPTION(
12142 "Attempt to use a stageMask w/ geometry shader and tesselation shader bits enabled when those features are "
12143 "disabled on the device.");
Tobin Ehlisb093da82017-01-19 12:05:27 -070012144
12145 ASSERT_NO_FATAL_FAILURE(InitState());
12146 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12147
12148 std::vector<const char *> device_extension_names;
12149 auto features = m_device->phy().features();
12150 // Make sure gs & ts are disabled
12151 features.geometryShader = false;
12152 features.tessellationShader = false;
12153 // The sacrificial device object
12154 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
12155
12156 VkCommandPoolCreateInfo pool_create_info{};
12157 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
12158 pool_create_info.queueFamilyIndex = test_device.graphics_queue_node_index_;
12159
12160 VkCommandPool command_pool;
12161 vkCreateCommandPool(test_device.handle(), &pool_create_info, nullptr, &command_pool);
12162
12163 VkCommandBufferAllocateInfo cmd = {};
12164 cmd.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
12165 cmd.pNext = NULL;
12166 cmd.commandPool = command_pool;
12167 cmd.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
12168 cmd.commandBufferCount = 1;
12169
12170 VkCommandBuffer cmd_buffer;
12171 VkResult err = vkAllocateCommandBuffers(test_device.handle(), &cmd, &cmd_buffer);
12172 ASSERT_VK_SUCCESS(err);
12173
12174 VkEvent event;
12175 VkEventCreateInfo evci = {};
12176 evci.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12177 VkResult result = vkCreateEvent(test_device.handle(), &evci, NULL, &event);
12178 ASSERT_VK_SUCCESS(result);
12179
12180 VkCommandBufferBeginInfo cbbi = {};
12181 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
12182 vkBeginCommandBuffer(cmd_buffer, &cbbi);
12183 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00230);
12184 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_GEOMETRY_SHADER_BIT);
12185 m_errorMonitor->VerifyFound();
12186
12187 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00231);
12188 vkCmdSetEvent(cmd_buffer, event, VK_PIPELINE_STAGE_TESSELLATION_CONTROL_SHADER_BIT);
12189 m_errorMonitor->VerifyFound();
12190
12191 vkDestroyEvent(test_device.handle(), event, NULL);
12192 vkDestroyCommandPool(test_device.handle(), command_pool, NULL);
12193}
12194
Mark Mueller917f6bc2016-08-30 10:57:19 -060012195TEST_F(VkLayerTest, InUseDestroyedSignaled) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012196 TEST_DESCRIPTION(
12197 "Use vkCmdExecuteCommands with invalid state "
12198 "in primary and secondary command buffers. "
12199 "Delete objects that are inuse. Call VkQueueSubmit "
12200 "with an event that has been deleted.");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012201
12202 ASSERT_NO_FATAL_FAILURE(InitState());
12203 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12204
Tony Barbour552f6c02016-12-21 14:34:07 -070012205 m_commandBuffer->BeginCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012206
12207 VkEvent event;
12208 VkEventCreateInfo event_create_info = {};
12209 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
12210 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012211 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012212
Tony Barbour552f6c02016-12-21 14:34:07 -070012213 m_commandBuffer->EndCommandBuffer();
Mark Muellerc8d441e2016-08-23 17:36:00 -060012214 vkDestroyEvent(m_device->device(), event, nullptr);
12215
12216 VkSubmitInfo submit_info = {};
12217 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12218 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012219 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Lobodzinskife4be302017-02-14 13:08:15 -070012220 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is invalid because bound");
Mark Muellerc8d441e2016-08-23 17:36:00 -060012221 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12222 m_errorMonitor->VerifyFound();
12223
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012224 m_errorMonitor->ExpectSuccess(0); // disable all log message processing with flags==0
Mark Muellerc8d441e2016-08-23 17:36:00 -060012225 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
12226
12227 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
12228
Mark Mueller917f6bc2016-08-30 10:57:19 -060012229 VkSemaphoreCreateInfo semaphore_create_info = {};
12230 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
12231 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012232 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012233 VkFenceCreateInfo fence_create_info = {};
12234 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
12235 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012236 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012237
12238 VkDescriptorPoolSize descriptor_pool_type_count = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012239 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012240 descriptor_pool_type_count.descriptorCount = 1;
12241
12242 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
12243 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12244 descriptor_pool_create_info.maxSets = 1;
12245 descriptor_pool_create_info.poolSizeCount = 1;
12246 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012247 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012248
12249 VkDescriptorPool descriptorset_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012250 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012251
12252 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
Mark Mueller4042b652016-09-05 22:52:21 -060012253 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012254 descriptorset_layout_binding.descriptorCount = 1;
12255 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
12256
12257 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012258 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012259 descriptorset_layout_create_info.bindingCount = 1;
12260 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
12261
12262 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012263 ASSERT_VK_SUCCESS(
12264 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012265
12266 VkDescriptorSet descriptorset;
12267 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012268 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012269 descriptorset_allocate_info.descriptorSetCount = 1;
12270 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
12271 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012272 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012273
Mark Mueller4042b652016-09-05 22:52:21 -060012274 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
12275
12276 VkDescriptorBufferInfo buffer_info = {};
12277 buffer_info.buffer = buffer_test.GetBuffer();
12278 buffer_info.offset = 0;
12279 buffer_info.range = 1024;
12280
12281 VkWriteDescriptorSet write_descriptor_set = {};
12282 write_descriptor_set.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12283 write_descriptor_set.dstSet = descriptorset;
12284 write_descriptor_set.descriptorCount = 1;
12285 write_descriptor_set.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
12286 write_descriptor_set.pBufferInfo = &buffer_info;
12287
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012288 vkUpdateDescriptorSets(m_device->device(), 1, &write_descriptor_set, 0, nullptr);
Mark Mueller4042b652016-09-05 22:52:21 -060012289
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012290 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12291 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012292
12293 VkPipelineObj pipe(m_device);
12294 pipe.AddColorAttachment();
12295 pipe.AddShader(&vs);
12296 pipe.AddShader(&fs);
12297
12298 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012299 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
Mark Mueller917f6bc2016-08-30 10:57:19 -060012300 pipeline_layout_create_info.setLayoutCount = 1;
12301 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
12302
12303 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012304 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
Mark Mueller917f6bc2016-08-30 10:57:19 -060012305
12306 pipe.CreateVKPipeline(pipeline_layout, m_renderPass);
12307
Tony Barbour552f6c02016-12-21 14:34:07 -070012308 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012309 vkCmdSetEvent(m_commandBuffer->handle(), event, VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT);
Mark Muellerc8d441e2016-08-23 17:36:00 -060012310
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012311 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12312 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12313 &descriptorset, 0, NULL);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012314
Tony Barbour552f6c02016-12-21 14:34:07 -070012315 m_commandBuffer->EndCommandBuffer();
Mark Mueller917f6bc2016-08-30 10:57:19 -060012316
Mark Mueller917f6bc2016-08-30 10:57:19 -060012317 submit_info.signalSemaphoreCount = 1;
12318 submit_info.pSignalSemaphores = &semaphore;
12319 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012320 m_errorMonitor->Reset(); // resume logmsg processing
Mark Muellerc8d441e2016-08-23 17:36:00 -060012321
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012322 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00213);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012323 vkDestroyEvent(m_device->device(), event, nullptr);
12324 m_errorMonitor->VerifyFound();
12325
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012326 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00199);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012327 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
12328 m_errorMonitor->VerifyFound();
12329
Jeremy Hayes08369882017-02-02 10:31:06 -070012330 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Fence 0x");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012331 vkDestroyFence(m_device->device(), fence, nullptr);
12332 m_errorMonitor->VerifyFound();
12333
Tobin Ehlis122207b2016-09-01 08:50:06 -070012334 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012335 m_errorMonitor->SetUnexpectedError("If semaphore is not VK_NULL_HANDLE, semaphore must be a valid VkSemaphore handle");
12336 m_errorMonitor->SetUnexpectedError("Unable to remove Semaphore obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012337 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012338 m_errorMonitor->SetUnexpectedError("If fence is not VK_NULL_HANDLE, fence must be a valid VkFence handle");
12339 m_errorMonitor->SetUnexpectedError("Unable to remove Fence obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012340 vkDestroyFence(m_device->device(), fence, nullptr);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012341 m_errorMonitor->SetUnexpectedError("If event is not VK_NULL_HANDLE, event must be a valid VkEvent handle");
12342 m_errorMonitor->SetUnexpectedError("Unable to remove Event obj");
Mark Mueller917f6bc2016-08-30 10:57:19 -060012343 vkDestroyEvent(m_device->device(), event, nullptr);
12344 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012345 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
Mark Mueller917f6bc2016-08-30 10:57:19 -060012346 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
12347}
12348
Tobin Ehlis2adda372016-09-01 08:51:06 -070012349TEST_F(VkLayerTest, QueryPoolInUseDestroyedSignaled) {
12350 TEST_DESCRIPTION("Delete in-use query pool.");
12351
12352 ASSERT_NO_FATAL_FAILURE(InitState());
12353 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12354
12355 VkQueryPool query_pool;
12356 VkQueryPoolCreateInfo query_pool_ci{};
12357 query_pool_ci.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
12358 query_pool_ci.queryType = VK_QUERY_TYPE_TIMESTAMP;
12359 query_pool_ci.queryCount = 1;
12360 vkCreateQueryPool(m_device->device(), &query_pool_ci, nullptr, &query_pool);
Tony Barbour552f6c02016-12-21 14:34:07 -070012361 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012362 // Reset query pool to create binding with cmd buffer
12363 vkCmdResetQueryPool(m_commandBuffer->handle(), query_pool, 0, 1);
12364
Tony Barbour552f6c02016-12-21 14:34:07 -070012365 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis2adda372016-09-01 08:51:06 -070012366
12367 VkSubmitInfo submit_info = {};
12368 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12369 submit_info.commandBufferCount = 1;
12370 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12371 // Submit cmd buffer and then destroy query pool while in-flight
12372 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12373
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012374 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01012);
Tobin Ehlis2adda372016-09-01 08:51:06 -070012375 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12376 m_errorMonitor->VerifyFound();
12377
12378 vkQueueWaitIdle(m_device->m_queue);
12379 // Now that cmd buffer done we can safely destroy query_pool
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012380 m_errorMonitor->SetUnexpectedError("If queryPool is not VK_NULL_HANDLE, queryPool must be a valid VkQueryPool handle");
12381 m_errorMonitor->SetUnexpectedError("Unable to remove Query Pool obj");
Tobin Ehlis2adda372016-09-01 08:51:06 -070012382 vkDestroyQueryPool(m_device->handle(), query_pool, NULL);
12383}
12384
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012385TEST_F(VkLayerTest, PipelineInUseDestroyedSignaled) {
12386 TEST_DESCRIPTION("Delete in-use pipeline.");
12387
12388 ASSERT_NO_FATAL_FAILURE(InitState());
12389 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12390
12391 // Empty pipeline layout used for binding PSO
12392 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12393 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12394 pipeline_layout_ci.setLayoutCount = 0;
12395 pipeline_layout_ci.pSetLayouts = NULL;
12396
12397 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012398 VkResult err = vkCreatePipelineLayout(m_device->handle(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012399 ASSERT_VK_SUCCESS(err);
12400
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012401 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00555);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012402 // Create PSO to be used for draw-time errors below
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012403 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
12404 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012405 // Store pipeline handle so we can actually delete it before test finishes
12406 VkPipeline delete_this_pipeline;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012407 { // Scope pipeline so it will be auto-deleted
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012408 VkPipelineObj pipe(m_device);
12409 pipe.AddShader(&vs);
12410 pipe.AddShader(&fs);
12411 pipe.AddColorAttachment();
12412 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12413 delete_this_pipeline = pipe.handle();
12414
Tony Barbour552f6c02016-12-21 14:34:07 -070012415 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012416 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012417 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012418
Tony Barbour552f6c02016-12-21 14:34:07 -070012419 m_commandBuffer->EndCommandBuffer();
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012420
12421 VkSubmitInfo submit_info = {};
12422 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12423 submit_info.commandBufferCount = 1;
12424 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12425 // Submit cmd buffer and then pipeline destroyed while in-flight
12426 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012427 } // Pipeline deletion triggered here
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012428 m_errorMonitor->VerifyFound();
12429 // Make sure queue finished and then actually delete pipeline
12430 vkQueueWaitIdle(m_device->m_queue);
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012431 m_errorMonitor->SetUnexpectedError("If pipeline is not VK_NULL_HANDLE, pipeline must be a valid VkPipeline handle");
12432 m_errorMonitor->SetUnexpectedError("Unable to remove Pipeline obj");
Tobin Ehlisfafab2d2016-09-07 13:51:24 -060012433 vkDestroyPipeline(m_device->handle(), delete_this_pipeline, nullptr);
12434 vkDestroyPipelineLayout(m_device->handle(), pipeline_layout, nullptr);
12435}
12436
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012437TEST_F(VkLayerTest, ImageViewInUseDestroyedSignaled) {
12438 TEST_DESCRIPTION("Delete in-use imageView.");
12439
12440 ASSERT_NO_FATAL_FAILURE(InitState());
12441 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12442
12443 VkDescriptorPoolSize ds_type_count;
12444 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12445 ds_type_count.descriptorCount = 1;
12446
12447 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12448 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12449 ds_pool_ci.maxSets = 1;
12450 ds_pool_ci.poolSizeCount = 1;
12451 ds_pool_ci.pPoolSizes = &ds_type_count;
12452
12453 VkDescriptorPool ds_pool;
12454 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12455 ASSERT_VK_SUCCESS(err);
12456
12457 VkSamplerCreateInfo sampler_ci = {};
12458 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12459 sampler_ci.pNext = NULL;
12460 sampler_ci.magFilter = VK_FILTER_NEAREST;
12461 sampler_ci.minFilter = VK_FILTER_NEAREST;
12462 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12463 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12464 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12465 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12466 sampler_ci.mipLodBias = 1.0;
12467 sampler_ci.anisotropyEnable = VK_FALSE;
12468 sampler_ci.maxAnisotropy = 1;
12469 sampler_ci.compareEnable = VK_FALSE;
12470 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12471 sampler_ci.minLod = 1.0;
12472 sampler_ci.maxLod = 1.0;
12473 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12474 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12475 VkSampler sampler;
12476
12477 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12478 ASSERT_VK_SUCCESS(err);
12479
12480 VkDescriptorSetLayoutBinding layout_binding;
12481 layout_binding.binding = 0;
12482 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12483 layout_binding.descriptorCount = 1;
12484 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12485 layout_binding.pImmutableSamplers = NULL;
12486
12487 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12488 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12489 ds_layout_ci.bindingCount = 1;
12490 ds_layout_ci.pBindings = &layout_binding;
12491 VkDescriptorSetLayout ds_layout;
12492 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12493 ASSERT_VK_SUCCESS(err);
12494
12495 VkDescriptorSetAllocateInfo alloc_info = {};
12496 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12497 alloc_info.descriptorSetCount = 1;
12498 alloc_info.descriptorPool = ds_pool;
12499 alloc_info.pSetLayouts = &ds_layout;
12500 VkDescriptorSet descriptor_set;
12501 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12502 ASSERT_VK_SUCCESS(err);
12503
12504 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12505 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12506 pipeline_layout_ci.pNext = NULL;
12507 pipeline_layout_ci.setLayoutCount = 1;
12508 pipeline_layout_ci.pSetLayouts = &ds_layout;
12509
12510 VkPipelineLayout pipeline_layout;
12511 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12512 ASSERT_VK_SUCCESS(err);
12513
12514 VkImageObj image(m_device);
12515 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
12516 ASSERT_TRUE(image.initialized());
12517
12518 VkImageView view;
12519 VkImageViewCreateInfo ivci = {};
12520 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12521 ivci.image = image.handle();
12522 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12523 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12524 ivci.subresourceRange.layerCount = 1;
12525 ivci.subresourceRange.baseMipLevel = 0;
12526 ivci.subresourceRange.levelCount = 1;
12527 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12528
12529 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12530 ASSERT_VK_SUCCESS(err);
12531
12532 VkDescriptorImageInfo image_info{};
12533 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12534 image_info.imageView = view;
12535 image_info.sampler = sampler;
12536
12537 VkWriteDescriptorSet descriptor_write = {};
12538 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12539 descriptor_write.dstSet = descriptor_set;
12540 descriptor_write.dstBinding = 0;
12541 descriptor_write.descriptorCount = 1;
12542 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12543 descriptor_write.pImageInfo = &image_info;
12544
12545 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12546
12547 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012548 char const *vsSource =
12549 "#version 450\n"
12550 "\n"
12551 "out gl_PerVertex { \n"
12552 " vec4 gl_Position;\n"
12553 "};\n"
12554 "void main(){\n"
12555 " gl_Position = vec4(1);\n"
12556 "}\n";
12557 char const *fsSource =
12558 "#version 450\n"
12559 "\n"
12560 "layout(set=0, binding=0) uniform sampler2D s;\n"
12561 "layout(location=0) out vec4 x;\n"
12562 "void main(){\n"
12563 " x = texture(s, vec2(1));\n"
12564 "}\n";
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012565 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12566 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12567 VkPipelineObj pipe(m_device);
12568 pipe.AddShader(&vs);
12569 pipe.AddShader(&fs);
12570 pipe.AddColorAttachment();
12571 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12572
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012573 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00776);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012574
Tony Barbour552f6c02016-12-21 14:34:07 -070012575 m_commandBuffer->BeginCommandBuffer();
12576 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012577 // Bind pipeline to cmd buffer
12578 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12579 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12580 &descriptor_set, 0, nullptr);
Rene Lindsaya8880622017-01-18 13:12:59 -070012581
12582 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12583 VkRect2D scissor = {{0, 0}, {16, 16}};
12584 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12585 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12586
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012587 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012588 m_commandBuffer->EndRenderPass();
12589 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012590 // Submit cmd buffer then destroy sampler
12591 VkSubmitInfo submit_info = {};
12592 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12593 submit_info.commandBufferCount = 1;
12594 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12595 // Submit cmd buffer and then destroy imageView while in-flight
12596 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12597
12598 vkDestroyImageView(m_device->device(), view, nullptr);
12599 m_errorMonitor->VerifyFound();
12600 vkQueueWaitIdle(m_device->m_queue);
12601 // Now we can actually destroy imageView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012602 m_errorMonitor->SetUnexpectedError("If imageView is not VK_NULL_HANDLE, imageView must be a valid VkImageView handle");
12603 m_errorMonitor->SetUnexpectedError("Unable to remove Image View obj");
Tobin Ehlis7d965da2016-09-19 16:15:45 -060012604 vkDestroyImageView(m_device->device(), view, NULL);
12605 vkDestroySampler(m_device->device(), sampler, nullptr);
12606 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12607 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12608 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12609}
12610
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012611TEST_F(VkLayerTest, BufferViewInUseDestroyedSignaled) {
12612 TEST_DESCRIPTION("Delete in-use bufferView.");
12613
12614 ASSERT_NO_FATAL_FAILURE(InitState());
12615 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12616
12617 VkDescriptorPoolSize ds_type_count;
12618 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12619 ds_type_count.descriptorCount = 1;
12620
12621 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12622 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12623 ds_pool_ci.maxSets = 1;
12624 ds_pool_ci.poolSizeCount = 1;
12625 ds_pool_ci.pPoolSizes = &ds_type_count;
12626
12627 VkDescriptorPool ds_pool;
12628 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
12629 ASSERT_VK_SUCCESS(err);
12630
12631 VkDescriptorSetLayoutBinding layout_binding;
12632 layout_binding.binding = 0;
12633 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12634 layout_binding.descriptorCount = 1;
12635 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12636 layout_binding.pImmutableSamplers = NULL;
12637
12638 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12639 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12640 ds_layout_ci.bindingCount = 1;
12641 ds_layout_ci.pBindings = &layout_binding;
12642 VkDescriptorSetLayout ds_layout;
12643 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
12644 ASSERT_VK_SUCCESS(err);
12645
12646 VkDescriptorSetAllocateInfo alloc_info = {};
12647 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12648 alloc_info.descriptorSetCount = 1;
12649 alloc_info.descriptorPool = ds_pool;
12650 alloc_info.pSetLayouts = &ds_layout;
12651 VkDescriptorSet descriptor_set;
12652 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
12653 ASSERT_VK_SUCCESS(err);
12654
12655 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12656 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12657 pipeline_layout_ci.pNext = NULL;
12658 pipeline_layout_ci.setLayoutCount = 1;
12659 pipeline_layout_ci.pSetLayouts = &ds_layout;
12660
12661 VkPipelineLayout pipeline_layout;
12662 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
12663 ASSERT_VK_SUCCESS(err);
12664
12665 VkBuffer buffer;
12666 uint32_t queue_family_index = 0;
12667 VkBufferCreateInfo buffer_create_info = {};
12668 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
12669 buffer_create_info.size = 1024;
12670 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
12671 buffer_create_info.queueFamilyIndexCount = 1;
12672 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
12673
12674 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
12675 ASSERT_VK_SUCCESS(err);
12676
12677 VkMemoryRequirements memory_reqs;
12678 VkDeviceMemory buffer_memory;
12679
12680 VkMemoryAllocateInfo memory_info = {};
12681 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
12682 memory_info.allocationSize = 0;
12683 memory_info.memoryTypeIndex = 0;
12684
12685 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
12686 memory_info.allocationSize = memory_reqs.size;
12687 bool pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
12688 ASSERT_TRUE(pass);
12689
12690 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
12691 ASSERT_VK_SUCCESS(err);
12692 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
12693 ASSERT_VK_SUCCESS(err);
12694
12695 VkBufferView view;
12696 VkBufferViewCreateInfo bvci = {};
12697 bvci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
12698 bvci.buffer = buffer;
12699 bvci.format = VK_FORMAT_R8_UNORM;
12700 bvci.range = VK_WHOLE_SIZE;
12701
12702 err = vkCreateBufferView(m_device->device(), &bvci, NULL, &view);
12703 ASSERT_VK_SUCCESS(err);
12704
12705 VkWriteDescriptorSet descriptor_write = {};
12706 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12707 descriptor_write.dstSet = descriptor_set;
12708 descriptor_write.dstBinding = 0;
12709 descriptor_write.descriptorCount = 1;
12710 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
12711 descriptor_write.pTexelBufferView = &view;
12712
12713 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12714
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012715 char const *vsSource =
12716 "#version 450\n"
12717 "\n"
12718 "out gl_PerVertex { \n"
12719 " vec4 gl_Position;\n"
12720 "};\n"
12721 "void main(){\n"
12722 " gl_Position = vec4(1);\n"
12723 "}\n";
12724 char const *fsSource =
12725 "#version 450\n"
12726 "\n"
12727 "layout(set=0, binding=0, r8) uniform imageBuffer s;\n"
12728 "layout(location=0) out vec4 x;\n"
12729 "void main(){\n"
12730 " x = imageLoad(s, 0);\n"
12731 "}\n";
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012732 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12733 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12734 VkPipelineObj pipe(m_device);
12735 pipe.AddShader(&vs);
12736 pipe.AddShader(&fs);
12737 pipe.AddColorAttachment();
12738 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12739
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012740 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00701);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012741
Tony Barbour552f6c02016-12-21 14:34:07 -070012742 m_commandBuffer->BeginCommandBuffer();
12743 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012744 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12745 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12746 VkRect2D scissor = {{0, 0}, {16, 16}};
12747 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12748 // Bind pipeline to cmd buffer
12749 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12750 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12751 &descriptor_set, 0, nullptr);
12752 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012753 m_commandBuffer->EndRenderPass();
12754 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012755
12756 VkSubmitInfo submit_info = {};
12757 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12758 submit_info.commandBufferCount = 1;
12759 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12760 // Submit cmd buffer and then destroy bufferView while in-flight
12761 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12762
12763 vkDestroyBufferView(m_device->device(), view, nullptr);
12764 m_errorMonitor->VerifyFound();
12765 vkQueueWaitIdle(m_device->m_queue);
12766 // Now we can actually destroy bufferView
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012767 m_errorMonitor->SetUnexpectedError("If bufferView is not VK_NULL_HANDLE, bufferView must be a valid VkBufferView handle");
12768 m_errorMonitor->SetUnexpectedError("Unable to remove Buffer View obj");
Tobin Ehlis757ce9e2016-09-28 09:59:07 -060012769 vkDestroyBufferView(m_device->device(), view, NULL);
12770 vkDestroyBuffer(m_device->device(), buffer, NULL);
12771 vkFreeMemory(m_device->device(), buffer_memory, NULL);
12772 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12773 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12774 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12775}
12776
Tobin Ehlis209532e2016-09-07 13:52:18 -060012777TEST_F(VkLayerTest, SamplerInUseDestroyedSignaled) {
12778 TEST_DESCRIPTION("Delete in-use sampler.");
12779
12780 ASSERT_NO_FATAL_FAILURE(InitState());
12781 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12782
12783 VkDescriptorPoolSize ds_type_count;
12784 ds_type_count.type = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12785 ds_type_count.descriptorCount = 1;
12786
12787 VkDescriptorPoolCreateInfo ds_pool_ci = {};
12788 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
12789 ds_pool_ci.maxSets = 1;
12790 ds_pool_ci.poolSizeCount = 1;
12791 ds_pool_ci.pPoolSizes = &ds_type_count;
12792
12793 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012794 VkResult err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012795 ASSERT_VK_SUCCESS(err);
12796
12797 VkSamplerCreateInfo sampler_ci = {};
12798 sampler_ci.sType = VK_STRUCTURE_TYPE_SAMPLER_CREATE_INFO;
12799 sampler_ci.pNext = NULL;
12800 sampler_ci.magFilter = VK_FILTER_NEAREST;
12801 sampler_ci.minFilter = VK_FILTER_NEAREST;
12802 sampler_ci.mipmapMode = VK_SAMPLER_MIPMAP_MODE_NEAREST;
12803 sampler_ci.addressModeU = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12804 sampler_ci.addressModeV = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12805 sampler_ci.addressModeW = VK_SAMPLER_ADDRESS_MODE_CLAMP_TO_EDGE;
12806 sampler_ci.mipLodBias = 1.0;
12807 sampler_ci.anisotropyEnable = VK_FALSE;
12808 sampler_ci.maxAnisotropy = 1;
12809 sampler_ci.compareEnable = VK_FALSE;
12810 sampler_ci.compareOp = VK_COMPARE_OP_NEVER;
12811 sampler_ci.minLod = 1.0;
12812 sampler_ci.maxLod = 1.0;
12813 sampler_ci.borderColor = VK_BORDER_COLOR_FLOAT_OPAQUE_WHITE;
12814 sampler_ci.unnormalizedCoordinates = VK_FALSE;
12815 VkSampler sampler;
12816
12817 err = vkCreateSampler(m_device->device(), &sampler_ci, NULL, &sampler);
12818 ASSERT_VK_SUCCESS(err);
12819
12820 VkDescriptorSetLayoutBinding layout_binding;
12821 layout_binding.binding = 0;
Tobin Ehlis94fc0ad2016-09-19 16:23:01 -060012822 layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
Tobin Ehlis209532e2016-09-07 13:52:18 -060012823 layout_binding.descriptorCount = 1;
12824 layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
12825 layout_binding.pImmutableSamplers = NULL;
12826
12827 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
12828 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
12829 ds_layout_ci.bindingCount = 1;
12830 ds_layout_ci.pBindings = &layout_binding;
12831 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012832 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012833 ASSERT_VK_SUCCESS(err);
12834
12835 VkDescriptorSetAllocateInfo alloc_info = {};
12836 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
12837 alloc_info.descriptorSetCount = 1;
12838 alloc_info.descriptorPool = ds_pool;
12839 alloc_info.pSetLayouts = &ds_layout;
12840 VkDescriptorSet descriptor_set;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012841 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012842 ASSERT_VK_SUCCESS(err);
12843
12844 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
12845 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
12846 pipeline_layout_ci.pNext = NULL;
12847 pipeline_layout_ci.setLayoutCount = 1;
12848 pipeline_layout_ci.pSetLayouts = &ds_layout;
12849
12850 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012851 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012852 ASSERT_VK_SUCCESS(err);
12853
12854 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012855 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 -060012856 ASSERT_TRUE(image.initialized());
12857
12858 VkImageView view;
12859 VkImageViewCreateInfo ivci = {};
12860 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
12861 ivci.image = image.handle();
12862 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
12863 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
12864 ivci.subresourceRange.layerCount = 1;
12865 ivci.subresourceRange.baseMipLevel = 0;
12866 ivci.subresourceRange.levelCount = 1;
12867 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
12868
12869 err = vkCreateImageView(m_device->device(), &ivci, NULL, &view);
12870 ASSERT_VK_SUCCESS(err);
12871
12872 VkDescriptorImageInfo image_info{};
12873 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
12874 image_info.imageView = view;
12875 image_info.sampler = sampler;
12876
12877 VkWriteDescriptorSet descriptor_write = {};
12878 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
12879 descriptor_write.dstSet = descriptor_set;
12880 descriptor_write.dstBinding = 0;
12881 descriptor_write.descriptorCount = 1;
12882 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER;
12883 descriptor_write.pImageInfo = &image_info;
12884
12885 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
12886
12887 // Create PSO to use the sampler
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012888 char const *vsSource =
12889 "#version 450\n"
12890 "\n"
12891 "out gl_PerVertex { \n"
12892 " vec4 gl_Position;\n"
12893 "};\n"
12894 "void main(){\n"
12895 " gl_Position = vec4(1);\n"
12896 "}\n";
12897 char const *fsSource =
12898 "#version 450\n"
12899 "\n"
12900 "layout(set=0, binding=0) uniform sampler2D s;\n"
12901 "layout(location=0) out vec4 x;\n"
12902 "void main(){\n"
12903 " x = texture(s, vec2(1));\n"
12904 "}\n";
Tobin Ehlis209532e2016-09-07 13:52:18 -060012905 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
12906 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
12907 VkPipelineObj pipe(m_device);
12908 pipe.AddShader(&vs);
12909 pipe.AddShader(&fs);
12910 pipe.AddColorAttachment();
12911 pipe.CreateVKPipeline(pipeline_layout, renderPass());
12912
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070012913 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00837);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012914
Tony Barbour552f6c02016-12-21 14:34:07 -070012915 m_commandBuffer->BeginCommandBuffer();
12916 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis209532e2016-09-07 13:52:18 -060012917 // Bind pipeline to cmd buffer
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012918 vkCmdBindPipeline(m_commandBuffer->handle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
12919 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
12920 &descriptor_set, 0, nullptr);
Rene Lindsay4da11732017-01-13 14:42:10 -070012921
12922 VkViewport viewport = {0, 0, 16, 16, 0, 1};
12923 VkRect2D scissor = {{0, 0}, {16, 16}};
12924 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
12925 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
12926
Tobin Ehlis209532e2016-09-07 13:52:18 -060012927 Draw(1, 0, 0, 0);
Tony Barbour552f6c02016-12-21 14:34:07 -070012928 m_commandBuffer->EndRenderPass();
12929 m_commandBuffer->EndCommandBuffer();
Tobin Ehlis209532e2016-09-07 13:52:18 -060012930 // Submit cmd buffer then destroy sampler
12931 VkSubmitInfo submit_info = {};
12932 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12933 submit_info.commandBufferCount = 1;
12934 submit_info.pCommandBuffers = &m_commandBuffer->handle();
12935 // Submit cmd buffer and then destroy sampler while in-flight
12936 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12937
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012938 vkDestroySampler(m_device->device(), sampler, nullptr); // Destroyed too soon
Tobin Ehlis209532e2016-09-07 13:52:18 -060012939 m_errorMonitor->VerifyFound();
12940 vkQueueWaitIdle(m_device->m_queue);
Rene Lindsay4da11732017-01-13 14:42:10 -070012941
Tobin Ehlis209532e2016-09-07 13:52:18 -060012942 // Now we can actually destroy sampler
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070012943 m_errorMonitor->SetUnexpectedError("If sampler is not VK_NULL_HANDLE, sampler must be a valid VkSampler handle");
12944 m_errorMonitor->SetUnexpectedError("Unable to remove Sampler obj");
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012945 vkDestroySampler(m_device->device(), sampler, NULL); // Destroyed for real
Tobin Ehlis209532e2016-09-07 13:52:18 -060012946 vkDestroyImageView(m_device->device(), view, NULL);
12947 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
12948 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
12949 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
12950}
12951
Mark Mueller1cd9f412016-08-25 13:23:52 -060012952TEST_F(VkLayerTest, QueueForwardProgressFenceWait) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070012953 TEST_DESCRIPTION(
12954 "Call VkQueueSubmit with a semaphore that is already "
12955 "signaled but not waited on by the queue. Wait on a "
12956 "fence that has not yet been submitted to a queue.");
Mark Mueller96a56d52016-08-24 10:28:05 -060012957
12958 ASSERT_NO_FATAL_FAILURE(InitState());
12959 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
12960
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012961 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 -070012962 const char *invalid_fence_wait_message =
12963 " which has not been submitted on a Queue or during "
12964 "acquire next image.";
Mark Mueller96a56d52016-08-24 10:28:05 -060012965
Tony Barbour552f6c02016-12-21 14:34:07 -070012966 m_commandBuffer->BeginCommandBuffer();
12967 m_commandBuffer->EndCommandBuffer();
Mark Mueller96a56d52016-08-24 10:28:05 -060012968
12969 VkSemaphoreCreateInfo semaphore_create_info = {};
12970 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
12971 VkSemaphore semaphore;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012972 ASSERT_VK_SUCCESS(vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore));
Mark Mueller96a56d52016-08-24 10:28:05 -060012973 VkSubmitInfo submit_info = {};
12974 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
12975 submit_info.commandBufferCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012976 submit_info.pCommandBuffers = &m_commandBuffer->handle();
Mark Mueller96a56d52016-08-24 10:28:05 -060012977 submit_info.signalSemaphoreCount = 1;
12978 submit_info.pSignalSemaphores = &semaphore;
12979 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
Dave Houltonfbf52152017-01-06 12:55:29 -070012980 m_errorMonitor->ExpectSuccess(0);
Mark Mueller96a56d52016-08-24 10:28:05 -060012981 vkResetCommandBuffer(m_commandBuffer->handle(), 0);
Dave Houltonfbf52152017-01-06 12:55:29 -070012982 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070012983 m_commandBuffer->BeginCommandBuffer();
12984 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012985 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, queue_forward_progress_message);
Mark Mueller96a56d52016-08-24 10:28:05 -060012986 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
12987 m_errorMonitor->VerifyFound();
12988
Mark Mueller1cd9f412016-08-25 13:23:52 -060012989 VkFenceCreateInfo fence_create_info = {};
12990 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
12991 VkFence fence;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012992 ASSERT_VK_SUCCESS(vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence));
Mark Mueller1cd9f412016-08-25 13:23:52 -060012993
Mark Lobodzinskice751c62016-09-08 10:45:35 -060012994 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, invalid_fence_wait_message);
Mark Mueller1cd9f412016-08-25 13:23:52 -060012995 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
12996 m_errorMonitor->VerifyFound();
12997
Mark Mueller4042b652016-09-05 22:52:21 -060012998 vkDeviceWaitIdle(m_device->device());
Mark Mueller1cd9f412016-08-25 13:23:52 -060012999 vkDestroyFence(m_device->device(), fence, nullptr);
Mark Mueller96a56d52016-08-24 10:28:05 -060013000 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
13001}
13002
Tobin Ehlis4af23302016-07-19 10:50:30 -060013003TEST_F(VkLayerTest, FramebufferIncompatible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013004 TEST_DESCRIPTION(
13005 "Bind a secondary command buffer with with a framebuffer "
13006 "that does not match the framebuffer for the active "
13007 "renderpass.");
Tobin Ehlis4af23302016-07-19 10:50:30 -060013008 ASSERT_NO_FATAL_FAILURE(InitState());
13009 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13010
13011 // A renderpass with one color attachment.
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013012 VkAttachmentDescription attachment = {0,
13013 VK_FORMAT_B8G8R8A8_UNORM,
13014 VK_SAMPLE_COUNT_1_BIT,
13015 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13016 VK_ATTACHMENT_STORE_OP_STORE,
13017 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
13018 VK_ATTACHMENT_STORE_OP_DONT_CARE,
13019 VK_IMAGE_LAYOUT_UNDEFINED,
13020 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013021
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013022 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013023
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013024 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013025
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013026 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013027
13028 VkRenderPass rp;
13029 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
13030 ASSERT_VK_SUCCESS(err);
13031
13032 // A compatible framebuffer.
13033 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013034 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 -060013035 ASSERT_TRUE(image.initialized());
13036
13037 VkImageViewCreateInfo ivci = {
13038 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
13039 nullptr,
13040 0,
13041 image.handle(),
13042 VK_IMAGE_VIEW_TYPE_2D,
13043 VK_FORMAT_B8G8R8A8_UNORM,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013044 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
13045 VK_COMPONENT_SWIZZLE_IDENTITY},
Tobin Ehlis4af23302016-07-19 10:50:30 -060013046 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
13047 };
13048 VkImageView view;
13049 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
13050 ASSERT_VK_SUCCESS(err);
13051
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013052 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Tobin Ehlis4af23302016-07-19 10:50:30 -060013053 VkFramebuffer fb;
13054 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
13055 ASSERT_VK_SUCCESS(err);
13056
13057 VkCommandBufferAllocateInfo cbai = {};
13058 cbai.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
13059 cbai.commandPool = m_commandPool;
13060 cbai.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
13061 cbai.commandBufferCount = 1;
13062
13063 VkCommandBuffer sec_cb;
13064 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &sec_cb);
13065 ASSERT_VK_SUCCESS(err);
13066 VkCommandBufferBeginInfo cbbi = {};
13067 VkCommandBufferInheritanceInfo cbii = {};
Chris Forbes98420382016-11-28 17:56:51 +130013068 cbii.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
Tobin Ehlis4af23302016-07-19 10:50:30 -060013069 cbii.renderPass = renderPass();
13070 cbii.framebuffer = fb;
13071 cbbi.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
13072 cbbi.pNext = NULL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013073 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 -060013074 cbbi.pInheritanceInfo = &cbii;
13075 vkBeginCommandBuffer(sec_cb, &cbbi);
13076 vkEndCommandBuffer(sec_cb);
13077
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013078 VkCommandBufferBeginInfo cbbi2 = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Chris Forbes3400bc52016-09-13 18:10:34 +120013079 vkBeginCommandBuffer(m_commandBuffer->GetBufferHandle(), &cbbi2);
13080 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
Tobin Ehlis4af23302016-07-19 10:50:30 -060013081
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013082 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060013083 " that is not the same as the primary command buffer's current active framebuffer ");
Tobin Ehlis4af23302016-07-19 10:50:30 -060013084 vkCmdExecuteCommands(m_commandBuffer->GetBufferHandle(), 1, &sec_cb);
13085 m_errorMonitor->VerifyFound();
13086 // Cleanup
13087 vkDestroyImageView(m_device->device(), view, NULL);
13088 vkDestroyRenderPass(m_device->device(), rp, NULL);
13089 vkDestroyFramebuffer(m_device->device(), fb, NULL);
13090}
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013091
13092TEST_F(VkLayerTest, ColorBlendLogicOpTests) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013093 TEST_DESCRIPTION(
13094 "If logicOp is available on the device, set it to an "
13095 "invalid value. If logicOp is not available, attempt to "
13096 "use it and verify that we see the correct error.");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013097 ASSERT_NO_FATAL_FAILURE(InitState());
13098 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13099
13100 auto features = m_device->phy().features();
13101 // Set the expected error depending on whether or not logicOp available
13102 if (VK_FALSE == features.logicOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013103 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13104 "If logic operations feature not "
13105 "enabled, logicOpEnable must be "
13106 "VK_FALSE");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013107 } else {
Chris Forbes34797bc2016-10-03 15:28:49 +130013108 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "pColorBlendState->logicOp (16)");
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013109 }
13110 // Create a pipeline using logicOp
13111 VkResult err;
13112
13113 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
13114 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13115
13116 VkPipelineLayout pipeline_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013117 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013118 ASSERT_VK_SUCCESS(err);
13119
13120 VkPipelineViewportStateCreateInfo vp_state_ci = {};
13121 vp_state_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13122 vp_state_ci.viewportCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013123 VkViewport vp = {}; // Just need dummy vp to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013124 vp_state_ci.pViewports = &vp;
13125 vp_state_ci.scissorCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013126 VkRect2D scissors = {}; // Dummy scissors to point to
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013127 vp_state_ci.pScissors = &scissors;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013128
13129 VkPipelineShaderStageCreateInfo shaderStages[2];
13130 memset(&shaderStages, 0, 2 * sizeof(VkPipelineShaderStageCreateInfo));
13131
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013132 VkShaderObj vs(m_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
13133 VkShaderObj fs(m_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013134 shaderStages[0] = vs.GetStageCreateInfo();
13135 shaderStages[1] = fs.GetStageCreateInfo();
13136
13137 VkPipelineVertexInputStateCreateInfo vi_ci = {};
13138 vi_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13139
13140 VkPipelineInputAssemblyStateCreateInfo ia_ci = {};
13141 ia_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13142 ia_ci.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13143
13144 VkPipelineRasterizationStateCreateInfo rs_ci = {};
13145 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
Chris Forbes14088512016-10-03 14:28:00 +130013146 rs_ci.lineWidth = 1.0f;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013147
13148 VkPipelineColorBlendAttachmentState att = {};
13149 att.blendEnable = VK_FALSE;
13150 att.colorWriteMask = 0xf;
13151
13152 VkPipelineColorBlendStateCreateInfo cb_ci = {};
13153 cb_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13154 // Enable logicOp & set logicOp to value 1 beyond allowed entries
13155 cb_ci.logicOpEnable = VK_TRUE;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013156 cb_ci.logicOp = VK_LOGIC_OP_RANGE_SIZE; // This should cause an error
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013157 cb_ci.attachmentCount = 1;
13158 cb_ci.pAttachments = &att;
13159
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013160 VkPipelineMultisampleStateCreateInfo ms_ci = {};
13161 ms_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_MULTISAMPLE_STATE_CREATE_INFO;
13162 ms_ci.rasterizationSamples = VK_SAMPLE_COUNT_1_BIT;
13163
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013164 VkGraphicsPipelineCreateInfo gp_ci = {};
13165 gp_ci.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13166 gp_ci.stageCount = 2;
13167 gp_ci.pStages = shaderStages;
13168 gp_ci.pVertexInputState = &vi_ci;
13169 gp_ci.pInputAssemblyState = &ia_ci;
13170 gp_ci.pViewportState = &vp_state_ci;
13171 gp_ci.pRasterizationState = &rs_ci;
13172 gp_ci.pColorBlendState = &cb_ci;
Chris Forbes8aeacbf2016-10-03 14:25:08 +130013173 gp_ci.pMultisampleState = &ms_ci;
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013174 gp_ci.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13175 gp_ci.layout = pipeline_layout;
13176 gp_ci.renderPass = renderPass();
13177
13178 VkPipelineCacheCreateInfo pc_ci = {};
13179 pc_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13180
13181 VkPipeline pipeline;
13182 VkPipelineCache pipelineCache;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013183 err = vkCreatePipelineCache(m_device->device(), &pc_ci, NULL, &pipelineCache);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013184 ASSERT_VK_SUCCESS(err);
13185
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013186 err = vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &gp_ci, NULL, &pipeline);
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013187 m_errorMonitor->VerifyFound();
13188 if (VK_SUCCESS == err) {
13189 vkDestroyPipeline(m_device->device(), pipeline, NULL);
13190 }
Tobin Ehlis52b504f2016-07-19 13:25:12 -060013191 vkDestroyPipelineCache(m_device->device(), pipelineCache, NULL);
13192 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
13193}
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013194
Mike Stroyanaccf7692015-05-12 16:00:45 -060013195#if GTEST_IS_THREADSAFE
13196struct thread_data_struct {
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013197 VkCommandBuffer commandBuffer;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013198 VkEvent event;
13199 bool bailout;
13200};
13201
Karl Schultz6addd812016-02-02 17:17:23 -070013202extern "C" void *AddToCommandBuffer(void *arg) {
13203 struct thread_data_struct *data = (struct thread_data_struct *)arg;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013204
Mike Stroyana6d14942016-07-13 15:10:05 -060013205 for (int i = 0; i < 80000; i++) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013206 vkCmdSetEvent(data->commandBuffer, data->event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013207 if (data->bailout) {
13208 break;
13209 }
13210 }
13211 return NULL;
13212}
13213
Karl Schultz6addd812016-02-02 17:17:23 -070013214TEST_F(VkLayerTest, ThreadCommandBufferCollision) {
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013215 test_platform_thread thread;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013216
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013217 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "THREADING ERROR");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013218
Mike Stroyanaccf7692015-05-12 16:00:45 -060013219 ASSERT_NO_FATAL_FAILURE(InitState());
13220 ASSERT_NO_FATAL_FAILURE(InitViewport());
13221 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13222
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013223 // Calls AllocateCommandBuffers
13224 VkCommandBufferObj commandBuffer(m_device, m_commandPool);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013225
13226 // Avoid creating RenderPass
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013227 commandBuffer.BeginCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013228
13229 VkEventCreateInfo event_info;
13230 VkEvent event;
Mike Stroyanaccf7692015-05-12 16:00:45 -060013231 VkResult err;
13232
13233 memset(&event_info, 0, sizeof(event_info));
13234 event_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
13235
Chia-I Wuf7458c52015-10-26 21:10:41 +080013236 err = vkCreateEvent(device(), &event_info, NULL, &event);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013237 ASSERT_VK_SUCCESS(err);
13238
Mike Stroyanaccf7692015-05-12 16:00:45 -060013239 err = vkResetEvent(device(), event);
13240 ASSERT_VK_SUCCESS(err);
13241
13242 struct thread_data_struct data;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013243 data.commandBuffer = commandBuffer.GetBufferHandle();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013244 data.event = event;
13245 data.bailout = false;
13246 m_errorMonitor->SetBailout(&data.bailout);
Mike Stroyana6d14942016-07-13 15:10:05 -060013247
13248 // First do some correct operations using multiple threads.
13249 // Add many entries to command buffer from another thread.
13250 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
13251 // Make non-conflicting calls from this thread at the same time.
13252 for (int i = 0; i < 80000; i++) {
Mike Stroyand6343902016-07-14 08:56:16 -060013253 uint32_t count;
13254 vkEnumeratePhysicalDevices(instance(), &count, NULL);
Mike Stroyana6d14942016-07-13 15:10:05 -060013255 }
13256 test_platform_thread_join(thread, NULL);
13257
13258 // Then do some incorrect operations using multiple threads.
Mike Stroyanaccf7692015-05-12 16:00:45 -060013259 // Add many entries to command buffer from another thread.
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013260 test_platform_thread_create(&thread, AddToCommandBuffer, (void *)&data);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013261 // Add many entries to command buffer from this thread at the same time.
13262 AddToCommandBuffer(&data);
Mark Lobodzinski5495d132015-09-30 16:19:16 -060013263
Mike Stroyan4268d1f2015-07-13 14:45:35 -060013264 test_platform_thread_join(thread, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013265 commandBuffer.EndCommandBuffer();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013266
Mike Stroyan10b8cb72016-01-22 15:22:03 -070013267 m_errorMonitor->SetBailout(NULL);
13268
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013269 m_errorMonitor->VerifyFound();
Mike Stroyanaccf7692015-05-12 16:00:45 -060013270
Chia-I Wuf7458c52015-10-26 21:10:41 +080013271 vkDestroyEvent(device(), event, NULL);
Mike Stroyanaccf7692015-05-12 16:00:45 -060013272}
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013273#endif // GTEST_IS_THREADSAFE
Mark Lobodzinski209b5292015-09-17 09:44:05 -060013274
Karl Schultz6addd812016-02-02 17:17:23 -070013275TEST_F(VkLayerTest, InvalidSPIRVCodeSize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013276 TEST_DESCRIPTION(
13277 "Test that an error is produced for a spirv module "
13278 "with an impossible code size");
Chris Forbes1cc79542016-07-20 11:13:44 +120013279
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013280 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013281
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013282 ASSERT_NO_FATAL_FAILURE(InitState());
13283 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13284
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013285 VkShaderModule module;
13286 VkShaderModuleCreateInfo moduleCreateInfo;
13287 struct icd_spv_header spv;
13288
13289 spv.magic = ICD_SPV_MAGIC;
13290 spv.version = ICD_SPV_VERSION;
13291 spv.gen_magic = 0;
13292
13293 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13294 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013295 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013296 moduleCreateInfo.codeSize = 4;
13297 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013298 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013299
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013300 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013301}
13302
Karl Schultz6addd812016-02-02 17:17:23 -070013303TEST_F(VkLayerTest, InvalidSPIRVMagic) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013304 TEST_DESCRIPTION(
13305 "Test that an error is produced for a spirv module "
13306 "with a bad magic number");
Chris Forbes1cc79542016-07-20 11:13:44 +120013307
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013308 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Invalid SPIR-V magic number");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013309
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013310 ASSERT_NO_FATAL_FAILURE(InitState());
13311 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13312
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013313 VkShaderModule module;
13314 VkShaderModuleCreateInfo moduleCreateInfo;
13315 struct icd_spv_header spv;
13316
13317 spv.magic = ~ICD_SPV_MAGIC;
13318 spv.version = ICD_SPV_VERSION;
13319 spv.gen_magic = 0;
13320
13321 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13322 moduleCreateInfo.pNext = NULL;
Karl Schultz6addd812016-02-02 17:17:23 -070013323 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013324 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13325 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013326 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013327
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013328 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013329}
13330
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013331#if 0
13332// Not currently covered by SPIRV-Tools validator
Karl Schultz6addd812016-02-02 17:17:23 -070013333TEST_F(VkLayerTest, InvalidSPIRVVersion) {
Courtney Goeltzenleuchter7415d5a2015-12-09 15:48:16 -070013334 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013335 "Invalid SPIR-V header");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013336
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013337 ASSERT_NO_FATAL_FAILURE(InitState());
13338 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13339
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013340 VkShaderModule module;
13341 VkShaderModuleCreateInfo moduleCreateInfo;
13342 struct icd_spv_header spv;
13343
13344 spv.magic = ICD_SPV_MAGIC;
13345 spv.version = ~ICD_SPV_VERSION;
13346 spv.gen_magic = 0;
13347
13348 moduleCreateInfo.sType = VK_STRUCTURE_TYPE_SHADER_MODULE_CREATE_INFO;
13349 moduleCreateInfo.pNext = NULL;
13350
Karl Schultz6addd812016-02-02 17:17:23 -070013351 moduleCreateInfo.pCode = (const uint32_t *)&spv;
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013352 moduleCreateInfo.codeSize = sizeof(spv) + 10;
13353 moduleCreateInfo.flags = 0;
Chia-I Wuf7458c52015-10-26 21:10:41 +080013354 vkCreateShaderModule(m_device->device(), &moduleCreateInfo, NULL, &module);
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013355
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013356 m_errorMonitor->VerifyFound();
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013357}
Chris Forbesb4afd0f2016-04-04 10:48:35 +120013358#endif
Courtney Goeltzenleuchter00c52b22015-09-16 12:58:29 -060013359
Karl Schultz6addd812016-02-02 17:17:23 -070013360TEST_F(VkLayerTest, CreatePipelineVertexOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013361 TEST_DESCRIPTION(
13362 "Test that a warning is produced for a vertex output that "
13363 "is not consumed by the fragment stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013364 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "not consumed by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013365
Chris Forbes9f7ff632015-05-25 11:13:08 +120013366 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013367 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013368
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013369 char const *vsSource =
13370 "#version 450\n"
13371 "\n"
13372 "layout(location=0) out float x;\n"
13373 "out gl_PerVertex {\n"
13374 " vec4 gl_Position;\n"
13375 "};\n"
13376 "void main(){\n"
13377 " gl_Position = vec4(1);\n"
13378 " x = 0;\n"
13379 "}\n";
13380 char const *fsSource =
13381 "#version 450\n"
13382 "\n"
13383 "layout(location=0) out vec4 color;\n"
13384 "void main(){\n"
13385 " color = vec4(1);\n"
13386 "}\n";
Chris Forbes9f7ff632015-05-25 11:13:08 +120013387
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013388 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13389 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013390
13391 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013392 pipe.AddColorAttachment();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013393 pipe.AddShader(&vs);
13394 pipe.AddShader(&fs);
13395
Chris Forbes9f7ff632015-05-25 11:13:08 +120013396 VkDescriptorSetObj descriptorSet(m_device);
13397 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013398 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes9f7ff632015-05-25 11:13:08 +120013399
Tony Barbour5781e8f2015-08-04 16:23:11 -060013400 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes9f7ff632015-05-25 11:13:08 +120013401
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013402 m_errorMonitor->VerifyFound();
Chris Forbes9f7ff632015-05-25 11:13:08 +120013403}
Chris Forbes9f7ff632015-05-25 11:13:08 +120013404
Mark Mueller098c9cb2016-09-08 09:01:57 -060013405TEST_F(VkLayerTest, CreatePipelineCheckShaderBadSpecialization) {
13406 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13407
13408 ASSERT_NO_FATAL_FAILURE(InitState());
13409 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13410
13411 const char *bad_specialization_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013412 "Specialization entry 0 (for constant id 0) references memory outside provided specialization data ";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013413
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013414 char const *vsSource =
13415 "#version 450\n"
13416 "\n"
13417 "out gl_PerVertex {\n"
13418 " vec4 gl_Position;\n"
13419 "};\n"
13420 "void main(){\n"
13421 " gl_Position = vec4(1);\n"
13422 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013423
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013424 char const *fsSource =
13425 "#version 450\n"
13426 "\n"
13427 "layout (constant_id = 0) const float r = 0.0f;\n"
13428 "layout(location = 0) out vec4 uFragColor;\n"
13429 "void main(){\n"
13430 " uFragColor = vec4(r,1,0,1);\n"
13431 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013432
13433 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13434 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13435
13436 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13437 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13438
13439 VkPipelineLayout pipeline_layout;
13440 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13441
13442 VkPipelineViewportStateCreateInfo vp_state_create_info = {};
13443 vp_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VIEWPORT_STATE_CREATE_INFO;
13444 vp_state_create_info.viewportCount = 1;
13445 VkViewport viewport = {};
13446 vp_state_create_info.pViewports = &viewport;
13447 vp_state_create_info.scissorCount = 1;
13448 VkRect2D scissors = {};
13449 vp_state_create_info.pScissors = &scissors;
13450
13451 VkDynamicState scissor_state = VK_DYNAMIC_STATE_SCISSOR;
13452
13453 VkPipelineDynamicStateCreateInfo pipeline_dynamic_state_create_info = {};
13454 pipeline_dynamic_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_DYNAMIC_STATE_CREATE_INFO;
13455 pipeline_dynamic_state_create_info.dynamicStateCount = 1;
13456 pipeline_dynamic_state_create_info.pDynamicStates = &scissor_state;
13457
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013458 VkPipelineShaderStageCreateInfo shader_stage_create_info[2] = {vs.GetStageCreateInfo(), fs.GetStageCreateInfo()};
Mark Mueller098c9cb2016-09-08 09:01:57 -060013459
13460 VkPipelineVertexInputStateCreateInfo vertex_input_create_info = {};
13461 vertex_input_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_VERTEX_INPUT_STATE_CREATE_INFO;
13462
13463 VkPipelineInputAssemblyStateCreateInfo input_assembly_create_info = {};
13464 input_assembly_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO;
13465 input_assembly_create_info.topology = VK_PRIMITIVE_TOPOLOGY_TRIANGLE_STRIP;
13466
13467 VkPipelineRasterizationStateCreateInfo rasterization_state_create_info = {};
13468 rasterization_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
13469 rasterization_state_create_info.pNext = nullptr;
13470 rasterization_state_create_info.lineWidth = 1.0f;
13471 rasterization_state_create_info.rasterizerDiscardEnable = true;
13472
13473 VkPipelineColorBlendAttachmentState color_blend_attachment_state = {};
13474 color_blend_attachment_state.blendEnable = VK_FALSE;
13475 color_blend_attachment_state.colorWriteMask = 0xf;
13476
13477 VkPipelineColorBlendStateCreateInfo color_blend_state_create_info = {};
13478 color_blend_state_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_COLOR_BLEND_STATE_CREATE_INFO;
13479 color_blend_state_create_info.attachmentCount = 1;
13480 color_blend_state_create_info.pAttachments = &color_blend_attachment_state;
13481
13482 VkGraphicsPipelineCreateInfo graphicspipe_create_info = {};
13483 graphicspipe_create_info.sType = VK_STRUCTURE_TYPE_GRAPHICS_PIPELINE_CREATE_INFO;
13484 graphicspipe_create_info.stageCount = 2;
13485 graphicspipe_create_info.pStages = shader_stage_create_info;
13486 graphicspipe_create_info.pVertexInputState = &vertex_input_create_info;
13487 graphicspipe_create_info.pInputAssemblyState = &input_assembly_create_info;
13488 graphicspipe_create_info.pViewportState = &vp_state_create_info;
13489 graphicspipe_create_info.pRasterizationState = &rasterization_state_create_info;
13490 graphicspipe_create_info.pColorBlendState = &color_blend_state_create_info;
13491 graphicspipe_create_info.pDynamicState = &pipeline_dynamic_state_create_info;
13492 graphicspipe_create_info.flags = VK_PIPELINE_CREATE_DISABLE_OPTIMIZATION_BIT;
13493 graphicspipe_create_info.layout = pipeline_layout;
13494 graphicspipe_create_info.renderPass = renderPass();
13495
13496 VkPipelineCacheCreateInfo pipeline_cache_create_info = {};
13497 pipeline_cache_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_CACHE_CREATE_INFO;
13498
13499 VkPipelineCache pipelineCache;
13500 ASSERT_VK_SUCCESS(vkCreatePipelineCache(m_device->device(), &pipeline_cache_create_info, nullptr, &pipelineCache));
13501
13502 // This structure maps constant ids to data locations.
13503 const VkSpecializationMapEntry entry =
13504 // id, offset, size
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013505 {0, 4, sizeof(uint32_t)}; // Challenge core validation by using a bogus offset.
Mark Mueller098c9cb2016-09-08 09:01:57 -060013506
13507 uint32_t data = 1;
13508
13509 // Set up the info describing spec map and data
13510 const VkSpecializationInfo specialization_info = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013511 1, &entry, 1 * sizeof(float), &data,
Mark Mueller098c9cb2016-09-08 09:01:57 -060013512 };
13513 shader_stage_create_info[0].pSpecializationInfo = &specialization_info;
13514
13515 VkPipeline pipeline;
13516 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_specialization_message);
13517 vkCreateGraphicsPipelines(m_device->device(), pipelineCache, 1, &graphicspipe_create_info, nullptr, &pipeline);
13518 m_errorMonitor->VerifyFound();
13519
13520 vkDestroyPipelineCache(m_device->device(), pipelineCache, nullptr);
13521 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13522}
13523
13524TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorTypeMismatch) {
13525 TEST_DESCRIPTION("Challenge core_validation with shader validation issues related to vkCreateGraphicsPipelines.");
13526
13527 ASSERT_NO_FATAL_FAILURE(InitState());
13528 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13529
13530 const char *descriptor_type_mismatch_message = "Type mismatch on descriptor slot 0.0 (used as type ";
13531
13532 VkDescriptorPoolSize descriptor_pool_type_count[2] = {};
13533 descriptor_pool_type_count[0].type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13534 descriptor_pool_type_count[0].descriptorCount = 1;
13535 descriptor_pool_type_count[1].type = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13536 descriptor_pool_type_count[1].descriptorCount = 1;
13537
13538 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13539 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13540 descriptor_pool_create_info.maxSets = 1;
13541 descriptor_pool_create_info.poolSizeCount = 2;
13542 descriptor_pool_create_info.pPoolSizes = descriptor_pool_type_count;
13543 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13544
13545 VkDescriptorPool descriptorset_pool;
13546 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13547
13548 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13549 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER;
13550 descriptorset_layout_binding.descriptorCount = 1;
13551 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_ALL;
Cody Northropa6484fd2017-03-10 14:13:49 -070013552 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013553
13554 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13555 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13556 descriptorset_layout_create_info.bindingCount = 1;
13557 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13558
13559 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013560 ASSERT_VK_SUCCESS(
13561 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013562
13563 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13564 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13565 descriptorset_allocate_info.descriptorSetCount = 1;
13566 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13567 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13568 VkDescriptorSet descriptorset;
13569 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13570
13571 // Challenge core_validation with a non uniform buffer type.
13572 VkBufferTest storage_buffer_test(m_device, VK_BUFFER_USAGE_STORAGE_BUFFER_BIT);
13573
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013574 char const *vsSource =
13575 "#version 450\n"
13576 "\n"
13577 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13578 " mat4 mvp;\n"
13579 "} ubuf;\n"
13580 "out gl_PerVertex {\n"
13581 " vec4 gl_Position;\n"
13582 "};\n"
13583 "void main(){\n"
13584 " gl_Position = ubuf.mvp * vec4(1);\n"
13585 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013586
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013587 char const *fsSource =
13588 "#version 450\n"
13589 "\n"
13590 "layout(location = 0) out vec4 uFragColor;\n"
13591 "void main(){\n"
13592 " uFragColor = vec4(0,1,0,1);\n"
13593 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013594
13595 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13596 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13597
13598 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13599 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13600 pipeline_layout_create_info.setLayoutCount = 1;
13601 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13602
13603 VkPipelineLayout pipeline_layout;
13604 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13605
13606 VkPipelineObj pipe(m_device);
13607 pipe.AddColorAttachment();
13608 pipe.AddShader(&vs);
13609 pipe.AddShader(&fs);
13610
13611 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_type_mismatch_message);
13612 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13613 m_errorMonitor->VerifyFound();
13614
13615 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13616 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13617 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13618}
13619
13620TEST_F(VkLayerTest, CreatePipelineCheckShaderDescriptorNotAccessible) {
13621 TEST_DESCRIPTION(
13622 "Create a pipeline in which a descriptor used by a shader stage does not include that stage in its stageFlags.");
13623
13624 ASSERT_NO_FATAL_FAILURE(InitState());
13625 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13626
13627 const char *descriptor_not_accessible_message = "Shader uses descriptor slot 0.0 (used as type ";
13628
13629 VkDescriptorPoolSize descriptor_pool_type_count = {};
13630 descriptor_pool_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13631 descriptor_pool_type_count.descriptorCount = 1;
13632
13633 VkDescriptorPoolCreateInfo descriptor_pool_create_info = {};
13634 descriptor_pool_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
13635 descriptor_pool_create_info.maxSets = 1;
13636 descriptor_pool_create_info.poolSizeCount = 1;
13637 descriptor_pool_create_info.pPoolSizes = &descriptor_pool_type_count;
13638 descriptor_pool_create_info.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
13639
13640 VkDescriptorPool descriptorset_pool;
13641 ASSERT_VK_SUCCESS(vkCreateDescriptorPool(m_device->device(), &descriptor_pool_create_info, nullptr, &descriptorset_pool));
13642
13643 VkDescriptorSetLayoutBinding descriptorset_layout_binding = {};
13644 descriptorset_layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
13645 descriptorset_layout_binding.descriptorCount = 1;
13646 // Intentionally make the uniform buffer inaccessible to the vertex shader to challenge core_validation
13647 descriptorset_layout_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
Cody Northropa6484fd2017-03-10 14:13:49 -070013648 descriptorset_layout_binding.pImmutableSamplers = nullptr;
Mark Mueller098c9cb2016-09-08 09:01:57 -060013649
13650 VkDescriptorSetLayoutCreateInfo descriptorset_layout_create_info = {};
13651 descriptorset_layout_create_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
13652 descriptorset_layout_create_info.bindingCount = 1;
13653 descriptorset_layout_create_info.pBindings = &descriptorset_layout_binding;
13654
13655 VkDescriptorSetLayout descriptorset_layout;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013656 ASSERT_VK_SUCCESS(
13657 vkCreateDescriptorSetLayout(m_device->device(), &descriptorset_layout_create_info, nullptr, &descriptorset_layout));
Mark Mueller098c9cb2016-09-08 09:01:57 -060013658
13659 VkDescriptorSetAllocateInfo descriptorset_allocate_info = {};
13660 descriptorset_allocate_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
13661 descriptorset_allocate_info.descriptorSetCount = 1;
13662 descriptorset_allocate_info.descriptorPool = descriptorset_pool;
13663 descriptorset_allocate_info.pSetLayouts = &descriptorset_layout;
13664 VkDescriptorSet descriptorset;
13665 ASSERT_VK_SUCCESS(vkAllocateDescriptorSets(m_device->device(), &descriptorset_allocate_info, &descriptorset));
13666
13667 VkBufferTest buffer_test(m_device, VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT);
13668
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013669 char const *vsSource =
13670 "#version 450\n"
13671 "\n"
13672 "layout (std140, set = 0, binding = 0) uniform buf {\n"
13673 " mat4 mvp;\n"
13674 "} ubuf;\n"
13675 "out gl_PerVertex {\n"
13676 " vec4 gl_Position;\n"
13677 "};\n"
13678 "void main(){\n"
13679 " gl_Position = ubuf.mvp * vec4(1);\n"
13680 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013681
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013682 char const *fsSource =
13683 "#version 450\n"
13684 "\n"
13685 "layout(location = 0) out vec4 uFragColor;\n"
13686 "void main(){\n"
13687 " uFragColor = vec4(0,1,0,1);\n"
13688 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013689
13690 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13691 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13692
13693 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13694 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13695 pipeline_layout_create_info.setLayoutCount = 1;
13696 pipeline_layout_create_info.pSetLayouts = &descriptorset_layout;
13697
13698 VkPipelineLayout pipeline_layout;
13699 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13700
13701 VkPipelineObj pipe(m_device);
13702 pipe.AddColorAttachment();
13703 pipe.AddShader(&vs);
13704 pipe.AddShader(&fs);
13705
13706 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, descriptor_not_accessible_message);
13707 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13708 m_errorMonitor->VerifyFound();
13709
13710 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13711 vkDestroyDescriptorPool(m_device->device(), descriptorset_pool, nullptr);
13712 vkDestroyDescriptorSetLayout(m_device->device(), descriptorset_layout, nullptr);
13713}
13714
13715TEST_F(VkLayerTest, CreatePipelineCheckShaderPushConstantNotAccessible) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013716 TEST_DESCRIPTION(
13717 "Create a graphics pipleine in which a push constant range containing a push constant block member is not "
13718 "accessible from the current shader stage.");
Mark Mueller098c9cb2016-09-08 09:01:57 -060013719
13720 ASSERT_NO_FATAL_FAILURE(InitState());
13721 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13722
13723 const char *push_constant_not_accessible_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013724 "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 -060013725
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013726 char const *vsSource =
13727 "#version 450\n"
13728 "\n"
13729 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
13730 "out gl_PerVertex {\n"
13731 " vec4 gl_Position;\n"
13732 "};\n"
13733 "void main(){\n"
13734 " gl_Position = vec4(consts.x);\n"
13735 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013736
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013737 char const *fsSource =
13738 "#version 450\n"
13739 "\n"
13740 "layout(location = 0) out vec4 uFragColor;\n"
13741 "void main(){\n"
13742 " uFragColor = vec4(0,1,0,1);\n"
13743 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013744
13745 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13746 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13747
13748 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13749 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13750
13751 // Set up a push constant range
13752 VkPushConstantRange push_constant_ranges = {};
13753 // Set to the wrong stage to challenge core_validation
13754 push_constant_ranges.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
13755 push_constant_ranges.size = 4;
13756
13757 pipeline_layout_create_info.pPushConstantRanges = &push_constant_ranges;
13758 pipeline_layout_create_info.pushConstantRangeCount = 1;
13759
13760 VkPipelineLayout pipeline_layout;
13761 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13762
13763 VkPipelineObj pipe(m_device);
13764 pipe.AddColorAttachment();
13765 pipe.AddShader(&vs);
13766 pipe.AddShader(&fs);
13767
13768 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, push_constant_not_accessible_message);
13769 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13770 m_errorMonitor->VerifyFound();
13771
13772 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13773}
13774
13775TEST_F(VkLayerTest, CreatePipelineCheckShaderNotEnabled) {
13776 TEST_DESCRIPTION(
13777 "Create a graphics pipeline in which a capability declared by the shader requires a feature not enabled on the device.");
13778
13779 ASSERT_NO_FATAL_FAILURE(InitState());
13780 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13781
13782 const char *feature_not_enabled_message =
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070013783 "Shader requires VkPhysicalDeviceFeatures::shaderFloat64 but is not enabled on the device";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013784
13785 // Some awkward steps are required to test with custom device features.
13786 std::vector<const char *> device_extension_names;
13787 auto features = m_device->phy().features();
13788 // Disable support for 64 bit floats
13789 features.shaderFloat64 = false;
13790 // The sacrificial device object
13791 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
13792
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013793 char const *vsSource =
13794 "#version 450\n"
13795 "\n"
13796 "out gl_PerVertex {\n"
13797 " vec4 gl_Position;\n"
13798 "};\n"
13799 "void main(){\n"
13800 " gl_Position = vec4(1);\n"
13801 "}\n";
13802 char const *fsSource =
13803 "#version 450\n"
13804 "\n"
13805 "layout(location=0) out vec4 color;\n"
13806 "void main(){\n"
13807 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
13808 " color = vec4(green);\n"
13809 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013810
13811 VkShaderObj vs(&test_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13812 VkShaderObj fs(&test_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13813
13814 VkRenderpassObj render_pass(&test_device);
Mark Mueller098c9cb2016-09-08 09:01:57 -060013815
13816 VkPipelineObj pipe(&test_device);
13817 pipe.AddColorAttachment();
13818 pipe.AddShader(&vs);
13819 pipe.AddShader(&fs);
13820
13821 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13822 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13823 VkPipelineLayout pipeline_layout;
13824 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(test_device.device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13825
13826 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, feature_not_enabled_message);
13827 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
13828 m_errorMonitor->VerifyFound();
13829
13830 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, nullptr);
13831}
13832
13833TEST_F(VkLayerTest, CreatePipelineCheckShaderBadCapability) {
13834 TEST_DESCRIPTION("Create a graphics pipeline in which a capability declared by the shader is not supported by Vulkan shaders.");
13835
13836 ASSERT_NO_FATAL_FAILURE(InitState());
13837 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13838
13839 const char *bad_capability_message = "Shader declares capability 53, not supported in Vulkan.";
13840
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013841 char const *vsSource =
13842 "#version 450\n"
13843 "\n"
13844 "out gl_PerVertex {\n"
13845 " vec4 gl_Position;\n"
13846 "};\n"
13847 "layout(xfb_buffer = 1) out;"
13848 "void main(){\n"
13849 " gl_Position = vec4(1);\n"
13850 "}\n";
13851 char const *fsSource =
13852 "#version 450\n"
13853 "\n"
13854 "layout(location=0) out vec4 color;\n"
13855 "void main(){\n"
13856 " dvec4 green = vec4(0.0, 1.0, 0.0, 1.0);\n"
13857 " color = vec4(green);\n"
13858 "}\n";
Mark Mueller098c9cb2016-09-08 09:01:57 -060013859
13860 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13861 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13862
13863 VkPipelineObj pipe(m_device);
13864 pipe.AddColorAttachment();
13865 pipe.AddShader(&vs);
13866 pipe.AddShader(&fs);
13867
13868 VkPipelineLayoutCreateInfo pipeline_layout_create_info = {};
13869 pipeline_layout_create_info.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
13870 VkPipelineLayout pipeline_layout;
13871 ASSERT_VK_SUCCESS(vkCreatePipelineLayout(m_device->device(), &pipeline_layout_create_info, nullptr, &pipeline_layout));
13872
13873 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, bad_capability_message);
13874 pipe.CreateVKPipeline(pipeline_layout, renderPass());
13875 m_errorMonitor->VerifyFound();
13876
13877 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, nullptr);
13878}
13879
Karl Schultz6addd812016-02-02 17:17:23 -070013880TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013881 TEST_DESCRIPTION(
13882 "Test that an error is produced for a fragment shader input "
13883 "which is not present in the outputs of the previous stage");
Chris Forbes1cc79542016-07-20 11:13:44 +120013884
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013885 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060013886
Chris Forbes59cb88d2015-05-25 11:13:13 +120013887 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060013888 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes59cb88d2015-05-25 11:13:13 +120013889
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013890 char const *vsSource =
13891 "#version 450\n"
13892 "\n"
13893 "out gl_PerVertex {\n"
13894 " vec4 gl_Position;\n"
13895 "};\n"
13896 "void main(){\n"
13897 " gl_Position = vec4(1);\n"
13898 "}\n";
13899 char const *fsSource =
13900 "#version 450\n"
13901 "\n"
13902 "layout(location=0) in float x;\n"
13903 "layout(location=0) out vec4 color;\n"
13904 "void main(){\n"
13905 " color = vec4(x);\n"
13906 "}\n";
Chris Forbes59cb88d2015-05-25 11:13:13 +120013907
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060013908 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13909 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes59cb88d2015-05-25 11:13:13 +120013910
13911 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080013912 pipe.AddColorAttachment();
Chris Forbes59cb88d2015-05-25 11:13:13 +120013913 pipe.AddShader(&vs);
13914 pipe.AddShader(&fs);
13915
Chris Forbes59cb88d2015-05-25 11:13:13 +120013916 VkDescriptorSetObj descriptorSet(m_device);
13917 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080013918 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes59cb88d2015-05-25 11:13:13 +120013919
Tony Barbour5781e8f2015-08-04 16:23:11 -060013920 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes59cb88d2015-05-25 11:13:13 +120013921
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013922 m_errorMonitor->VerifyFound();
Chris Forbes59cb88d2015-05-25 11:13:13 +120013923}
13924
Karl Schultz6addd812016-02-02 17:17:23 -070013925TEST_F(VkLayerTest, CreatePipelineFragmentInputNotProvidedInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013926 TEST_DESCRIPTION(
13927 "Test that an error is produced for a fragment shader input "
13928 "within an interace block, which is not present in the outputs "
13929 "of the previous stage.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060013930 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not written by vertex shader");
Chris Forbesa3e85f62016-01-15 14:53:11 +130013931
13932 ASSERT_NO_FATAL_FAILURE(InitState());
13933 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13934
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013935 char const *vsSource =
13936 "#version 450\n"
13937 "\n"
13938 "out gl_PerVertex {\n"
13939 " vec4 gl_Position;\n"
13940 "};\n"
13941 "void main(){\n"
13942 " gl_Position = vec4(1);\n"
13943 "}\n";
13944 char const *fsSource =
13945 "#version 450\n"
13946 "\n"
13947 "in block { layout(location=0) float x; } ins;\n"
13948 "layout(location=0) out vec4 color;\n"
13949 "void main(){\n"
13950 " color = vec4(ins.x);\n"
13951 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130013952
13953 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
13954 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
13955
13956 VkPipelineObj pipe(m_device);
13957 pipe.AddColorAttachment();
13958 pipe.AddShader(&vs);
13959 pipe.AddShader(&fs);
13960
13961 VkDescriptorSetObj descriptorSet(m_device);
13962 descriptorSet.AppendDummy();
13963 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
13964
13965 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
13966
Chris Forbes8f36a8a2016-04-07 13:21:07 +120013967 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130013968}
13969
Karl Schultz6addd812016-02-02 17:17:23 -070013970TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchArraySize) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013971 TEST_DESCRIPTION(
13972 "Test that an error is produced for mismatched array sizes "
13973 "across the vertex->fragment shader interface");
13974 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
13975 "Type mismatch on location 0.0: 'ptr to "
13976 "output arr[2] of float32' vs 'ptr to "
13977 "input arr[1] of float32'");
Chris Forbes0036fd12016-01-26 14:19:49 +130013978
13979 ASSERT_NO_FATAL_FAILURE(InitState());
13980 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
13981
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070013982 char const *vsSource =
13983 "#version 450\n"
13984 "\n"
13985 "layout(location=0) out float x[2];\n"
13986 "out gl_PerVertex {\n"
13987 " vec4 gl_Position;\n"
13988 "};\n"
13989 "void main(){\n"
13990 " x[0] = 0; x[1] = 0;\n"
13991 " gl_Position = vec4(1);\n"
13992 "}\n";
13993 char const *fsSource =
13994 "#version 450\n"
13995 "\n"
13996 "layout(location=0) in float x[1];\n"
13997 "layout(location=0) out vec4 color;\n"
13998 "void main(){\n"
13999 " color = vec4(x[0]);\n"
14000 "}\n";
Chris Forbes0036fd12016-01-26 14:19:49 +130014001
14002 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14003 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14004
14005 VkPipelineObj pipe(m_device);
14006 pipe.AddColorAttachment();
14007 pipe.AddShader(&vs);
14008 pipe.AddShader(&fs);
14009
14010 VkDescriptorSetObj descriptorSet(m_device);
14011 descriptorSet.AppendDummy();
14012 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14013
14014 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14015
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014016 m_errorMonitor->VerifyFound();
Chris Forbes0036fd12016-01-26 14:19:49 +130014017}
14018
Karl Schultz6addd812016-02-02 17:17:23 -070014019TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014020 TEST_DESCRIPTION(
14021 "Test that an error is produced for mismatched types across "
14022 "the vertex->fragment shader interface");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014023 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014024
Chris Forbesb56af562015-05-25 11:13:17 +120014025 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014026 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesb56af562015-05-25 11:13:17 +120014027
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014028 char const *vsSource =
14029 "#version 450\n"
14030 "\n"
14031 "layout(location=0) out int x;\n"
14032 "out gl_PerVertex {\n"
14033 " vec4 gl_Position;\n"
14034 "};\n"
14035 "void main(){\n"
14036 " x = 0;\n"
14037 " gl_Position = vec4(1);\n"
14038 "}\n";
14039 char const *fsSource =
14040 "#version 450\n"
14041 "\n"
14042 "layout(location=0) in float x;\n" /* VS writes int */
14043 "layout(location=0) out vec4 color;\n"
14044 "void main(){\n"
14045 " color = vec4(x);\n"
14046 "}\n";
Chris Forbesb56af562015-05-25 11:13:17 +120014047
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014048 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14049 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesb56af562015-05-25 11:13:17 +120014050
14051 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014052 pipe.AddColorAttachment();
Chris Forbesb56af562015-05-25 11:13:17 +120014053 pipe.AddShader(&vs);
14054 pipe.AddShader(&fs);
14055
Chris Forbesb56af562015-05-25 11:13:17 +120014056 VkDescriptorSetObj descriptorSet(m_device);
14057 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014058 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesb56af562015-05-25 11:13:17 +120014059
Tony Barbour5781e8f2015-08-04 16:23:11 -060014060 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesb56af562015-05-25 11:13:17 +120014061
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014062 m_errorMonitor->VerifyFound();
Chris Forbesb56af562015-05-25 11:13:17 +120014063}
14064
Karl Schultz6addd812016-02-02 17:17:23 -070014065TEST_F(VkLayerTest, CreatePipelineVsFsTypeMismatchInBlock) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014066 TEST_DESCRIPTION(
14067 "Test that an error is produced for mismatched types across "
14068 "the vertex->fragment shader interface, when the variable is contained within "
14069 "an interface block");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014070 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Type mismatch on location 0");
Chris Forbesa3e85f62016-01-15 14:53:11 +130014071
14072 ASSERT_NO_FATAL_FAILURE(InitState());
14073 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14074
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014075 char const *vsSource =
14076 "#version 450\n"
14077 "\n"
14078 "out block { layout(location=0) int x; } outs;\n"
14079 "out gl_PerVertex {\n"
14080 " vec4 gl_Position;\n"
14081 "};\n"
14082 "void main(){\n"
14083 " outs.x = 0;\n"
14084 " gl_Position = vec4(1);\n"
14085 "}\n";
14086 char const *fsSource =
14087 "#version 450\n"
14088 "\n"
14089 "in block { layout(location=0) float x; } ins;\n" /* VS writes int */
14090 "layout(location=0) out vec4 color;\n"
14091 "void main(){\n"
14092 " color = vec4(ins.x);\n"
14093 "}\n";
Chris Forbesa3e85f62016-01-15 14:53:11 +130014094
14095 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14096 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14097
14098 VkPipelineObj pipe(m_device);
14099 pipe.AddColorAttachment();
14100 pipe.AddShader(&vs);
14101 pipe.AddShader(&fs);
14102
14103 VkDescriptorSetObj descriptorSet(m_device);
14104 descriptorSet.AppendDummy();
14105 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14106
14107 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14108
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014109 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014110}
14111
14112TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByLocation) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014113 TEST_DESCRIPTION(
14114 "Test that an error is produced for location mismatches across "
14115 "the vertex->fragment shader interface; This should manifest as a not-written/not-consumed "
14116 "pair, but flushes out broken walking of the interfaces");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014117 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 +130014118
14119 ASSERT_NO_FATAL_FAILURE(InitState());
14120 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14121
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014122 char const *vsSource =
14123 "#version 450\n"
14124 "\n"
14125 "out block { layout(location=1) float x; } outs;\n"
14126 "out gl_PerVertex {\n"
14127 " vec4 gl_Position;\n"
14128 "};\n"
14129 "void main(){\n"
14130 " outs.x = 0;\n"
14131 " gl_Position = vec4(1);\n"
14132 "}\n";
14133 char const *fsSource =
14134 "#version 450\n"
14135 "\n"
14136 "in block { layout(location=0) float x; } ins;\n"
14137 "layout(location=0) out vec4 color;\n"
14138 "void main(){\n"
14139 " color = vec4(ins.x);\n"
14140 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014141
14142 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14143 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14144
14145 VkPipelineObj pipe(m_device);
14146 pipe.AddColorAttachment();
14147 pipe.AddShader(&vs);
14148 pipe.AddShader(&fs);
14149
14150 VkDescriptorSetObj descriptorSet(m_device);
14151 descriptorSet.AppendDummy();
14152 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14153
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070014154 m_errorMonitor->SetUnexpectedError("Vertex shader consumes input at location 1 but not provided");
Chris Forbese9928822016-02-17 14:44:52 +130014155 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14156
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014157 m_errorMonitor->VerifyFound();
Chris Forbese9928822016-02-17 14:44:52 +130014158}
14159
14160TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByComponent) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014161 TEST_DESCRIPTION(
14162 "Test that an error is produced for component mismatches across the "
14163 "vertex->fragment shader interface. It's not enough to have the same set of locations in "
14164 "use; matching is defined in terms of spirv variables.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014165 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 +130014166
14167 ASSERT_NO_FATAL_FAILURE(InitState());
14168 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14169
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014170 char const *vsSource =
14171 "#version 450\n"
14172 "\n"
14173 "out block { layout(location=0, component=0) float x; } outs;\n"
14174 "out gl_PerVertex {\n"
14175 " vec4 gl_Position;\n"
14176 "};\n"
14177 "void main(){\n"
14178 " outs.x = 0;\n"
14179 " gl_Position = vec4(1);\n"
14180 "}\n";
14181 char const *fsSource =
14182 "#version 450\n"
14183 "\n"
14184 "in block { layout(location=0, component=1) float x; } ins;\n"
14185 "layout(location=0) out vec4 color;\n"
14186 "void main(){\n"
14187 " color = vec4(ins.x);\n"
14188 "}\n";
Chris Forbese9928822016-02-17 14:44:52 +130014189
14190 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14191 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14192
14193 VkPipelineObj pipe(m_device);
14194 pipe.AddColorAttachment();
14195 pipe.AddShader(&vs);
14196 pipe.AddShader(&fs);
14197
14198 VkDescriptorSetObj descriptorSet(m_device);
14199 descriptorSet.AppendDummy();
14200 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14201
14202 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14203
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014204 m_errorMonitor->VerifyFound();
Chris Forbesa3e85f62016-01-15 14:53:11 +130014205}
14206
Chris Forbes1f3b0152016-11-30 12:48:40 +130014207TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecision) {
14208 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14209
14210 ASSERT_NO_FATAL_FAILURE(InitState());
14211 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14212
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014213 char const *vsSource =
14214 "#version 450\n"
14215 "layout(location=0) out mediump float x;\n"
14216 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14217 char const *fsSource =
14218 "#version 450\n"
14219 "layout(location=0) in highp float x;\n"
14220 "layout(location=0) out vec4 color;\n"
14221 "void main() { color = vec4(x); }\n";
Chris Forbes1f3b0152016-11-30 12:48:40 +130014222
14223 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14224 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14225
14226 VkPipelineObj pipe(m_device);
14227 pipe.AddColorAttachment();
14228 pipe.AddShader(&vs);
14229 pipe.AddShader(&fs);
14230
14231 VkDescriptorSetObj descriptorSet(m_device);
14232 descriptorSet.AppendDummy();
14233 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14234
14235 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14236
14237 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14238
14239 m_errorMonitor->VerifyFound();
14240}
14241
Chris Forbes870a39e2016-11-30 12:55:56 +130014242TEST_F(VkLayerTest, CreatePipelineVsFsMismatchByPrecisionBlock) {
14243 TEST_DESCRIPTION("Test that the RelaxedPrecision decoration is validated to match");
14244
14245 ASSERT_NO_FATAL_FAILURE(InitState());
14246 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14247
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014248 char const *vsSource =
14249 "#version 450\n"
14250 "out block { layout(location=0) mediump float x; };\n"
14251 "void main() { gl_Position = vec4(0); x = 1.0; }\n";
14252 char const *fsSource =
14253 "#version 450\n"
14254 "in block { layout(location=0) highp float x; };\n"
14255 "layout(location=0) out vec4 color;\n"
14256 "void main() { color = vec4(x); }\n";
Chris Forbes870a39e2016-11-30 12:55:56 +130014257
14258 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14259 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14260
14261 VkPipelineObj pipe(m_device);
14262 pipe.AddColorAttachment();
14263 pipe.AddShader(&vs);
14264 pipe.AddShader(&fs);
14265
14266 VkDescriptorSetObj descriptorSet(m_device);
14267 descriptorSet.AppendDummy();
14268 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14269
14270 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "differ in precision");
14271
14272 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14273
14274 m_errorMonitor->VerifyFound();
14275}
14276
Karl Schultz6addd812016-02-02 17:17:23 -070014277TEST_F(VkLayerTest, CreatePipelineAttribNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014278 TEST_DESCRIPTION(
14279 "Test that a warning is produced for a vertex attribute which is "
14280 "not consumed by the vertex shader");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014281 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014282
Chris Forbesde136e02015-05-25 11:13:28 +120014283 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014284 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesde136e02015-05-25 11:13:28 +120014285
14286 VkVertexInputBindingDescription input_binding;
14287 memset(&input_binding, 0, sizeof(input_binding));
14288
14289 VkVertexInputAttributeDescription input_attrib;
14290 memset(&input_attrib, 0, sizeof(input_attrib));
14291 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14292
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014293 char const *vsSource =
14294 "#version 450\n"
14295 "\n"
14296 "out gl_PerVertex {\n"
14297 " vec4 gl_Position;\n"
14298 "};\n"
14299 "void main(){\n"
14300 " gl_Position = vec4(1);\n"
14301 "}\n";
14302 char const *fsSource =
14303 "#version 450\n"
14304 "\n"
14305 "layout(location=0) out vec4 color;\n"
14306 "void main(){\n"
14307 " color = vec4(1);\n"
14308 "}\n";
Chris Forbesde136e02015-05-25 11:13:28 +120014309
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014310 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14311 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesde136e02015-05-25 11:13:28 +120014312
14313 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014314 pipe.AddColorAttachment();
Chris Forbesde136e02015-05-25 11:13:28 +120014315 pipe.AddShader(&vs);
14316 pipe.AddShader(&fs);
14317
14318 pipe.AddVertexInputBindings(&input_binding, 1);
14319 pipe.AddVertexInputAttribs(&input_attrib, 1);
14320
Chris Forbesde136e02015-05-25 11:13:28 +120014321 VkDescriptorSetObj descriptorSet(m_device);
14322 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014323 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesde136e02015-05-25 11:13:28 +120014324
Tony Barbour5781e8f2015-08-04 16:23:11 -060014325 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesde136e02015-05-25 11:13:28 +120014326
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014327 m_errorMonitor->VerifyFound();
Chris Forbesde136e02015-05-25 11:13:28 +120014328}
14329
Karl Schultz6addd812016-02-02 17:17:23 -070014330TEST_F(VkLayerTest, CreatePipelineAttribLocationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014331 TEST_DESCRIPTION(
14332 "Test that a warning is produced for a location mismatch on "
14333 "vertex attributes. This flushes out bad behavior in the interface walker");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014334 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_PERFORMANCE_WARNING_BIT_EXT, "location 0 not consumed by vertex shader");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014335
14336 ASSERT_NO_FATAL_FAILURE(InitState());
14337 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14338
14339 VkVertexInputBindingDescription input_binding;
14340 memset(&input_binding, 0, sizeof(input_binding));
14341
14342 VkVertexInputAttributeDescription input_attrib;
14343 memset(&input_attrib, 0, sizeof(input_attrib));
14344 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14345
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014346 char const *vsSource =
14347 "#version 450\n"
14348 "\n"
14349 "layout(location=1) in float x;\n"
14350 "out gl_PerVertex {\n"
14351 " vec4 gl_Position;\n"
14352 "};\n"
14353 "void main(){\n"
14354 " gl_Position = vec4(x);\n"
14355 "}\n";
14356 char const *fsSource =
14357 "#version 450\n"
14358 "\n"
14359 "layout(location=0) out vec4 color;\n"
14360 "void main(){\n"
14361 " color = vec4(1);\n"
14362 "}\n";
Chris Forbes7d83cd52016-01-15 11:32:03 +130014363
14364 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14365 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14366
14367 VkPipelineObj pipe(m_device);
14368 pipe.AddColorAttachment();
14369 pipe.AddShader(&vs);
14370 pipe.AddShader(&fs);
14371
14372 pipe.AddVertexInputBindings(&input_binding, 1);
14373 pipe.AddVertexInputAttribs(&input_attrib, 1);
14374
14375 VkDescriptorSetObj descriptorSet(m_device);
14376 descriptorSet.AppendDummy();
14377 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14378
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070014379 m_errorMonitor->SetUnexpectedError("Vertex shader consumes input at location 1 but not provided");
Chris Forbes7d83cd52016-01-15 11:32:03 +130014380 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14381
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014382 m_errorMonitor->VerifyFound();
Chris Forbes7d83cd52016-01-15 11:32:03 +130014383}
14384
Karl Schultz6addd812016-02-02 17:17:23 -070014385TEST_F(VkLayerTest, CreatePipelineAttribNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014386 TEST_DESCRIPTION(
14387 "Test that an error is produced for a vertex shader input which is not "
14388 "provided by a vertex attribute");
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014389 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14390 "Vertex shader consumes input at location 0 but not provided");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014391
Chris Forbes62e8e502015-05-25 11:13:29 +120014392 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014393 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes62e8e502015-05-25 11:13:29 +120014394
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014395 char const *vsSource =
14396 "#version 450\n"
14397 "\n"
14398 "layout(location=0) in vec4 x;\n" /* not provided */
14399 "out gl_PerVertex {\n"
14400 " vec4 gl_Position;\n"
14401 "};\n"
14402 "void main(){\n"
14403 " gl_Position = x;\n"
14404 "}\n";
14405 char const *fsSource =
14406 "#version 450\n"
14407 "\n"
14408 "layout(location=0) out vec4 color;\n"
14409 "void main(){\n"
14410 " color = vec4(1);\n"
14411 "}\n";
Chris Forbes62e8e502015-05-25 11:13:29 +120014412
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014413 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14414 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes62e8e502015-05-25 11:13:29 +120014415
14416 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014417 pipe.AddColorAttachment();
Chris Forbes62e8e502015-05-25 11:13:29 +120014418 pipe.AddShader(&vs);
14419 pipe.AddShader(&fs);
14420
Chris Forbes62e8e502015-05-25 11:13:29 +120014421 VkDescriptorSetObj descriptorSet(m_device);
14422 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014423 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes62e8e502015-05-25 11:13:29 +120014424
Tony Barbour5781e8f2015-08-04 16:23:11 -060014425 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes62e8e502015-05-25 11:13:29 +120014426
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014427 m_errorMonitor->VerifyFound();
Chris Forbes62e8e502015-05-25 11:13:29 +120014428}
14429
Karl Schultz6addd812016-02-02 17:17:23 -070014430TEST_F(VkLayerTest, CreatePipelineAttribTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014431 TEST_DESCRIPTION(
14432 "Test that an error is produced for a mismatch between the "
14433 "fundamental type (float/int/uint) of an attribute and the "
14434 "vertex shader input that consumes it");
Mike Weiblen15bd38e2016-10-03 19:19:41 -060014435 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 -060014436
Chris Forbesc97d98e2015-05-25 11:13:31 +120014437 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014438 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014439
14440 VkVertexInputBindingDescription input_binding;
14441 memset(&input_binding, 0, sizeof(input_binding));
14442
14443 VkVertexInputAttributeDescription input_attrib;
14444 memset(&input_attrib, 0, sizeof(input_attrib));
14445 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14446
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014447 char const *vsSource =
14448 "#version 450\n"
14449 "\n"
14450 "layout(location=0) in int x;\n" /* attrib provided float */
14451 "out gl_PerVertex {\n"
14452 " vec4 gl_Position;\n"
14453 "};\n"
14454 "void main(){\n"
14455 " gl_Position = vec4(x);\n"
14456 "}\n";
14457 char const *fsSource =
14458 "#version 450\n"
14459 "\n"
14460 "layout(location=0) out vec4 color;\n"
14461 "void main(){\n"
14462 " color = vec4(1);\n"
14463 "}\n";
Chris Forbesc97d98e2015-05-25 11:13:31 +120014464
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014465 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14466 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014467
14468 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014469 pipe.AddColorAttachment();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014470 pipe.AddShader(&vs);
14471 pipe.AddShader(&fs);
14472
14473 pipe.AddVertexInputBindings(&input_binding, 1);
14474 pipe.AddVertexInputAttribs(&input_attrib, 1);
14475
Chris Forbesc97d98e2015-05-25 11:13:31 +120014476 VkDescriptorSetObj descriptorSet(m_device);
14477 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014478 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesc97d98e2015-05-25 11:13:31 +120014479
Tony Barbour5781e8f2015-08-04 16:23:11 -060014480 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesc97d98e2015-05-25 11:13:31 +120014481
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014482 m_errorMonitor->VerifyFound();
Chris Forbesc97d98e2015-05-25 11:13:31 +120014483}
14484
Chris Forbesc68b43c2016-04-06 11:18:47 +120014485TEST_F(VkLayerTest, CreatePipelineDuplicateStage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014486 TEST_DESCRIPTION(
14487 "Test that an error is produced for a pipeline containing multiple "
14488 "shaders for the same stage");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014489 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14490 "Multiple shaders provided for stage VK_SHADER_STAGE_VERTEX_BIT");
Chris Forbesc68b43c2016-04-06 11:18:47 +120014491
14492 ASSERT_NO_FATAL_FAILURE(InitState());
14493 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14494
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014495 char const *vsSource =
14496 "#version 450\n"
14497 "\n"
14498 "out gl_PerVertex {\n"
14499 " vec4 gl_Position;\n"
14500 "};\n"
14501 "void main(){\n"
14502 " gl_Position = vec4(1);\n"
14503 "}\n";
14504 char const *fsSource =
14505 "#version 450\n"
14506 "\n"
14507 "layout(location=0) out vec4 color;\n"
14508 "void main(){\n"
14509 " color = vec4(1);\n"
14510 "}\n";
Chris Forbesc68b43c2016-04-06 11:18:47 +120014511
14512 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14513 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14514
14515 VkPipelineObj pipe(m_device);
14516 pipe.AddColorAttachment();
14517 pipe.AddShader(&vs);
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014518 pipe.AddShader(&vs); // intentionally duplicate vertex shader attachment
Chris Forbesc68b43c2016-04-06 11:18:47 +120014519 pipe.AddShader(&fs);
14520
14521 VkDescriptorSetObj descriptorSet(m_device);
14522 descriptorSet.AppendDummy();
14523 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14524
14525 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14526
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014527 m_errorMonitor->VerifyFound();
Chris Forbesc68b43c2016-04-06 11:18:47 +120014528}
14529
Chris Forbes82ff92a2016-09-09 10:50:24 +120014530TEST_F(VkLayerTest, CreatePipelineMissingEntrypoint) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014531 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "No entrypoint found named `foo`");
Chris Forbes82ff92a2016-09-09 10:50:24 +120014532
14533 ASSERT_NO_FATAL_FAILURE(InitState());
14534 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14535
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014536 char const *vsSource =
14537 "#version 450\n"
14538 "out gl_PerVertex {\n"
14539 " vec4 gl_Position;\n"
14540 "};\n"
14541 "void main(){\n"
14542 " gl_Position = vec4(0);\n"
14543 "}\n";
14544 char const *fsSource =
14545 "#version 450\n"
14546 "\n"
14547 "layout(location=0) out vec4 color;\n"
14548 "void main(){\n"
14549 " color = vec4(1);\n"
14550 "}\n";
Chris Forbes82ff92a2016-09-09 10:50:24 +120014551
14552 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14553 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this, "foo");
14554
14555 VkPipelineObj pipe(m_device);
14556 pipe.AddColorAttachment();
14557 pipe.AddShader(&vs);
14558 pipe.AddShader(&fs);
14559
14560 VkDescriptorSetObj descriptorSet(m_device);
14561 descriptorSet.AppendDummy();
14562 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14563
14564 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14565
14566 m_errorMonitor->VerifyFound();
14567}
14568
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014569TEST_F(VkLayerTest, CreatePipelineDepthStencilRequired) {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014570 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14571 "pDepthStencilState is NULL when rasterization is enabled and subpass "
14572 "uses a depth/stencil attachment");
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014573
14574 ASSERT_NO_FATAL_FAILURE(InitState());
14575 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14576
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014577 char const *vsSource =
14578 "#version 450\n"
14579 "void main(){ gl_Position = vec4(0); }\n";
14580 char const *fsSource =
14581 "#version 450\n"
14582 "\n"
14583 "layout(location=0) out vec4 color;\n"
14584 "void main(){\n"
14585 " color = vec4(1);\n"
14586 "}\n";
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014587
14588 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14589 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14590
14591 VkPipelineObj pipe(m_device);
14592 pipe.AddColorAttachment();
14593 pipe.AddShader(&vs);
14594 pipe.AddShader(&fs);
14595
14596 VkDescriptorSetObj descriptorSet(m_device);
14597 descriptorSet.AppendDummy();
14598 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14599
14600 VkAttachmentDescription attachments[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014601 {
14602 0, VK_FORMAT_B8G8R8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14603 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14604 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014605 },
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014606 {
14607 0, VK_FORMAT_D16_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE,
14608 VK_ATTACHMENT_LOAD_OP_DONT_CARE, VK_ATTACHMENT_STORE_OP_DONT_CARE, VK_IMAGE_LAYOUT_UNDEFINED,
14609 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014610 },
14611 };
14612 VkAttachmentReference refs[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014613 {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL}, {1, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL},
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014614 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070014615 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &refs[0], nullptr, &refs[1], 0, nullptr};
14616 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, attachments, 1, &subpass, 0, nullptr};
Chris Forbesae9d8cd2016-09-13 16:32:57 +120014617 VkRenderPass rp;
14618 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
14619 ASSERT_VK_SUCCESS(err);
14620
14621 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), rp);
14622
14623 m_errorMonitor->VerifyFound();
14624
14625 vkDestroyRenderPass(m_device->device(), rp, nullptr);
14626}
14627
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014628TEST_F(VkLayerTest, CreatePipelineTessPatchDecorationMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014629 TEST_DESCRIPTION(
14630 "Test that an error is produced for a variable output from "
14631 "the TCS without the patch decoration, but consumed in the TES "
14632 "with the decoration.");
14633 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14634 "is per-vertex in tessellation control shader stage "
14635 "but per-patch in tessellation evaluation shader stage");
Chris Forbesa0193bc2016-04-04 19:19:47 +120014636
14637 ASSERT_NO_FATAL_FAILURE(InitState());
14638 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14639
Chris Forbesc1e852d2016-04-04 19:26:42 +120014640 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070014641 printf(" Device does not support tessellation shaders; skipped.\n");
Chris Forbesc1e852d2016-04-04 19:26:42 +120014642 return;
14643 }
14644
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014645 char const *vsSource =
14646 "#version 450\n"
14647 "void main(){}\n";
14648 char const *tcsSource =
14649 "#version 450\n"
14650 "layout(location=0) out int x[];\n"
14651 "layout(vertices=3) out;\n"
14652 "void main(){\n"
14653 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
14654 " gl_TessLevelInner[0] = 1;\n"
14655 " x[gl_InvocationID] = gl_InvocationID;\n"
14656 "}\n";
14657 char const *tesSource =
14658 "#version 450\n"
14659 "layout(triangles, equal_spacing, cw) in;\n"
14660 "layout(location=0) patch in int x;\n"
14661 "out gl_PerVertex { vec4 gl_Position; };\n"
14662 "void main(){\n"
14663 " gl_Position.xyz = gl_TessCoord;\n"
14664 " gl_Position.w = x;\n"
14665 "}\n";
14666 char const *fsSource =
14667 "#version 450\n"
14668 "layout(location=0) out vec4 color;\n"
14669 "void main(){\n"
14670 " color = vec4(1);\n"
14671 "}\n";
Chris Forbesa0193bc2016-04-04 19:19:47 +120014672
14673 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14674 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
14675 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
14676 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14677
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014678 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
14679 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014680
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014681 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Chris Forbesa0193bc2016-04-04 19:19:47 +120014682
14683 VkPipelineObj pipe(m_device);
14684 pipe.SetInputAssembly(&iasci);
14685 pipe.SetTessellation(&tsci);
14686 pipe.AddColorAttachment();
14687 pipe.AddShader(&vs);
14688 pipe.AddShader(&tcs);
14689 pipe.AddShader(&tes);
14690 pipe.AddShader(&fs);
14691
14692 VkDescriptorSetObj descriptorSet(m_device);
14693 descriptorSet.AppendDummy();
14694 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14695
14696 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14697
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014698 m_errorMonitor->VerifyFound();
Chris Forbesa0193bc2016-04-04 19:19:47 +120014699}
14700
Karl Schultz6addd812016-02-02 17:17:23 -070014701TEST_F(VkLayerTest, CreatePipelineAttribBindingConflict) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014702 TEST_DESCRIPTION(
14703 "Test that an error is produced for a vertex attribute setup where multiple "
14704 "bindings provide the same location");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014705 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14706 "Duplicate vertex input binding descriptions for binding 0");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014707
Chris Forbes280ba2c2015-06-12 11:16:41 +120014708 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehlisc9ac2b62015-09-11 12:57:55 -060014709 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014710
14711 /* Two binding descriptions for binding 0 */
14712 VkVertexInputBindingDescription input_bindings[2];
14713 memset(input_bindings, 0, sizeof(input_bindings));
14714
14715 VkVertexInputAttributeDescription input_attrib;
14716 memset(&input_attrib, 0, sizeof(input_attrib));
14717 input_attrib.format = VK_FORMAT_R32_SFLOAT;
14718
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014719 char const *vsSource =
14720 "#version 450\n"
14721 "\n"
14722 "layout(location=0) in float x;\n" /* attrib provided float */
14723 "out gl_PerVertex {\n"
14724 " vec4 gl_Position;\n"
14725 "};\n"
14726 "void main(){\n"
14727 " gl_Position = vec4(x);\n"
14728 "}\n";
14729 char const *fsSource =
14730 "#version 450\n"
14731 "\n"
14732 "layout(location=0) out vec4 color;\n"
14733 "void main(){\n"
14734 " color = vec4(1);\n"
14735 "}\n";
Chris Forbes280ba2c2015-06-12 11:16:41 +120014736
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014737 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14738 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014739
14740 VkPipelineObj pipe(m_device);
Chia-I Wu08accc62015-07-07 11:50:03 +080014741 pipe.AddColorAttachment();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014742 pipe.AddShader(&vs);
14743 pipe.AddShader(&fs);
14744
14745 pipe.AddVertexInputBindings(input_bindings, 2);
14746 pipe.AddVertexInputAttribs(&input_attrib, 1);
14747
Chris Forbes280ba2c2015-06-12 11:16:41 +120014748 VkDescriptorSetObj descriptorSet(m_device);
14749 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014750 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes280ba2c2015-06-12 11:16:41 +120014751
Tony Barbour5781e8f2015-08-04 16:23:11 -060014752 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes280ba2c2015-06-12 11:16:41 +120014753
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014754 m_errorMonitor->VerifyFound();
Chris Forbes280ba2c2015-06-12 11:16:41 +120014755}
Chris Forbes8f68b562015-05-25 11:13:32 +120014756
Karl Schultz6addd812016-02-02 17:17:23 -070014757TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotWritten) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014758 TEST_DESCRIPTION(
14759 "Test that an error is produced for a fragment shader which does not "
14760 "provide an output for one of the pipeline's color attachments");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014761 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Attachment 0 not written by fragment shader");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014762
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014763 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014764
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014765 char const *vsSource =
14766 "#version 450\n"
14767 "\n"
14768 "out gl_PerVertex {\n"
14769 " vec4 gl_Position;\n"
14770 "};\n"
14771 "void main(){\n"
14772 " gl_Position = vec4(1);\n"
14773 "}\n";
14774 char const *fsSource =
14775 "#version 450\n"
14776 "\n"
14777 "void main(){\n"
14778 "}\n";
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014779
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014780 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14781 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014782
14783 VkPipelineObj pipe(m_device);
14784 pipe.AddShader(&vs);
14785 pipe.AddShader(&fs);
14786
Chia-I Wu08accc62015-07-07 11:50:03 +080014787 /* set up CB 0, not written */
14788 pipe.AddColorAttachment();
14789 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014790
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014791 VkDescriptorSetObj descriptorSet(m_device);
14792 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014793 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014794
Tony Barbour5781e8f2015-08-04 16:23:11 -060014795 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014796
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014797 m_errorMonitor->VerifyFound();
Chris Forbes4d6d1e52015-05-25 11:13:40 +120014798}
14799
Karl Schultz6addd812016-02-02 17:17:23 -070014800TEST_F(VkLayerTest, CreatePipelineFragmentOutputNotConsumed) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014801 TEST_DESCRIPTION(
14802 "Test that a warning is produced for a fragment shader which provides a spurious "
14803 "output with no matching attachment");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014804 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mike Weiblencce7ec72016-10-17 19:33:05 -060014805 "fragment shader writes to output location 1 with no matching attachment");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014806
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014807 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014808
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014809 char const *vsSource =
14810 "#version 450\n"
14811 "\n"
14812 "out gl_PerVertex {\n"
14813 " vec4 gl_Position;\n"
14814 "};\n"
14815 "void main(){\n"
14816 " gl_Position = vec4(1);\n"
14817 "}\n";
14818 char const *fsSource =
14819 "#version 450\n"
14820 "\n"
14821 "layout(location=0) out vec4 x;\n"
14822 "layout(location=1) out vec4 y;\n" /* no matching attachment for this */
14823 "void main(){\n"
14824 " x = vec4(1);\n"
14825 " y = vec4(1);\n"
14826 "}\n";
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014827
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014828 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14829 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014830
14831 VkPipelineObj pipe(m_device);
14832 pipe.AddShader(&vs);
14833 pipe.AddShader(&fs);
14834
Chia-I Wu08accc62015-07-07 11:50:03 +080014835 /* set up CB 0, not written */
14836 pipe.AddColorAttachment();
14837 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014838 /* FS writes CB 1, but we don't configure it */
14839
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014840 VkDescriptorSetObj descriptorSet(m_device);
14841 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014842 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014843
Tony Barbour5781e8f2015-08-04 16:23:11 -060014844 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014845
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014846 m_errorMonitor->VerifyFound();
Chris Forbesf3fffaa2015-05-25 11:13:43 +120014847}
14848
Karl Schultz6addd812016-02-02 17:17:23 -070014849TEST_F(VkLayerTest, CreatePipelineFragmentOutputTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014850 TEST_DESCRIPTION(
14851 "Test that an error is produced for a mismatch between the fundamental "
14852 "type of an fragment shader output variable, and the format of the corresponding attachment");
Mike Weiblencce7ec72016-10-17 19:33:05 -060014853 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "does not match fragment shader output type");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014854
Chris Forbesa36d69e2015-05-25 11:13:44 +120014855 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014856
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014857 char const *vsSource =
14858 "#version 450\n"
14859 "\n"
14860 "out gl_PerVertex {\n"
14861 " vec4 gl_Position;\n"
14862 "};\n"
14863 "void main(){\n"
14864 " gl_Position = vec4(1);\n"
14865 "}\n";
14866 char const *fsSource =
14867 "#version 450\n"
14868 "\n"
14869 "layout(location=0) out ivec4 x;\n" /* not UNORM */
14870 "void main(){\n"
14871 " x = ivec4(1);\n"
14872 "}\n";
Chris Forbesa36d69e2015-05-25 11:13:44 +120014873
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014874 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14875 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014876
14877 VkPipelineObj pipe(m_device);
14878 pipe.AddShader(&vs);
14879 pipe.AddShader(&fs);
14880
Chia-I Wu08accc62015-07-07 11:50:03 +080014881 /* set up CB 0; type is UNORM by default */
14882 pipe.AddColorAttachment();
14883 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014884
Chris Forbesa36d69e2015-05-25 11:13:44 +120014885 VkDescriptorSetObj descriptorSet(m_device);
14886 descriptorSet.AppendDummy();
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014887 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbesa36d69e2015-05-25 11:13:44 +120014888
Tony Barbour5781e8f2015-08-04 16:23:11 -060014889 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
Chris Forbesa36d69e2015-05-25 11:13:44 +120014890
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014891 m_errorMonitor->VerifyFound();
Chris Forbesa36d69e2015-05-25 11:13:44 +120014892}
Chris Forbes7b1b8932015-06-05 14:43:36 +120014893
Karl Schultz6addd812016-02-02 17:17:23 -070014894TEST_F(VkLayerTest, CreatePipelineUniformBlockNotProvided) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014895 TEST_DESCRIPTION(
14896 "Test that an error is produced for a shader consuming a uniform "
14897 "block which has no corresponding binding in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014898 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in pipeline layout");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060014899
Chris Forbes556c76c2015-08-14 12:04:59 +120014900 ASSERT_NO_FATAL_FAILURE(InitState());
Chris Forbes556c76c2015-08-14 12:04:59 +120014901
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014902 char const *vsSource =
14903 "#version 450\n"
14904 "\n"
14905 "out gl_PerVertex {\n"
14906 " vec4 gl_Position;\n"
14907 "};\n"
14908 "void main(){\n"
14909 " gl_Position = vec4(1);\n"
14910 "}\n";
14911 char const *fsSource =
14912 "#version 450\n"
14913 "\n"
14914 "layout(location=0) out vec4 x;\n"
14915 "layout(set=0) layout(binding=0) uniform foo { int x; int y; } bar;\n"
14916 "void main(){\n"
14917 " x = vec4(bar.y);\n"
14918 "}\n";
Chris Forbes556c76c2015-08-14 12:04:59 +120014919
Courtney Goeltzenleuchterd2635502015-10-21 17:08:06 -060014920 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14921 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
Chris Forbes556c76c2015-08-14 12:04:59 +120014922
Chris Forbes556c76c2015-08-14 12:04:59 +120014923 VkPipelineObj pipe(m_device);
14924 pipe.AddShader(&vs);
14925 pipe.AddShader(&fs);
14926
14927 /* set up CB 0; type is UNORM by default */
14928 pipe.AddColorAttachment();
14929 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14930
14931 VkDescriptorSetObj descriptorSet(m_device);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080014932 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
Chris Forbes556c76c2015-08-14 12:04:59 +120014933
14934 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14935
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014936 m_errorMonitor->VerifyFound();
Chris Forbes556c76c2015-08-14 12:04:59 +120014937}
14938
Chris Forbes5c59e902016-02-26 16:56:09 +130014939TEST_F(VkLayerTest, CreatePipelinePushConstantsNotInLayout) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014940 TEST_DESCRIPTION(
14941 "Test that an error is produced for a shader consuming push constants "
14942 "which are not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060014943 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "not declared in layout");
Chris Forbes5c59e902016-02-26 16:56:09 +130014944
14945 ASSERT_NO_FATAL_FAILURE(InitState());
14946
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014947 char const *vsSource =
14948 "#version 450\n"
14949 "\n"
14950 "layout(push_constant, std430) uniform foo { float x; } consts;\n"
14951 "out gl_PerVertex {\n"
14952 " vec4 gl_Position;\n"
14953 "};\n"
14954 "void main(){\n"
14955 " gl_Position = vec4(consts.x);\n"
14956 "}\n";
14957 char const *fsSource =
14958 "#version 450\n"
14959 "\n"
14960 "layout(location=0) out vec4 x;\n"
14961 "void main(){\n"
14962 " x = vec4(1);\n"
14963 "}\n";
Chris Forbes5c59e902016-02-26 16:56:09 +130014964
14965 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
14966 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
14967
14968 VkPipelineObj pipe(m_device);
14969 pipe.AddShader(&vs);
14970 pipe.AddShader(&fs);
14971
14972 /* set up CB 0; type is UNORM by default */
14973 pipe.AddColorAttachment();
14974 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
14975
14976 VkDescriptorSetObj descriptorSet(m_device);
14977 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
14978
14979 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
14980
14981 /* should have generated an error -- no push constant ranges provided! */
Chris Forbes8f36a8a2016-04-07 13:21:07 +120014982 m_errorMonitor->VerifyFound();
Chris Forbes5c59e902016-02-26 16:56:09 +130014983}
14984
Chris Forbes3fb17902016-08-22 14:57:55 +120014985TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissing) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014986 TEST_DESCRIPTION(
14987 "Test that an error is produced for a shader consuming an input attachment "
14988 "which is not included in the subpass description");
Chris Forbes3fb17902016-08-22 14:57:55 +120014989 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
14990 "consumes input attachment index 0 but not provided in subpass");
14991
14992 ASSERT_NO_FATAL_FAILURE(InitState());
14993
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070014994 char const *vsSource =
14995 "#version 450\n"
14996 "\n"
14997 "out gl_PerVertex {\n"
14998 " vec4 gl_Position;\n"
14999 "};\n"
15000 "void main(){\n"
15001 " gl_Position = vec4(1);\n"
15002 "}\n";
15003 char const *fsSource =
15004 "#version 450\n"
15005 "\n"
15006 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15007 "layout(location=0) out vec4 color;\n"
15008 "void main() {\n"
15009 " color = subpassLoad(x);\n"
15010 "}\n";
Chris Forbes3fb17902016-08-22 14:57:55 +120015011
15012 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15013 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15014
15015 VkPipelineObj pipe(m_device);
15016 pipe.AddShader(&vs);
15017 pipe.AddShader(&fs);
15018 pipe.AddColorAttachment();
15019 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15020
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015021 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15022 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes3fb17902016-08-22 14:57:55 +120015023 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015024 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015025 ASSERT_VK_SUCCESS(err);
15026
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015027 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes3fb17902016-08-22 14:57:55 +120015028 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015029 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes3fb17902016-08-22 14:57:55 +120015030 ASSERT_VK_SUCCESS(err);
15031
15032 // error here.
15033 pipe.CreateVKPipeline(pl, renderPass());
15034
15035 m_errorMonitor->VerifyFound();
15036
15037 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15038 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15039}
15040
Chris Forbes5a9a0472016-08-22 16:02:09 +120015041TEST_F(VkLayerTest, CreatePipelineInputAttachmentTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015042 TEST_DESCRIPTION(
15043 "Test that an error is produced for a shader consuming an input attachment "
15044 "with a format having a different fundamental type");
Chris Forbes5a9a0472016-08-22 16:02:09 +120015045 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15046 "input attachment 0 format of VK_FORMAT_R8G8B8A8_UINT does not match");
15047
15048 ASSERT_NO_FATAL_FAILURE(InitState());
15049
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015050 char const *vsSource =
15051 "#version 450\n"
15052 "\n"
15053 "out gl_PerVertex {\n"
15054 " vec4 gl_Position;\n"
15055 "};\n"
15056 "void main(){\n"
15057 " gl_Position = vec4(1);\n"
15058 "}\n";
15059 char const *fsSource =
15060 "#version 450\n"
15061 "\n"
15062 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
15063 "layout(location=0) out vec4 color;\n"
15064 "void main() {\n"
15065 " color = subpassLoad(x);\n"
15066 "}\n";
Chris Forbes5a9a0472016-08-22 16:02:09 +120015067
15068 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15069 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15070
15071 VkPipelineObj pipe(m_device);
15072 pipe.AddShader(&vs);
15073 pipe.AddShader(&fs);
15074 pipe.AddColorAttachment();
15075 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15076
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015077 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15078 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015079 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015080 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015081 ASSERT_VK_SUCCESS(err);
15082
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015083 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015084 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015085 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes5a9a0472016-08-22 16:02:09 +120015086 ASSERT_VK_SUCCESS(err);
15087
15088 VkAttachmentDescription descs[2] = {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015089 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15090 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15091 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
15092 {0, VK_FORMAT_R8G8B8A8_UINT, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
15093 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 +120015094 };
15095 VkAttachmentReference color = {
15096 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
15097 };
15098 VkAttachmentReference input = {
15099 1, VK_IMAGE_LAYOUT_GENERAL,
15100 };
15101
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015102 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015103
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015104 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Chris Forbes5a9a0472016-08-22 16:02:09 +120015105 VkRenderPass rp;
15106 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
15107 ASSERT_VK_SUCCESS(err);
15108
15109 // error here.
15110 pipe.CreateVKPipeline(pl, rp);
15111
15112 m_errorMonitor->VerifyFound();
15113
15114 vkDestroyRenderPass(m_device->device(), rp, nullptr);
15115 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15116 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15117}
15118
Chris Forbes541f7b02016-08-22 15:30:27 +120015119TEST_F(VkLayerTest, CreatePipelineInputAttachmentMissingArray) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015120 TEST_DESCRIPTION(
15121 "Test that an error is produced for a shader consuming an input attachment "
15122 "which is not included in the subpass description -- array case");
Chris Forbes541f7b02016-08-22 15:30:27 +120015123 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Rene Lindsay07b60af2017-01-10 15:57:55 -070015124 "consumes input attachment index 0 but not provided in subpass");
Chris Forbes541f7b02016-08-22 15:30:27 +120015125
15126 ASSERT_NO_FATAL_FAILURE(InitState());
15127
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015128 char const *vsSource =
15129 "#version 450\n"
15130 "\n"
15131 "out gl_PerVertex {\n"
15132 " vec4 gl_Position;\n"
15133 "};\n"
15134 "void main(){\n"
15135 " gl_Position = vec4(1);\n"
15136 "}\n";
15137 char const *fsSource =
15138 "#version 450\n"
15139 "\n"
15140 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput xs[1];\n"
15141 "layout(location=0) out vec4 color;\n"
15142 "void main() {\n"
15143 " color = subpassLoad(xs[0]);\n"
15144 "}\n";
Chris Forbes541f7b02016-08-22 15:30:27 +120015145
15146 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15147 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15148
15149 VkPipelineObj pipe(m_device);
15150 pipe.AddShader(&vs);
15151 pipe.AddShader(&fs);
15152 pipe.AddColorAttachment();
15153 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15154
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015155 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 2, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
15156 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Chris Forbes541f7b02016-08-22 15:30:27 +120015157 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015158 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015159 ASSERT_VK_SUCCESS(err);
15160
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015161 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes541f7b02016-08-22 15:30:27 +120015162 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015163 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes541f7b02016-08-22 15:30:27 +120015164 ASSERT_VK_SUCCESS(err);
15165
15166 // error here.
15167 pipe.CreateVKPipeline(pl, renderPass());
15168
15169 m_errorMonitor->VerifyFound();
15170
15171 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15172 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15173}
15174
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015175TEST_F(VkLayerTest, CreateComputePipelineMissingDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015176 TEST_DESCRIPTION(
15177 "Test that an error is produced for a compute pipeline consuming a "
15178 "descriptor which is not provided in the pipeline layout");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015179 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "Shader uses descriptor slot 0.0");
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015180
15181 ASSERT_NO_FATAL_FAILURE(InitState());
15182
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015183 char const *csSource =
15184 "#version 450\n"
15185 "\n"
15186 "layout(local_size_x=1) in;\n"
15187 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15188 "void main(){\n"
15189 " x = vec4(1);\n"
15190 "}\n";
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015191
15192 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15193
15194 VkDescriptorSetObj descriptorSet(m_device);
15195 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15196
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015197 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15198 nullptr,
15199 0,
15200 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15201 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15202 descriptorSet.GetPipelineLayout(),
15203 VK_NULL_HANDLE,
15204 -1};
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015205
15206 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015207 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes10eb9ae2016-05-31 16:09:42 +120015208
15209 m_errorMonitor->VerifyFound();
15210
15211 if (err == VK_SUCCESS) {
15212 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15213 }
15214}
15215
Chris Forbes22a9b092016-07-19 14:34:05 +120015216TEST_F(VkLayerTest, CreateComputePipelineDescriptorTypeMismatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015217 TEST_DESCRIPTION(
15218 "Test that an error is produced for a pipeline consuming a "
15219 "descriptor-backed resource of a mismatched type");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015220 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15221 "but descriptor of type VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER");
Chris Forbes22a9b092016-07-19 14:34:05 +120015222
15223 ASSERT_NO_FATAL_FAILURE(InitState());
15224
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015225 VkDescriptorSetLayoutBinding binding = {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr};
15226 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &binding};
Chris Forbes22a9b092016-07-19 14:34:05 +120015227 VkDescriptorSetLayout dsl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015228 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015229 ASSERT_VK_SUCCESS(err);
15230
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015231 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Chris Forbes22a9b092016-07-19 14:34:05 +120015232 VkPipelineLayout pl;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015233 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
Chris Forbes22a9b092016-07-19 14:34:05 +120015234 ASSERT_VK_SUCCESS(err);
15235
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015236 char const *csSource =
15237 "#version 450\n"
15238 "\n"
15239 "layout(local_size_x=1) in;\n"
15240 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
15241 "void main() {\n"
15242 " x.x = 1.0f;\n"
15243 "}\n";
Chris Forbes22a9b092016-07-19 14:34:05 +120015244 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
15245
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015246 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
15247 nullptr,
15248 0,
15249 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
15250 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
15251 pl,
15252 VK_NULL_HANDLE,
15253 -1};
Chris Forbes22a9b092016-07-19 14:34:05 +120015254
15255 VkPipeline pipe;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015256 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
Chris Forbes22a9b092016-07-19 14:34:05 +120015257
15258 m_errorMonitor->VerifyFound();
15259
15260 if (err == VK_SUCCESS) {
15261 vkDestroyPipeline(m_device->device(), pipe, nullptr);
15262 }
15263
15264 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
15265 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
15266}
15267
Chris Forbes50020592016-07-27 13:52:41 +120015268TEST_F(VkLayerTest, DrawTimeImageViewTypeMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015269 TEST_DESCRIPTION(
15270 "Test that an error is produced when an image view type "
15271 "does not match the dimensionality declared in the shader");
Chris Forbes50020592016-07-27 13:52:41 +120015272
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015273 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 +120015274
15275 ASSERT_NO_FATAL_FAILURE(InitState());
15276 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15277
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015278 char const *vsSource =
15279 "#version 450\n"
15280 "\n"
15281 "out gl_PerVertex { vec4 gl_Position; };\n"
15282 "void main() { gl_Position = vec4(0); }\n";
15283 char const *fsSource =
15284 "#version 450\n"
15285 "\n"
15286 "layout(set=0, binding=0) uniform sampler3D s;\n"
15287 "layout(location=0) out vec4 color;\n"
15288 "void main() {\n"
15289 " color = texture(s, vec3(0));\n"
15290 "}\n";
Chris Forbes50020592016-07-27 13:52:41 +120015291 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15292 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15293
15294 VkPipelineObj pipe(m_device);
15295 pipe.AddShader(&vs);
15296 pipe.AddShader(&fs);
15297 pipe.AddColorAttachment();
15298
15299 VkTextureObj texture(m_device, nullptr);
15300 VkSamplerObj sampler(m_device);
15301
15302 VkDescriptorSetObj descriptorSet(m_device);
15303 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15304 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15305
15306 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15307 ASSERT_VK_SUCCESS(err);
15308
Tony Barbour552f6c02016-12-21 14:34:07 -070015309 m_commandBuffer->BeginCommandBuffer();
15310 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes50020592016-07-27 13:52:41 +120015311
15312 m_commandBuffer->BindPipeline(pipe);
15313 m_commandBuffer->BindDescriptorSet(descriptorSet);
15314
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015315 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes50020592016-07-27 13:52:41 +120015316 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015317 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes50020592016-07-27 13:52:41 +120015318 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15319
15320 // error produced here.
15321 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15322
15323 m_errorMonitor->VerifyFound();
15324
Tony Barbour552f6c02016-12-21 14:34:07 -070015325 m_commandBuffer->EndRenderPass();
15326 m_commandBuffer->EndCommandBuffer();
Chris Forbes50020592016-07-27 13:52:41 +120015327}
15328
Chris Forbes5533bfc2016-07-27 14:12:34 +120015329TEST_F(VkLayerTest, DrawTimeImageMultisampleMismatchWithPipeline) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015330 TEST_DESCRIPTION(
15331 "Test that an error is produced when a multisampled images "
15332 "are consumed via singlesample images types in the shader, or vice versa.");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015333
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015334 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "requires bound image to have multiple samples");
Chris Forbes5533bfc2016-07-27 14:12:34 +120015335
15336 ASSERT_NO_FATAL_FAILURE(InitState());
15337 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15338
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015339 char const *vsSource =
15340 "#version 450\n"
15341 "\n"
15342 "out gl_PerVertex { vec4 gl_Position; };\n"
15343 "void main() { gl_Position = vec4(0); }\n";
15344 char const *fsSource =
15345 "#version 450\n"
15346 "\n"
15347 "layout(set=0, binding=0) uniform sampler2DMS s;\n"
15348 "layout(location=0) out vec4 color;\n"
15349 "void main() {\n"
15350 " color = texelFetch(s, ivec2(0), 0);\n"
15351 "}\n";
Chris Forbes5533bfc2016-07-27 14:12:34 +120015352 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
15353 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
15354
15355 VkPipelineObj pipe(m_device);
15356 pipe.AddShader(&vs);
15357 pipe.AddShader(&fs);
15358 pipe.AddColorAttachment();
15359
15360 VkTextureObj texture(m_device, nullptr);
15361 VkSamplerObj sampler(m_device);
15362
15363 VkDescriptorSetObj descriptorSet(m_device);
15364 descriptorSet.AppendSamplerTexture(&sampler, &texture);
15365 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
15366
15367 VkResult err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
15368 ASSERT_VK_SUCCESS(err);
15369
Tony Barbour552f6c02016-12-21 14:34:07 -070015370 m_commandBuffer->BeginCommandBuffer();
15371 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Chris Forbes5533bfc2016-07-27 14:12:34 +120015372
15373 m_commandBuffer->BindPipeline(pipe);
15374 m_commandBuffer->BindDescriptorSet(descriptorSet);
15375
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015376 VkViewport viewport = {0, 0, 16, 16, 0, 1};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015377 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015378 VkRect2D scissor = {{0, 0}, {16, 16}};
Chris Forbes5533bfc2016-07-27 14:12:34 +120015379 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
15380
15381 // error produced here.
15382 vkCmdDraw(m_commandBuffer->handle(), 3, 1, 0, 0);
15383
15384 m_errorMonitor->VerifyFound();
15385
Tony Barbour552f6c02016-12-21 14:34:07 -070015386 m_commandBuffer->EndRenderPass();
15387 m_commandBuffer->EndCommandBuffer();
Chris Forbes5533bfc2016-07-27 14:12:34 +120015388}
15389
Mark Youngc48c4c12016-04-11 14:26:49 -060015390TEST_F(VkLayerTest, CreateImageLimitsViolationMaxWidth) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015391 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015392
15393 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015394
15395 // Create an image
15396 VkImage image;
15397
Karl Schultz6addd812016-02-02 17:17:23 -070015398 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15399 const int32_t tex_width = 32;
15400 const int32_t tex_height = 32;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015401
15402 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015403 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15404 image_create_info.pNext = NULL;
15405 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15406 image_create_info.format = tex_format;
15407 image_create_info.extent.width = tex_width;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015408 image_create_info.extent.height = tex_height;
Karl Schultz6addd812016-02-02 17:17:23 -070015409 image_create_info.extent.depth = 1;
15410 image_create_info.mipLevels = 1;
15411 image_create_info.arrayLayers = 1;
15412 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15413 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15414 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15415 image_create_info.flags = 0;
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015416
15417 // Introduce error by sending down a bogus width extent
15418 image_create_info.extent.width = 65536;
Chia-I Wuf7458c52015-10-26 21:10:41 +080015419 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015420
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015421 m_errorMonitor->VerifyFound();
Mark Lobodzinski6f2274e2015-09-22 09:33:21 -060015422}
15423
Mark Youngc48c4c12016-04-11 14:26:49 -060015424TEST_F(VkLayerTest, CreateImageLimitsViolationMinWidth) {
Mark Lobodzinski688ed322017-01-27 11:13:21 -070015425 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00716);
Mark Youngc48c4c12016-04-11 14:26:49 -060015426
15427 ASSERT_NO_FATAL_FAILURE(InitState());
15428
15429 // Create an image
15430 VkImage image;
15431
15432 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15433 const int32_t tex_width = 32;
15434 const int32_t tex_height = 32;
15435
15436 VkImageCreateInfo image_create_info = {};
15437 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15438 image_create_info.pNext = NULL;
15439 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15440 image_create_info.format = tex_format;
15441 image_create_info.extent.width = tex_width;
15442 image_create_info.extent.height = tex_height;
15443 image_create_info.extent.depth = 1;
15444 image_create_info.mipLevels = 1;
15445 image_create_info.arrayLayers = 1;
15446 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15447 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15448 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15449 image_create_info.flags = 0;
15450
15451 // Introduce error by sending down a bogus width extent
15452 image_create_info.extent.width = 0;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070015453 m_errorMonitor->SetUnexpectedError("parameter pCreateInfo->extent.width must be greater than 0");
Mark Youngc48c4c12016-04-11 14:26:49 -060015454 vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15455
15456 m_errorMonitor->VerifyFound();
15457}
Mark Lobodzinski66e5eab2016-11-15 13:30:38 -070015458
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015459TEST_F(VkLayerTest, AttachmentDescriptionUndefinedFormat) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015460 TEST_DESCRIPTION(
15461 "Create a render pass with an attachment description "
15462 "format set to VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015463
15464 ASSERT_NO_FATAL_FAILURE(InitState());
15465 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15466
Jeremy Hayes632e0ab2017-02-09 13:32:28 -070015467 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "format is VK_FORMAT_UNDEFINED");
Mark Lobodzinskidf4c57d2016-08-05 11:47:16 -060015468
15469 VkAttachmentReference color_attach = {};
15470 color_attach.layout = VK_IMAGE_LAYOUT_GENERAL;
15471 color_attach.attachment = 0;
15472 VkSubpassDescription subpass = {};
15473 subpass.colorAttachmentCount = 1;
15474 subpass.pColorAttachments = &color_attach;
15475
15476 VkRenderPassCreateInfo rpci = {};
15477 rpci.subpassCount = 1;
15478 rpci.pSubpasses = &subpass;
15479 rpci.attachmentCount = 1;
15480 VkAttachmentDescription attach_desc = {};
15481 attach_desc.format = VK_FORMAT_UNDEFINED;
15482 rpci.pAttachments = &attach_desc;
15483 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
15484 VkRenderPass rp;
15485 VkResult result = vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
15486
15487 m_errorMonitor->VerifyFound();
15488
15489 if (result == VK_SUCCESS) {
15490 vkDestroyRenderPass(m_device->device(), rp, NULL);
15491 }
15492}
15493
Karl Schultz6addd812016-02-02 17:17:23 -070015494TEST_F(VkLayerTest, InvalidImageView) {
15495 VkResult err;
Tobin Ehliscde08892015-09-22 10:11:37 -060015496
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015497 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015498
Tobin Ehliscde08892015-09-22 10:11:37 -060015499 ASSERT_NO_FATAL_FAILURE(InitState());
Tobin Ehliscde08892015-09-22 10:11:37 -060015500
Mike Stroyana3082432015-09-25 13:39:21 -060015501 // Create an image and try to create a view with bad baseMipLevel
Karl Schultz6addd812016-02-02 17:17:23 -070015502 VkImage image;
Tobin Ehliscde08892015-09-22 10:11:37 -060015503
Karl Schultz6addd812016-02-02 17:17:23 -070015504 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15505 const int32_t tex_width = 32;
15506 const int32_t tex_height = 32;
Tobin Ehliscde08892015-09-22 10:11:37 -060015507
15508 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015509 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15510 image_create_info.pNext = NULL;
15511 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15512 image_create_info.format = tex_format;
15513 image_create_info.extent.width = tex_width;
15514 image_create_info.extent.height = tex_height;
15515 image_create_info.extent.depth = 1;
15516 image_create_info.mipLevels = 1;
15517 image_create_info.arrayLayers = 1;
15518 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15519 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15520 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15521 image_create_info.flags = 0;
Tobin Ehliscde08892015-09-22 10:11:37 -060015522
Chia-I Wuf7458c52015-10-26 21:10:41 +080015523 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
Tobin Ehliscde08892015-09-22 10:11:37 -060015524 ASSERT_VK_SUCCESS(err);
15525
15526 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015527 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070015528 image_view_create_info.image = image;
15529 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15530 image_view_create_info.format = tex_format;
15531 image_view_create_info.subresourceRange.layerCount = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015532 image_view_create_info.subresourceRange.baseMipLevel = 10; // cause an error
Karl Schultz6addd812016-02-02 17:17:23 -070015533 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015534 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Tobin Ehliscde08892015-09-22 10:11:37 -060015535
15536 VkImageView view;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070015537 m_errorMonitor->SetUnexpectedError(
15538 "If image is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015539 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Tobin Ehliscde08892015-09-22 10:11:37 -060015540
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015541 m_errorMonitor->VerifyFound();
Tony Barbourdf4c0042016-06-01 15:55:43 -060015542 vkDestroyImage(m_device->device(), image, NULL);
Tobin Ehliscde08892015-09-22 10:11:37 -060015543}
Mike Stroyana3082432015-09-25 13:39:21 -060015544
Mark Youngd339ba32016-05-30 13:28:35 -060015545TEST_F(VkLayerTest, CreateImageViewNoMemoryBoundToImage) {
15546 VkResult err;
Tobin Ehlisfed999f2016-09-21 15:09:45 -060015547 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
Tobin Ehlis4ff58172016-09-22 10:52:00 -060015548 " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Mark Youngd339ba32016-05-30 13:28:35 -060015549
15550 ASSERT_NO_FATAL_FAILURE(InitState());
15551
15552 // Create an image and try to create a view with no memory backing the image
15553 VkImage image;
15554
15555 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
15556 const int32_t tex_width = 32;
15557 const int32_t tex_height = 32;
15558
15559 VkImageCreateInfo image_create_info = {};
15560 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15561 image_create_info.pNext = NULL;
15562 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15563 image_create_info.format = tex_format;
15564 image_create_info.extent.width = tex_width;
15565 image_create_info.extent.height = tex_height;
15566 image_create_info.extent.depth = 1;
15567 image_create_info.mipLevels = 1;
15568 image_create_info.arrayLayers = 1;
15569 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15570 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
15571 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
15572 image_create_info.flags = 0;
15573
15574 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
15575 ASSERT_VK_SUCCESS(err);
15576
15577 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130015578 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Mark Youngd339ba32016-05-30 13:28:35 -060015579 image_view_create_info.image = image;
15580 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15581 image_view_create_info.format = tex_format;
15582 image_view_create_info.subresourceRange.layerCount = 1;
15583 image_view_create_info.subresourceRange.baseMipLevel = 0;
15584 image_view_create_info.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015585 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mark Youngd339ba32016-05-30 13:28:35 -060015586
15587 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015588 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Youngd339ba32016-05-30 13:28:35 -060015589
15590 m_errorMonitor->VerifyFound();
15591 vkDestroyImage(m_device->device(), image, NULL);
15592 // If last error is success, it still created the view, so delete it.
15593 if (err == VK_SUCCESS) {
15594 vkDestroyImageView(m_device->device(), view, NULL);
15595 }
Mark Youngd339ba32016-05-30 13:28:35 -060015596}
15597
Karl Schultz6addd812016-02-02 17:17:23 -070015598TEST_F(VkLayerTest, InvalidImageViewAspect) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015599 TEST_DESCRIPTION("Create an image and try to create a view with an invalid aspectMask");
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015600 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015601
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015602 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015603
Karl Schultz6addd812016-02-02 17:17:23 -070015604 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015605 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015606 image.init(32, 32, tex_format, VK_IMAGE_USAGE_SAMPLED_BIT, VK_IMAGE_TILING_LINEAR, 0);
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015607 ASSERT_TRUE(image.initialized());
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015608
15609 VkImageViewCreateInfo image_view_create_info = {};
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015610 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015611 image_view_create_info.image = image.handle();
Karl Schultz6addd812016-02-02 17:17:23 -070015612 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
15613 image_view_create_info.format = tex_format;
15614 image_view_create_info.subresourceRange.baseMipLevel = 0;
15615 image_view_create_info.subresourceRange.levelCount = 1;
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015616 image_view_create_info.subresourceRange.layerCount = 1;
Karl Schultz6addd812016-02-02 17:17:23 -070015617 // Cause an error by setting an invalid image aspect
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015618 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_METADATA_BIT;
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015619
15620 VkImageView view;
Tobin Ehlis1f567a22016-05-25 16:15:18 -060015621 vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015622
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015623 m_errorMonitor->VerifyFound();
Mark Lobodzinskidc86b852015-10-23 14:20:31 -060015624}
15625
Mike Weiblena1e13f42017-02-09 21:25:59 -070015626TEST_F(VkLayerTest, ExerciseGetImageSubresourceLayout) {
15627 TEST_DESCRIPTION("Test vkGetImageSubresourceLayout() valid usages");
15628
15629 ASSERT_NO_FATAL_FAILURE(InitState());
15630 VkSubresourceLayout subres_layout = {};
15631
15632 // VU 00732: image must have been created with tiling equal to VK_IMAGE_TILING_LINEAR
15633 {
15634 const VkImageTiling tiling = VK_IMAGE_TILING_OPTIMAL; // ERROR: violates VU 00732
15635 VkImageObj img(m_device);
15636 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, tiling);
15637 ASSERT_TRUE(img.initialized());
15638
15639 VkImageSubresource subres = {};
15640 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15641 subres.mipLevel = 0;
15642 subres.arrayLayer = 0;
15643
15644 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00732);
15645 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15646 m_errorMonitor->VerifyFound();
15647 }
15648
15649 // VU 00733: The aspectMask member of pSubresource must only have a single bit set
15650 {
15651 VkImageObj img(m_device);
15652 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15653 ASSERT_TRUE(img.initialized());
15654
15655 VkImageSubresource subres = {};
15656 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_METADATA_BIT; // ERROR: triggers VU 00733
15657 subres.mipLevel = 0;
15658 subres.arrayLayer = 0;
15659
15660 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00733);
15661 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00741);
15662 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15663 m_errorMonitor->VerifyFound();
15664 }
15665
15666 // 00739 mipLevel must be less than the mipLevels specified in VkImageCreateInfo when the image was created
15667 {
15668 VkImageObj img(m_device);
15669 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15670 ASSERT_TRUE(img.initialized());
15671
15672 VkImageSubresource subres = {};
15673 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15674 subres.mipLevel = 1; // ERROR: triggers VU 00739
15675 subres.arrayLayer = 0;
15676
15677 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00739);
15678 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15679 m_errorMonitor->VerifyFound();
15680 }
15681
15682 // 00740 arrayLayer must be less than the arrayLayers specified in VkImageCreateInfo when the image was created
15683 {
15684 VkImageObj img(m_device);
15685 img.init_no_layout(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
15686 ASSERT_TRUE(img.initialized());
15687
15688 VkImageSubresource subres = {};
15689 subres.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15690 subres.mipLevel = 0;
15691 subres.arrayLayer = 1; // ERROR: triggers VU 00740
15692
15693 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00740);
15694 vkGetImageSubresourceLayout(m_device->device(), img.image(), &subres, &subres_layout);
15695 m_errorMonitor->VerifyFound();
15696 }
15697}
15698
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015699TEST_F(VkLayerTest, CopyImageLayerCountMismatch) {
Karl Schultz6addd812016-02-02 17:17:23 -070015700 VkResult err;
15701 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060015702
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015703 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01198);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060015704
Mike Stroyana3082432015-09-25 13:39:21 -060015705 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060015706
15707 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070015708 VkImage srcImage;
15709 VkImage dstImage;
15710 VkDeviceMemory srcMem;
15711 VkDeviceMemory destMem;
15712 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060015713
15714 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015715 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15716 image_create_info.pNext = NULL;
15717 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15718 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
15719 image_create_info.extent.width = 32;
15720 image_create_info.extent.height = 32;
15721 image_create_info.extent.depth = 1;
15722 image_create_info.mipLevels = 1;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015723 image_create_info.arrayLayers = 4;
Karl Schultz6addd812016-02-02 17:17:23 -070015724 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15725 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15726 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
15727 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015728
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015729 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015730 ASSERT_VK_SUCCESS(err);
15731
Mark Lobodzinski867787a2016-10-14 11:49:55 -060015732 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015733 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060015734 ASSERT_VK_SUCCESS(err);
15735
15736 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015737 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070015738 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
15739 memAlloc.pNext = NULL;
15740 memAlloc.allocationSize = 0;
15741 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015742
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060015743 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015744 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015745 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060015746 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015747 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015748 ASSERT_VK_SUCCESS(err);
15749
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015750 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060015751 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015752 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015753 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015754 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060015755 ASSERT_VK_SUCCESS(err);
15756
15757 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
15758 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015759 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060015760 ASSERT_VK_SUCCESS(err);
15761
Tony Barbour552f6c02016-12-21 14:34:07 -070015762 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015763 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015764 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060015765 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060015766 copyRegion.srcSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015767 copyRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060015768 copyRegion.srcOffset.x = 0;
15769 copyRegion.srcOffset.y = 0;
15770 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080015771 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015772 copyRegion.dstSubresource.mipLevel = 0;
15773 copyRegion.dstSubresource.baseArrayLayer = 0;
Mark Lobodzinskidb117632016-03-31 10:45:56 -060015774 // Introduce failure by forcing the dst layerCount to differ from src
15775 copyRegion.dstSubresource.layerCount = 3;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015776 copyRegion.dstOffset.x = 0;
15777 copyRegion.dstOffset.y = 0;
15778 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060015779 copyRegion.extent.width = 1;
15780 copyRegion.extent.height = 1;
15781 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015782 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070015783 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060015784
Chris Forbes8f36a8a2016-04-07 13:21:07 +120015785 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060015786
Chia-I Wuf7458c52015-10-26 21:10:41 +080015787 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080015788 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080015789 vkFreeMemory(m_device->device(), srcMem, NULL);
15790 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060015791}
15792
Tony Barbourd6673642016-05-05 14:46:39 -060015793TEST_F(VkLayerTest, ImageLayerUnsupportedFormat) {
Tony Barbourd6673642016-05-05 14:46:39 -060015794 TEST_DESCRIPTION("Creating images with unsuported formats ");
15795
15796 ASSERT_NO_FATAL_FAILURE(InitState());
15797 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
15798 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015799 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 -060015800 VK_IMAGE_TILING_OPTIMAL, 0);
15801 ASSERT_TRUE(image.initialized());
15802
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015803 // Create image with unsupported format - Expect FORMAT_UNSUPPORTED
Chris Forbesf4d8e332016-11-28 17:51:10 +130015804 VkImageCreateInfo image_create_info = {};
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015805 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015806 image_create_info.imageType = VK_IMAGE_TYPE_2D;
15807 image_create_info.format = VK_FORMAT_UNDEFINED;
15808 image_create_info.extent.width = 32;
15809 image_create_info.extent.height = 32;
15810 image_create_info.extent.depth = 1;
15811 image_create_info.mipLevels = 1;
15812 image_create_info.arrayLayers = 1;
15813 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
15814 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
15815 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015816
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015817 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15818 "vkCreateImage: VkFormat for image must not be VK_FORMAT_UNDEFINED");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015819
15820 VkImage localImage;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070015821 m_errorMonitor->SetUnexpectedError("CreateImage extents exceed allowable limits for format");
15822 m_errorMonitor->SetUnexpectedError("CreateImage mipLevels=1 exceeds allowable maximum supported by format of 0");
15823 m_errorMonitor->SetUnexpectedError("arrayLayers must be less than or equal to VkImageFormatProperties::maxArrayLayers");
15824 m_errorMonitor->SetUnexpectedError("samples must be a bit value that is set in VkImageFormatProperties::sampleCounts");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015825 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
15826 m_errorMonitor->VerifyFound();
15827
Tony Barbourd6673642016-05-05 14:46:39 -060015828 VkFormat unsupported = VK_FORMAT_UNDEFINED;
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015829 // Look for a format that is COMPLETELY unsupported with this hardware
Tony Barbourd6673642016-05-05 14:46:39 -060015830 for (int f = VK_FORMAT_BEGIN_RANGE; f <= VK_FORMAT_END_RANGE; f++) {
15831 VkFormat format = static_cast<VkFormat>(f);
15832 VkFormatProperties fProps = m_device->format_properties(format);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015833 if (format != VK_FORMAT_UNDEFINED && fProps.linearTilingFeatures == 0 && fProps.optimalTilingFeatures == 0) {
Tony Barbourd6673642016-05-05 14:46:39 -060015834 unsupported = format;
15835 break;
15836 }
15837 }
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015838
Tony Barbourd6673642016-05-05 14:46:39 -060015839 if (unsupported != VK_FORMAT_UNDEFINED) {
Tony Barbourd6673642016-05-05 14:46:39 -060015840 image_create_info.format = unsupported;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015841 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is an unsupported format");
Tony Barbourd6673642016-05-05 14:46:39 -060015842
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070015843 m_errorMonitor->SetUnexpectedError("CreateImage extents exceed allowable limits for format");
15844 m_errorMonitor->SetUnexpectedError("CreateImage resource size exceeds allowable maximum Image resource size");
15845 m_errorMonitor->SetUnexpectedError("CreateImage mipLevels=1 exceeds allowable maximum supported by format of 0");
15846 m_errorMonitor->SetUnexpectedError("arrayLayers must be less than or equal to VkImageFormatProperties::maxArrayLayers");
15847 m_errorMonitor->SetUnexpectedError(
15848 "samples must be a bit value that is set in VkImageFormatProperties::sampleCounts returned by "
15849 "vkGetPhysicalDeviceImageFormatProperties with format, type, tiling, usage, and flags equal to those in this "
15850 "structure");
Mark Lobodzinskiba5c6862016-05-17 08:14:00 -060015851 vkCreateImage(m_device->handle(), &image_create_info, NULL, &localImage);
Tony Barbourd6673642016-05-05 14:46:39 -060015852 m_errorMonitor->VerifyFound();
15853 }
15854}
15855
15856TEST_F(VkLayerTest, ImageLayerViewTests) {
15857 VkResult ret;
15858 TEST_DESCRIPTION("Passing bad parameters to CreateImageView");
15859
15860 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf887b162017-03-09 10:06:46 -070015861 auto depth_format = find_depth_stencil_format(m_device);
15862 if (!depth_format) {
15863 return;
15864 }
Tony Barbourd6673642016-05-05 14:46:39 -060015865
15866 VkImageObj image(m_device);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015867 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 -060015868 VK_IMAGE_TILING_OPTIMAL, 0);
15869 ASSERT_TRUE(image.initialized());
15870
15871 VkImageView imgView;
15872 VkImageViewCreateInfo imgViewInfo = {};
15873 imgViewInfo.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
15874 imgViewInfo.image = image.handle();
15875 imgViewInfo.viewType = VK_IMAGE_VIEW_TYPE_2D;
15876 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15877 imgViewInfo.subresourceRange.layerCount = 1;
15878 imgViewInfo.subresourceRange.baseMipLevel = 0;
15879 imgViewInfo.subresourceRange.levelCount = 1;
15880 imgViewInfo.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
15881
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015882 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060015883 // View can't have baseMipLevel >= image's mipLevels - Expect
15884 // VIEW_CREATE_ERROR
15885 imgViewInfo.subresourceRange.baseMipLevel = 1;
15886 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15887 m_errorMonitor->VerifyFound();
15888 imgViewInfo.subresourceRange.baseMipLevel = 0;
15889
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015890 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060015891 // View can't have baseArrayLayer >= image's arraySize - Expect
15892 // VIEW_CREATE_ERROR
15893 imgViewInfo.subresourceRange.baseArrayLayer = 1;
15894 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15895 m_errorMonitor->VerifyFound();
15896 imgViewInfo.subresourceRange.baseArrayLayer = 0;
15897
Mike Weiblenc16b2aa2017-01-25 13:02:44 -070015898 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00768);
Tony Barbourd6673642016-05-05 14:46:39 -060015899 // View's levelCount can't be 0 - Expect VIEW_CREATE_ERROR
15900 imgViewInfo.subresourceRange.levelCount = 0;
15901 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15902 m_errorMonitor->VerifyFound();
15903 imgViewInfo.subresourceRange.levelCount = 1;
15904
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015905 m_errorMonitor->SetDesiredFailureMsg(
15906 VK_DEBUG_REPORT_ERROR_BIT_EXT,
15907 "if pCreateInfo->viewType is VK_IMAGE_TYPE_2D, pCreateInfo->subresourceRange.layerCount must be 1");
Tony Barbourd6673642016-05-05 14:46:39 -060015908 // View's layerCount can't be 0 - Expect VIEW_CREATE_ERROR
15909 imgViewInfo.subresourceRange.layerCount = 0;
15910 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15911 m_errorMonitor->VerifyFound();
15912 imgViewInfo.subresourceRange.layerCount = 1;
15913
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070015914 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15915 "Formats MUST be IDENTICAL unless "
15916 "VK_IMAGE_CREATE_MUTABLE_FORMAT BIT "
15917 "was set on image creation.");
Tony Barbourd6673642016-05-05 14:46:39 -060015918 // Can't use depth format for view into color image - Expect INVALID_FORMAT
Tony Barbourf887b162017-03-09 10:06:46 -070015919 imgViewInfo.format = depth_format;
Tony Barbourd6673642016-05-05 14:46:39 -060015920 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15921 m_errorMonitor->VerifyFound();
15922 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15923
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015924 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02172);
Tony Barbourd6673642016-05-05 14:46:39 -060015925 // Same compatibility class but no MUTABLE_FORMAT bit - Expect
15926 // VIEW_CREATE_ERROR
15927 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UINT;
15928 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15929 m_errorMonitor->VerifyFound();
15930 imgViewInfo.format = VK_FORMAT_B8G8R8A8_UNORM;
15931
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070015932 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02171);
Tobin Ehlis8d79b2e2016-10-26 14:13:46 -060015933 // TODO: Update framework to easily passing mutable flag into ImageObj init
15934 // For now just allowing image for this one test to not have memory bound
Jeremy Hayes5a7cf2e2017-01-06 15:23:27 -070015935 // TODO: The following line is preventing the intended validation from occurring because of the way the error monitor works.
15936 // m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
15937 // " used with no memory bound. Memory should be bound by calling vkBindImageMemory().");
Tony Barbourd6673642016-05-05 14:46:39 -060015938 // Have MUTABLE_FORMAT bit but not in same compatibility class - Expect
15939 // VIEW_CREATE_ERROR
15940 VkImageCreateInfo mutImgInfo = image.create_info();
15941 VkImage mutImage;
15942 mutImgInfo.format = VK_FORMAT_R8_UINT;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060015943 assert(m_device->format_properties(VK_FORMAT_R8_UINT).optimalTilingFeatures & VK_FORMAT_FEATURE_COLOR_ATTACHMENT_BIT);
Tony Barbourd6673642016-05-05 14:46:39 -060015944 mutImgInfo.flags = VK_IMAGE_CREATE_MUTABLE_FORMAT_BIT;
15945 mutImgInfo.usage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
15946 ret = vkCreateImage(m_device->handle(), &mutImgInfo, NULL, &mutImage);
15947 ASSERT_VK_SUCCESS(ret);
15948 imgViewInfo.image = mutImage;
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070015949 m_errorMonitor->SetUnexpectedError(
15950 "If image is non-sparse then it must be bound completely and contiguously to a single VkDeviceMemory object");
Tony Barbourd6673642016-05-05 14:46:39 -060015951 vkCreateImageView(m_device->handle(), &imgViewInfo, NULL, &imgView);
15952 m_errorMonitor->VerifyFound();
15953 imgViewInfo.image = image.handle();
15954 vkDestroyImage(m_device->handle(), mutImage, NULL);
15955}
15956
Dave Houlton75967fc2017-03-06 17:21:16 -070015957TEST_F(VkLayerTest, CompressedImageMipCopyTests) {
15958 TEST_DESCRIPTION("Image/Buffer copies for higher mip levels");
15959
15960 ASSERT_NO_FATAL_FAILURE(InitState());
15961
15962 VkPhysicalDeviceFeatures device_features;
15963 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
15964 VkFormat compressed_format = VK_FORMAT_UNDEFINED;
15965 if (device_features.textureCompressionBC) {
15966 compressed_format = VK_FORMAT_BC3_SRGB_BLOCK;
15967 } else if (device_features.textureCompressionETC2) {
15968 compressed_format = VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK;
15969 } else if (device_features.textureCompressionASTC_LDR) {
15970 compressed_format = VK_FORMAT_ASTC_4x4_UNORM_BLOCK;
15971 } else {
15972 printf(" No compressed formats supported - CompressedImageMipCopyTests skipped.\n");
15973 return;
15974 }
15975
15976 VkImageCreateInfo ci;
15977 ci.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
15978 ci.pNext = NULL;
15979 ci.flags = 0;
15980 ci.imageType = VK_IMAGE_TYPE_2D;
15981 ci.format = compressed_format;
15982 ci.extent = {32, 32, 1};
15983 ci.mipLevels = 6;
15984 ci.arrayLayers = 1;
15985 ci.samples = VK_SAMPLE_COUNT_1_BIT;
15986 ci.tiling = VK_IMAGE_TILING_OPTIMAL;
15987 ci.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT;
15988 ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
15989 ci.queueFamilyIndexCount = 0;
15990 ci.pQueueFamilyIndices = NULL;
15991 ci.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
15992
15993 VkImageObj image(m_device);
15994 image.init(&ci);
15995 ASSERT_TRUE(image.initialized());
15996
15997 VkImageObj odd_image(m_device);
15998 ci.extent = {31, 32, 1}; // Mips are [31,32] [15,16] [7,8] [3,4], [1,2] [1,1]
15999 odd_image.init(&ci);
16000 ASSERT_TRUE(odd_image.initialized());
16001
16002 // Allocate buffers
16003 VkMemoryPropertyFlags reqs = 0;
16004 vk_testing::Buffer buffer_1024, buffer_64, buffer_16, buffer_8;
16005 buffer_1024.init_as_src_and_dst(*m_device, 1024, reqs);
16006 buffer_64.init_as_src_and_dst(*m_device, 64, reqs);
16007 buffer_16.init_as_src_and_dst(*m_device, 16, reqs);
16008 buffer_8.init_as_src_and_dst(*m_device, 8, reqs);
16009
16010 VkBufferImageCopy region = {};
16011 region.bufferRowLength = 0;
16012 region.bufferImageHeight = 0;
16013 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16014 region.imageSubresource.layerCount = 1;
16015 region.imageOffset = {0, 0, 0};
16016 region.bufferOffset = 0;
16017
16018 // start recording
16019 m_commandBuffer->BeginCommandBuffer();
16020
16021 // Mip level copies that work - 5 levels
16022 m_errorMonitor->ExpectSuccess();
16023
16024 // Mip 0 should fit in 1k buffer - 1k texels @ 1b each
16025 region.imageExtent = {32, 32, 1};
16026 region.imageSubresource.mipLevel = 0;
16027 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_1024.handle(), 1,
16028 &region);
16029 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_1024.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16030 &region);
16031
16032 // Mip 2 should fit in 64b buffer - 64 texels @ 1b each
16033 region.imageExtent = {8, 8, 1};
16034 region.imageSubresource.mipLevel = 2;
16035 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64.handle(), 1,
16036 &region);
16037 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16038 &region);
16039
16040 // Mip 3 should fit in 16b buffer - 16 texels @ 1b each
16041 region.imageExtent = {4, 4, 1};
16042 region.imageSubresource.mipLevel = 3;
16043 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16044 &region);
16045 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16046 &region);
16047
16048 // Mip 4&5 should fit in 16b buffer with no complaint - 4 & 1 texels @ 1b each
16049 region.imageExtent = {2, 2, 1};
16050 region.imageSubresource.mipLevel = 4;
16051 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16052 &region);
16053 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16054 &region);
16055
16056 region.imageExtent = {1, 1, 1};
16057 region.imageSubresource.mipLevel = 5;
16058 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16059 &region);
16060 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16061 &region);
16062 m_errorMonitor->VerifyNotFound();
16063
16064 // Buffer must accomodate a full compressed block, regardless of texel count
16065 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16066 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_8.handle(), 1,
16067 &region);
16068 m_errorMonitor->VerifyFound();
16069 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227);
16070 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_8.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16071 &region);
16072 m_errorMonitor->VerifyFound();
16073
16074 // Copy width < compressed block size, but not the full mip width
16075 region.imageExtent = {1, 2, 1};
16076 region.imageSubresource.mipLevel = 4;
16077 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16078 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16079 &region);
16080 m_errorMonitor->VerifyFound();
16081 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16082 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16083 &region);
16084 m_errorMonitor->VerifyFound();
16085
16086 // Copy height < compressed block size but not the full mip height
16087 region.imageExtent = {2, 1, 1};
16088 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16089 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16090 &region);
16091 m_errorMonitor->VerifyFound();
16092 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16093 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16094 &region);
16095 m_errorMonitor->VerifyFound();
16096
16097 // Offsets must be multiple of compressed block size
16098 region.imageOffset = {1, 1, 0};
16099 region.imageExtent = {1, 1, 1};
16100 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16101 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16102 &region);
16103 m_errorMonitor->VerifyFound();
16104 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01273);
16105 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16106 &region);
16107 m_errorMonitor->VerifyFound();
16108
16109 // Offset + extent width = mip width - should succeed
16110 region.imageOffset = {4, 4, 0};
16111 region.imageExtent = {3, 4, 1};
16112 region.imageSubresource.mipLevel = 2;
16113 m_errorMonitor->ExpectSuccess();
16114 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16115 &region);
16116 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16117 &region);
16118 m_errorMonitor->VerifyNotFound();
16119
16120 // Offset + extent width > mip width, but still within the final compressed block - should succeed
16121 region.imageExtent = {4, 4, 1};
16122 m_errorMonitor->ExpectSuccess();
16123 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16124 &region);
16125 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16126 &region);
16127 m_errorMonitor->VerifyNotFound();
16128
16129 // Offset + extent width < mip width and not a multiple of block width - should fail
16130 region.imageExtent = {3, 3, 1};
16131 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16132 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16.handle(), 1,
16133 &region);
16134 m_errorMonitor->VerifyFound();
16135 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
16136 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16.handle(), odd_image.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16137 &region);
16138 m_errorMonitor->VerifyFound();
16139}
16140
Dave Houlton59a20702017-02-02 17:26:23 -070016141TEST_F(VkLayerTest, ImageBufferCopyTests) {
16142 TEST_DESCRIPTION("Image to buffer and buffer to image tests");
16143
16144 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf887b162017-03-09 10:06:46 -070016145 VkFormatProperties format_props = m_device->format_properties(VK_FORMAT_D24_UNORM_S8_UINT);
16146 if (!(format_props.optimalTilingFeatures & VK_FORMAT_FEATURE_DEPTH_STENCIL_ATTACHMENT_BIT)) {
16147 printf(" VK_FORMAT_D24_UNORM_S8_UINT not supported. Skipped.\n");
16148 return;
16149 }
Dave Houlton584d51e2017-02-16 12:52:54 -070016150
16151 // Bail if any dimension of transfer granularity is 0.
16152 auto index = m_device->graphics_queue_node_index_;
16153 auto queue_family_properties = m_device->phy().queue_properties();
16154 if ((queue_family_properties[index].minImageTransferGranularity.depth == 0) ||
16155 (queue_family_properties[index].minImageTransferGranularity.width == 0) ||
16156 (queue_family_properties[index].minImageTransferGranularity.height == 0)) {
16157 printf(" Subresource copies are disallowed when xfer granularity (x|y|z) is 0. Skipped.\n");
16158 return;
16159 }
16160
Dave Houlton59a20702017-02-02 17:26:23 -070016161 VkImageObj image_64k(m_device); // 128^2 texels, 64k
16162 VkImageObj image_16k(m_device); // 64^2 texels, 16k
16163 VkImageObj image_16k_depth(m_device); // 64^2 texels, depth, 16k
Dave Houltonf3229d52017-02-21 15:59:08 -070016164 VkImageObj ds_image_4D_1S(m_device); // 256^2 texels, 512kb (256k depth, 64k stencil, 192k pack)
16165 VkImageObj ds_image_3D_1S(m_device); // 256^2 texels, 256kb (192k depth, 64k stencil)
16166 VkImageObj ds_image_2D(m_device); // 256^2 texels, 128k (128k depth)
16167 VkImageObj ds_image_1S(m_device); // 256^2 texels, 64k (64k stencil)
16168
Dave Houlton59a20702017-02-02 17:26:23 -070016169 image_64k.init(128, 128, VK_FORMAT_R8G8B8A8_UINT,
16170 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16171 VK_IMAGE_TILING_OPTIMAL, 0);
16172 image_16k.init(64, 64, VK_FORMAT_R8G8B8A8_UINT,
16173 VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16174 VK_IMAGE_TILING_OPTIMAL, 0);
16175 image_16k_depth.init(64, 64, VK_FORMAT_D24_UNORM_S8_UINT, VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16176 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton59a20702017-02-02 17:26:23 -070016177 ASSERT_TRUE(image_64k.initialized());
16178 ASSERT_TRUE(image_16k.initialized());
16179 ASSERT_TRUE(image_16k_depth.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016180
Dave Houltonf3229d52017-02-21 15:59:08 -070016181 // Verify all needed Depth/Stencil formats are supported
16182 bool missing_ds_support = false;
16183 VkFormatProperties props = {0, 0, 0};
16184 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D32_SFLOAT_S8_UINT, &props);
16185 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16186 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D24_UNORM_S8_UINT, &props);
16187 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16188 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_D16_UNORM, &props);
16189 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16190 vkGetPhysicalDeviceFormatProperties(m_device->phy().handle(), VK_FORMAT_S8_UINT, &props);
16191 missing_ds_support |= (props.bufferFeatures == 0 && props.linearTilingFeatures == 0 && props.optimalTilingFeatures == 0);
16192
16193 if (!missing_ds_support) {
16194 ds_image_4D_1S.init(
16195 256, 256, VK_FORMAT_D32_SFLOAT_S8_UINT,
16196 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16197 VK_IMAGE_TILING_OPTIMAL, 0);
16198 ASSERT_TRUE(ds_image_4D_1S.initialized());
16199
16200 ds_image_3D_1S.init(
16201 256, 256, VK_FORMAT_D24_UNORM_S8_UINT,
16202 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16203 VK_IMAGE_TILING_OPTIMAL, 0);
16204 ASSERT_TRUE(ds_image_3D_1S.initialized());
16205
16206 ds_image_2D.init(
16207 256, 256, VK_FORMAT_D16_UNORM,
16208 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16209 VK_IMAGE_TILING_OPTIMAL, 0);
16210 ASSERT_TRUE(ds_image_2D.initialized());
16211
16212 ds_image_1S.init(
16213 256, 256, VK_FORMAT_S8_UINT,
16214 VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT,
16215 VK_IMAGE_TILING_OPTIMAL, 0);
16216 ASSERT_TRUE(ds_image_1S.initialized());
16217 }
16218
16219 // Allocate buffers
16220 vk_testing::Buffer buffer_256k, buffer_128k, buffer_64k, buffer_16k;
Dave Houlton59a20702017-02-02 17:26:23 -070016221 VkMemoryPropertyFlags reqs = 0;
Dave Houltonf3229d52017-02-21 15:59:08 -070016222 buffer_256k.init_as_src_and_dst(*m_device, 262144, reqs); // 256k
16223 buffer_128k.init_as_src_and_dst(*m_device, 131072, reqs); // 128k
16224 buffer_64k.init_as_src_and_dst(*m_device, 65536, reqs); // 64k
16225 buffer_16k.init_as_src_and_dst(*m_device, 16384, reqs); // 16k
Dave Houlton59a20702017-02-02 17:26:23 -070016226
16227 VkBufferImageCopy region = {};
16228 region.bufferRowLength = 0;
16229 region.bufferImageHeight = 0;
16230 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16231 region.imageSubresource.layerCount = 1;
16232 region.imageOffset = {0, 0, 0};
16233 region.imageExtent = {64, 64, 1};
16234 region.bufferOffset = 0;
16235
16236 // attempt copies before putting command buffer in recording state
16237 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01240);
16238 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16239 &region);
16240 m_errorMonitor->VerifyFound();
16241
16242 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01258);
16243 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16244 &region);
16245 m_errorMonitor->VerifyFound();
16246
16247 // start recording
16248 m_commandBuffer->BeginCommandBuffer();
16249
16250 // successful copies
16251 m_errorMonitor->ExpectSuccess();
16252 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16253 &region);
16254 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16255 &region);
16256 region.imageOffset.x = 16; // 16k copy, offset requires larger image
16257 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16258 &region);
16259 region.imageExtent.height = 78; // > 16k copy requires larger buffer & image
16260 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16261 &region);
16262 region.imageOffset.x = 0;
16263 region.imageExtent.height = 64;
16264 region.bufferOffset = 256; // 16k copy with buffer offset, requires larger buffer
16265 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16266 &region);
16267 m_errorMonitor->VerifyNotFound();
16268
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016269 // image/buffer too small (extent too large) on copy to image
Dave Houlton59a20702017-02-02 17:26:23 -070016270 region.imageExtent = {65, 64, 1};
16271 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16272 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16273 &region);
16274 m_errorMonitor->VerifyFound();
16275
16276 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16277 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16278 &region);
16279 m_errorMonitor->VerifyFound();
16280
16281 // image/buffer too small (offset) on copy to image
16282 region.imageExtent = {64, 64, 1};
16283 region.imageOffset = {0, 4, 0};
16284 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01227); // buffer too small
16285 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_16k.handle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16286 &region);
16287 m_errorMonitor->VerifyFound();
16288
16289 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228); // image too small
16290 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer_64k.handle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, 1,
16291 &region);
16292 m_errorMonitor->VerifyFound();
16293
16294 // image/buffer too small on copy to buffer
16295 region.imageExtent = {64, 64, 1};
16296 region.imageOffset = {0, 0, 0};
Mark Lobodzinski80871462017-02-16 10:37:27 -070016297 region.bufferOffset = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016298 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246); // buffer too small
16299 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_64k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16300 &region);
16301 m_errorMonitor->VerifyFound();
16302
16303 region.imageExtent = {64, 65, 1};
16304 region.bufferOffset = 0;
16305 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01245); // image too small
16306 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_64k.handle(), 1,
16307 &region);
16308 m_errorMonitor->VerifyFound();
16309
16310 // buffer size ok but rowlength causes loose packing
16311 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16312 region.imageExtent = {64, 64, 1};
16313 region.bufferRowLength = 68;
16314 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16315 &region);
16316 m_errorMonitor->VerifyFound();
16317
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016318 // An extent with zero area should produce a warning, but no error
16319 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT | VK_DEBUG_REPORT_ERROR_BIT_EXT, "} has zero area");
16320 region.imageExtent.width = 0;
16321 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16322 &region);
16323 m_errorMonitor->VerifyFound();
16324
Dave Houlton59a20702017-02-02 17:26:23 -070016325 // aspect bits
16326 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01280); // more than 1 aspect bit set
16327 region.imageExtent = {64, 64, 1};
16328 region.bufferRowLength = 0;
16329 region.bufferImageHeight = 0;
16330 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
16331 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16332 buffer_16k.handle(), 1, &region);
16333 m_errorMonitor->VerifyFound();
16334
16335 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // mis-matched aspect
16336 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16337 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k.handle(), VK_IMAGE_LAYOUT_GENERAL, buffer_16k.handle(), 1,
16338 &region);
16339 m_errorMonitor->VerifyFound();
16340
16341 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01279); // different mis-matched aspect
16342 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16343 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_depth.handle(), VK_IMAGE_LAYOUT_GENERAL,
16344 buffer_16k.handle(), 1, &region);
16345 m_errorMonitor->VerifyFound();
16346
Dave Houltonf3229d52017-02-21 15:59:08 -070016347 // Test Depth/Stencil copies
16348 if (missing_ds_support) {
16349 printf(" Depth / Stencil formats unsupported - skipping D/S tests.\n");
16350 } else {
16351 VkBufferImageCopy ds_region = {};
16352 ds_region.bufferOffset = 0;
16353 ds_region.bufferRowLength = 0;
16354 ds_region.bufferImageHeight = 0;
16355 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT;
16356 ds_region.imageSubresource.mipLevel = 0;
16357 ds_region.imageSubresource.baseArrayLayer = 0;
16358 ds_region.imageSubresource.layerCount = 1;
16359 ds_region.imageOffset = {0, 0, 0};
16360 ds_region.imageExtent = {256, 256, 1};
16361
16362 // Depth copies that should succeed
16363 m_errorMonitor->ExpectSuccess(); // Extract 4b depth per texel, pack into 256k buffer
16364 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16365 buffer_256k.handle(), 1, &ds_region);
16366 m_errorMonitor->VerifyNotFound();
16367
16368 m_errorMonitor->ExpectSuccess(); // Extract 3b depth per texel, pack (loose) into 256k buffer
16369 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16370 buffer_256k.handle(), 1, &ds_region);
16371 m_errorMonitor->VerifyNotFound();
16372
16373 m_errorMonitor->ExpectSuccess(); // Copy 2b depth per texel, into 128k buffer
16374 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16375 buffer_128k.handle(), 1, &ds_region);
16376 m_errorMonitor->VerifyNotFound();
16377
16378 // Depth copies that should fail
16379 ds_region.bufferOffset = 4;
16380 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16381 VALIDATION_ERROR_01246); // Extract 4b depth per texel, pack into 256k buffer
16382 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16383 buffer_256k.handle(), 1, &ds_region);
16384 m_errorMonitor->VerifyFound();
16385
16386 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16387 VALIDATION_ERROR_01246); // Extract 3b depth per texel, pack (loose) into 256k buffer
16388 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16389 buffer_256k.handle(), 1, &ds_region);
16390 m_errorMonitor->VerifyFound();
16391
16392 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16393 VALIDATION_ERROR_01246); // Copy 2b depth per texel, into 128k buffer
16394 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_2D.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16395 buffer_128k.handle(), 1, &ds_region);
16396 m_errorMonitor->VerifyFound();
16397
16398 // Stencil copies that should succeed
16399 ds_region.bufferOffset = 0;
16400 ds_region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_STENCIL_BIT;
16401 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16402 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16403 buffer_64k.handle(), 1, &ds_region);
16404 m_errorMonitor->VerifyNotFound();
16405
16406 m_errorMonitor->ExpectSuccess(); // Extract 1b stencil per texel, pack into 64k buffer
16407 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16408 buffer_64k.handle(), 1, &ds_region);
16409 m_errorMonitor->VerifyNotFound();
16410
16411 m_errorMonitor->ExpectSuccess(); // Copy 1b depth per texel, into 64k buffer
16412 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16413 buffer_64k.handle(), 1, &ds_region);
16414 m_errorMonitor->VerifyNotFound();
16415
16416 // Stencil copies that should fail
16417 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16418 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16419 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_4D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16420 buffer_16k.handle(), 1, &ds_region);
16421 m_errorMonitor->VerifyFound();
16422
16423 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16424 VALIDATION_ERROR_01246); // Extract 1b stencil per texel, pack into 64k buffer
16425 ds_region.bufferRowLength = 260;
16426 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_3D_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16427 buffer_64k.handle(), 1, &ds_region);
16428 m_errorMonitor->VerifyFound();
16429
16430 ds_region.bufferRowLength = 0;
16431 ds_region.bufferOffset = 4;
16432 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16433 VALIDATION_ERROR_01246); // Copy 1b depth per texel, into 64k buffer
16434 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), ds_image_1S.handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL,
16435 buffer_64k.handle(), 1, &ds_region);
16436 m_errorMonitor->VerifyFound();
16437 }
16438
Dave Houlton584d51e2017-02-16 12:52:54 -070016439 // Test compressed formats, if supported
16440 VkPhysicalDeviceFeatures device_features;
16441 ASSERT_NO_FATAL_FAILURE(GetPhysicalDeviceFeatures(&device_features));
Dave Houltonf3229d52017-02-21 15:59:08 -070016442 if (!(device_features.textureCompressionBC || device_features.textureCompressionETC2 ||
16443 device_features.textureCompressionASTC_LDR)) {
16444 printf(" No compressed formats supported - block compression tests skipped.\n");
16445 } else {
Dave Houlton67e9b532017-03-02 17:00:10 -070016446 VkImageObj image_16k_4x4comp(m_device); // 128^2 texels as 32^2 compressed (4x4) blocks, 16k
16447 VkImageObj image_NPOT_4x4comp(m_device); // 130^2 texels as 33^2 compressed (4x4) blocks
Dave Houlton584d51e2017-02-16 12:52:54 -070016448 if (device_features.textureCompressionBC) {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016449 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 -070016450 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_BC3_SRGB_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_OPTIMAL,
16451 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016452 } else if (device_features.textureCompressionETC2) {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016453 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 -070016454 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton67e9b532017-03-02 17:00:10 -070016455 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_ETC2_R8G8B8A8_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16456 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016457 } else {
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016458 image_16k_4x4comp.init(128, 128, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16459 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton67e9b532017-03-02 17:00:10 -070016460 image_NPOT_4x4comp.init(130, 130, VK_FORMAT_ASTC_4x4_UNORM_BLOCK, VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16461 VK_IMAGE_TILING_OPTIMAL, 0);
Dave Houlton584d51e2017-02-16 12:52:54 -070016462 }
16463 ASSERT_TRUE(image_16k_4x4comp.initialized());
Dave Houlton59a20702017-02-02 17:26:23 -070016464
Dave Houlton584d51e2017-02-16 12:52:54 -070016465 // Just fits
16466 m_errorMonitor->ExpectSuccess();
16467 region.imageExtent = {128, 128, 1};
16468 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16469 buffer_16k.handle(), 1, &region);
16470 m_errorMonitor->VerifyNotFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016471
Dave Houlton584d51e2017-02-16 12:52:54 -070016472 // with offset, too big for buffer
16473 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01246);
16474 region.bufferOffset = 16;
16475 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16476 buffer_16k.handle(), 1, &region);
16477 m_errorMonitor->VerifyFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016478 region.bufferOffset = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016479
Dave Houlton67e9b532017-03-02 17:00:10 -070016480 // extents that are not a multiple of compressed block size
16481 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01275);
16482 region.imageExtent.width = 66;
16483 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16484 buffer_16k.handle(), 1, &region);
16485 m_errorMonitor->VerifyFound();
16486 region.imageExtent.width = 128;
16487
16488 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01276);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016489 region.imageExtent.height = 2;
Dave Houlton67e9b532017-03-02 17:00:10 -070016490 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16491 buffer_16k.handle(), 1, &region);
16492 m_errorMonitor->VerifyFound();
16493 region.imageExtent.height = 128;
16494
16495 // TODO: All available compressed formats are 2D, with block depth of 1. Unable to provoke VU_01277.
16496
16497 // non-multiple extents are allowed if at the far edge of a non-block-multiple image - these should pass
16498 m_errorMonitor->ExpectSuccess();
16499 region.imageExtent.width = 66;
16500 region.imageOffset.x = 64;
16501 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16502 buffer_16k.handle(), 1, &region);
16503 region.imageExtent.width = 16;
16504 region.imageOffset.x = 0;
16505 region.imageExtent.height = 2;
16506 region.imageOffset.y = 128;
16507 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_NPOT_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016508 buffer_16k.handle(), 1, &region);
16509 m_errorMonitor->VerifyNotFound();
Dave Houlton67e9b532017-03-02 17:00:10 -070016510 region.imageOffset = {0, 0, 0};
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016511
Dave Houlton584d51e2017-02-16 12:52:54 -070016512 // buffer offset must be a multiple of texel block size (16)
16513 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01274);
16514 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
16515 region.imageExtent = {64, 64, 1};
16516 region.bufferOffset = 24;
16517 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16518 buffer_16k.handle(), 1, &region);
16519 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016520
Dave Houlton584d51e2017-02-16 12:52:54 -070016521 // rowlength not a multiple of block width (4)
16522 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01271);
16523 region.bufferOffset = 0;
16524 region.bufferRowLength = 130;
16525 region.bufferImageHeight = 0;
16526 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16527 buffer_64k.handle(), 1, &region);
16528 m_errorMonitor->VerifyFound();
Dave Houlton59a20702017-02-02 17:26:23 -070016529
Dave Houlton584d51e2017-02-16 12:52:54 -070016530 // imageheight not a multiple of block height (4)
16531 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01272);
16532 region.bufferRowLength = 0;
16533 region.bufferImageHeight = 130;
16534 vkCmdCopyImageToBuffer(m_commandBuffer->GetBufferHandle(), image_16k_4x4comp.handle(), VK_IMAGE_LAYOUT_GENERAL,
16535 buffer_64k.handle(), 1, &region);
16536 m_errorMonitor->VerifyFound();
Dave Houlton584d51e2017-02-16 12:52:54 -070016537 }
Dave Houlton59a20702017-02-02 17:26:23 -070016538}
16539
Tony Barbourd6673642016-05-05 14:46:39 -060016540TEST_F(VkLayerTest, MiscImageLayerTests) {
Mark Lobodzinskie6911292017-02-15 14:38:51 -070016541 TEST_DESCRIPTION("Image-related tests that don't belong elsewhare");
Tony Barbourd6673642016-05-05 14:46:39 -060016542
16543 ASSERT_NO_FATAL_FAILURE(InitState());
16544
Rene Lindsay135204f2016-12-22 17:11:09 -070016545 // TODO: Ideally we should check if a format is supported, before using it.
Tony Barbourd6673642016-05-05 14:46:39 -060016546 VkImageObj image(m_device);
Rene Lindsay135204f2016-12-22 17:11:09 -070016547 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 -070016548 VK_IMAGE_TILING_OPTIMAL, 0); // 64bpp
Tony Barbourd6673642016-05-05 14:46:39 -060016549 ASSERT_TRUE(image.initialized());
Tony Barbourd6673642016-05-05 14:46:39 -060016550 vk_testing::Buffer buffer;
16551 VkMemoryPropertyFlags reqs = 0;
Rene Lindsay135204f2016-12-22 17:11:09 -070016552 buffer.init_as_src(*m_device, 128 * 128 * 8, reqs);
Tony Barbourd6673642016-05-05 14:46:39 -060016553 VkBufferImageCopy region = {};
16554 region.bufferRowLength = 128;
16555 region.bufferImageHeight = 128;
16556 region.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16557 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
Mark Lobodzinski3702e932016-11-22 11:40:48 -070016558 region.imageSubresource.layerCount = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016559 region.imageExtent.height = 4;
16560 region.imageExtent.width = 4;
16561 region.imageExtent.depth = 1;
Rene Lindsay135204f2016-12-22 17:11:09 -070016562
16563 VkImageObj image2(m_device);
16564 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 -070016565 VK_IMAGE_TILING_OPTIMAL, 0); // 16bpp
Rene Lindsay135204f2016-12-22 17:11:09 -070016566 ASSERT_TRUE(image2.initialized());
16567 vk_testing::Buffer buffer2;
16568 VkMemoryPropertyFlags reqs2 = 0;
16569 buffer2.init_as_src(*m_device, 128 * 128 * 2, reqs2);
16570 VkBufferImageCopy region2 = {};
16571 region2.bufferRowLength = 128;
16572 region2.bufferImageHeight = 128;
16573 region2.imageSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16574 // layerCount can't be 0 - Expect MISMATCHED_IMAGE_ASPECT
16575 region2.imageSubresource.layerCount = 1;
16576 region2.imageExtent.height = 4;
16577 region2.imageExtent.width = 4;
16578 region2.imageExtent.depth = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016579 m_commandBuffer->BeginCommandBuffer();
Tony Barbourd6673642016-05-05 14:46:39 -060016580
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016581 // Image must have offset.z of 0 and extent.depth of 1
16582 // Introduce failure by setting imageExtent.depth to 0
16583 region.imageExtent.depth = 0;
Dave Houlton59a20702017-02-02 17:26:23 -070016584 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016585 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016586 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016587 m_errorMonitor->VerifyFound();
16588
16589 region.imageExtent.depth = 1;
16590
16591 // Image must have offset.z of 0 and extent.depth of 1
16592 // Introduce failure by setting imageOffset.z to 4
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016593 // Note: Also (unavoidably) triggers 'region exceeds image' #1228
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016594 region.imageOffset.z = 4;
Dave Houlton59a20702017-02-02 17:26:23 -070016595 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01747);
Dave Houlton9dae7ec2017-03-01 16:23:25 -070016596 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01228);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016597 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070016598 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinskic71cb932016-11-22 14:48:36 -070016599 m_errorMonitor->VerifyFound();
16600
16601 region.imageOffset.z = 0;
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016602 // BufferOffset must be a multiple of the calling command's VkImage parameter's texel size
16603 // Introduce failure by setting bufferOffset to 1 and 1/2 texels
Rene Lindsay135204f2016-12-22 17:11:09 -070016604 region.bufferOffset = 4;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016605 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01263);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016606 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16607 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016608 m_errorMonitor->VerifyFound();
16609
16610 // BufferOffset must be a multiple of 4
16611 // Introduce failure by setting bufferOffset to a value not divisible by 4
Rene Lindsay135204f2016-12-22 17:11:09 -070016612 region2.bufferOffset = 6;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016613 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01264);
Rene Lindsay135204f2016-12-22 17:11:09 -070016614 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer2.handle(), image2.handle(),
16615 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region2);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016616 m_errorMonitor->VerifyFound();
16617
16618 // BufferRowLength must be 0, or greater than or equal to the width member of imageExtent
16619 region.bufferOffset = 0;
16620 region.imageExtent.height = 128;
16621 region.imageExtent.width = 128;
16622 // Introduce failure by setting bufferRowLength > 0 but less than width
16623 region.bufferRowLength = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016624 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01265);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016625 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16626 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016627 m_errorMonitor->VerifyFound();
16628
16629 // BufferImageHeight must be 0, or greater than or equal to the height member of imageExtent
16630 region.bufferRowLength = 128;
16631 // Introduce failure by setting bufferRowHeight > 0 but less than height
16632 region.bufferImageHeight = 64;
Mark Lobodzinskided46f32016-11-22 14:54:44 -070016633 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01266);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016634 vkCmdCopyBufferToImage(m_commandBuffer->GetBufferHandle(), buffer.handle(), image.handle(),
16635 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &region);
Mark Lobodzinski7d8cf142016-08-19 10:53:26 -060016636 m_errorMonitor->VerifyFound();
16637
16638 region.bufferImageHeight = 128;
Tony Barbourd6673642016-05-05 14:46:39 -060016639 VkImageObj intImage1(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070016640 intImage1.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT,
16641 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016642 VkImageObj intImage2(m_device);
Rene Lindsaya35e1cb2016-12-26 10:30:05 -070016643 intImage2.init(128, 128, VK_FORMAT_R8_UINT, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_DST_BIT,
16644 VK_IMAGE_TILING_OPTIMAL, 0);
Tony Barbourd6673642016-05-05 14:46:39 -060016645 VkImageBlit blitRegion = {};
16646 blitRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16647 blitRegion.srcSubresource.baseArrayLayer = 0;
16648 blitRegion.srcSubresource.layerCount = 1;
16649 blitRegion.srcSubresource.mipLevel = 0;
16650 blitRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16651 blitRegion.dstSubresource.baseArrayLayer = 0;
16652 blitRegion.dstSubresource.layerCount = 1;
16653 blitRegion.dstSubresource.mipLevel = 0;
16654
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016655 // Look for NULL-blit warning
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016656 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "Offsets specify a zero-volume area.");
Jeremy Hayes1b5f7562017-02-09 11:20:58 -070016657 m_errorMonitor->SetUnexpectedError("vkCmdBlitImage: pRegions[0].dstOffsets specify a zero-volume area.");
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016658 vkCmdBlitImage(m_commandBuffer->GetBufferHandle(), intImage1.handle(), intImage1.layout(), intImage2.handle(),
16659 intImage2.layout(), 1, &blitRegion, VK_FILTER_LINEAR);
Mark Lobodzinskib02ea642016-08-17 13:03:57 -060016660 m_errorMonitor->VerifyFound();
16661
Mark Lobodzinskic386ecb2017-02-02 16:12:37 -070016662 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_00769);
Tony Barbourd6673642016-05-05 14:46:39 -060016663 VkImageMemoryBarrier img_barrier;
16664 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
16665 img_barrier.pNext = NULL;
16666 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
16667 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
16668 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16669 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16670 img_barrier.image = image.handle();
16671 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16672 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
16673 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16674 img_barrier.subresourceRange.baseArrayLayer = 0;
16675 img_barrier.subresourceRange.baseMipLevel = 0;
Tony Barbourd6673642016-05-05 14:46:39 -060016676 img_barrier.subresourceRange.layerCount = 0;
16677 img_barrier.subresourceRange.levelCount = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016678 vkCmdPipelineBarrier(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0,
16679 nullptr, 0, nullptr, 1, &img_barrier);
Tony Barbourd6673642016-05-05 14:46:39 -060016680 m_errorMonitor->VerifyFound();
16681 img_barrier.subresourceRange.layerCount = 1;
16682}
16683
16684TEST_F(VkLayerTest, ImageFormatLimits) {
Tony Barbourd6673642016-05-05 14:46:39 -060016685 TEST_DESCRIPTION("Exceed the limits of image format ");
16686
Cody Northropc31a84f2016-08-22 10:41:47 -060016687 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016688 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "CreateImage extents exceed allowable limits for format");
Tony Barbourd6673642016-05-05 14:46:39 -060016689 VkImageCreateInfo image_create_info = {};
16690 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16691 image_create_info.pNext = NULL;
16692 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16693 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16694 image_create_info.extent.width = 32;
16695 image_create_info.extent.height = 32;
16696 image_create_info.extent.depth = 1;
16697 image_create_info.mipLevels = 1;
16698 image_create_info.arrayLayers = 1;
16699 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16700 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16701 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16702 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16703 image_create_info.flags = 0;
16704
16705 VkImage nullImg;
16706 VkImageFormatProperties imgFmtProps;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016707 vkGetPhysicalDeviceImageFormatProperties(gpu(), image_create_info.format, image_create_info.imageType, image_create_info.tiling,
16708 image_create_info.usage, image_create_info.flags, &imgFmtProps);
Rene Lindsayef5bc012017-01-06 15:38:00 -070016709 image_create_info.extent.width = imgFmtProps.maxExtent.width + 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016710 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16711 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16712 m_errorMonitor->VerifyFound();
Rene Lindsayef5bc012017-01-06 15:38:00 -070016713 image_create_info.extent.width = 1;
Tony Barbourd6673642016-05-05 14:46:39 -060016714
Tony Barbour0907e362017-03-09 15:05:30 -070016715 uint32_t maxDim =
16716 std::max(std::max(image_create_info.extent.width, image_create_info.extent.height), image_create_info.extent.depth);
16717 // If max mip levels exceeds image extents, skip the max mip levels test
16718 if ((imgFmtProps.maxMipLevels + 1) <= (floor(log2(maxDim)) + 1)) {
16719 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
16720 image_create_info.mipLevels = imgFmtProps.maxMipLevels + 1;
16721 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16722 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16723 m_errorMonitor->VerifyFound();
16724 image_create_info.mipLevels = 1;
16725 }
Tony Barbourd6673642016-05-05 14:46:39 -060016726
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016727 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "exceeds allowable maximum supported by format of");
Tony Barbourd6673642016-05-05 14:46:39 -060016728 image_create_info.arrayLayers = imgFmtProps.maxArrayLayers + 1;
16729 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16730 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16731 m_errorMonitor->VerifyFound();
16732 image_create_info.arrayLayers = 1;
16733
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016734 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "is not supported by format");
Tony Barbourd6673642016-05-05 14:46:39 -060016735 int samples = imgFmtProps.sampleCounts >> 1;
16736 image_create_info.samples = (VkSampleCountFlagBits)samples;
16737 // Expect INVALID_FORMAT_LIMITS_VIOLATION
16738 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16739 m_errorMonitor->VerifyFound();
16740 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16741
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070016742 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16743 "pCreateInfo->initialLayout, must be "
16744 "VK_IMAGE_LAYOUT_UNDEFINED or "
16745 "VK_IMAGE_LAYOUT_PREINITIALIZED");
Tony Barbourd6673642016-05-05 14:46:39 -060016746 image_create_info.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
16747 // Expect INVALID_LAYOUT
16748 vkCreateImage(m_device->handle(), &image_create_info, NULL, &nullImg);
16749 m_errorMonitor->VerifyFound();
16750 image_create_info.initialLayout = VK_IMAGE_LAYOUT_UNDEFINED;
16751}
16752
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016753TEST_F(VkLayerTest, CopyImageSrcSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016754 // Image copy with source region specified greater than src image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060016755 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01175);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016756
16757 ASSERT_NO_FATAL_FAILURE(InitState());
16758
16759 VkImageObj src_image(m_device);
16760 src_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
16761 VkImageObj dst_image(m_device);
16762 dst_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
16763
Tony Barbour552f6c02016-12-21 14:34:07 -070016764 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016765 VkImageCopy copy_region;
16766 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16767 copy_region.srcSubresource.mipLevel = 0;
16768 copy_region.srcSubresource.baseArrayLayer = 0;
16769 copy_region.srcSubresource.layerCount = 0;
16770 copy_region.srcOffset.x = 0;
16771 copy_region.srcOffset.y = 0;
16772 copy_region.srcOffset.z = 0;
16773 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16774 copy_region.dstSubresource.mipLevel = 0;
16775 copy_region.dstSubresource.baseArrayLayer = 0;
16776 copy_region.dstSubresource.layerCount = 0;
16777 copy_region.dstOffset.x = 0;
16778 copy_region.dstOffset.y = 0;
16779 copy_region.dstOffset.z = 0;
16780 copy_region.extent.width = 64;
16781 copy_region.extent.height = 64;
16782 copy_region.extent.depth = 1;
16783 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
16784 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070016785 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016786
16787 m_errorMonitor->VerifyFound();
16788}
16789
16790TEST_F(VkLayerTest, CopyImageDstSizeExceeded) {
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016791 // Image copy with dest region specified greater than dest image size
Mark Lobodzinski629d47b2016-10-18 13:34:58 -060016792 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01176);
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016793
16794 ASSERT_NO_FATAL_FAILURE(InitState());
16795
16796 VkImageObj src_image(m_device);
16797 src_image.init(64, 64, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_SRC_BIT, VK_IMAGE_TILING_LINEAR, 0);
16798 VkImageObj dst_image(m_device);
16799 dst_image.init(32, 32, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_TRANSFER_DST_BIT, VK_IMAGE_TILING_LINEAR, 0);
16800
Tony Barbour552f6c02016-12-21 14:34:07 -070016801 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016802 VkImageCopy copy_region;
16803 copy_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16804 copy_region.srcSubresource.mipLevel = 0;
16805 copy_region.srcSubresource.baseArrayLayer = 0;
16806 copy_region.srcSubresource.layerCount = 0;
16807 copy_region.srcOffset.x = 0;
16808 copy_region.srcOffset.y = 0;
16809 copy_region.srcOffset.z = 0;
16810 copy_region.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16811 copy_region.dstSubresource.mipLevel = 0;
16812 copy_region.dstSubresource.baseArrayLayer = 0;
16813 copy_region.dstSubresource.layerCount = 0;
16814 copy_region.dstOffset.x = 0;
16815 copy_region.dstOffset.y = 0;
16816 copy_region.dstOffset.z = 0;
16817 copy_region.extent.width = 64;
16818 copy_region.extent.height = 64;
16819 copy_region.extent.depth = 1;
16820 m_commandBuffer->CopyImage(src_image.image(), VK_IMAGE_LAYOUT_GENERAL, dst_image.image(), VK_IMAGE_LAYOUT_GENERAL, 1,
16821 &copy_region);
Tony Barbour552f6c02016-12-21 14:34:07 -070016822 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinskicea14992016-10-14 10:59:42 -060016823
16824 m_errorMonitor->VerifyFound();
16825}
16826
Karl Schultz6addd812016-02-02 17:17:23 -070016827TEST_F(VkLayerTest, CopyImageFormatSizeMismatch) {
Karl Schultzbdb75952016-04-19 11:36:49 -060016828 VkResult err;
16829 bool pass;
16830
16831 // Create color images with different format sizes and try to copy between them
Tobin Ehlis56e1bc32017-01-02 10:09:07 -070016832 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01184);
Karl Schultzbdb75952016-04-19 11:36:49 -060016833
16834 ASSERT_NO_FATAL_FAILURE(InitState());
16835
16836 // Create two images of different types and try to copy between them
16837 VkImage srcImage;
16838 VkImage dstImage;
16839 VkDeviceMemory srcMem;
16840 VkDeviceMemory destMem;
16841 VkMemoryRequirements memReqs;
16842
16843 VkImageCreateInfo image_create_info = {};
16844 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16845 image_create_info.pNext = NULL;
16846 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16847 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16848 image_create_info.extent.width = 32;
16849 image_create_info.extent.height = 32;
16850 image_create_info.extent.depth = 1;
16851 image_create_info.mipLevels = 1;
16852 image_create_info.arrayLayers = 1;
16853 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16854 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16855 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16856 image_create_info.flags = 0;
16857
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016858 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060016859 ASSERT_VK_SUCCESS(err);
16860
16861 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16862 // Introduce failure by creating second image with a different-sized format.
16863 image_create_info.format = VK_FORMAT_R5G5B5A1_UNORM_PACK16;
16864
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016865 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Karl Schultzbdb75952016-04-19 11:36:49 -060016866 ASSERT_VK_SUCCESS(err);
16867
16868 // Allocate memory
16869 VkMemoryAllocateInfo memAlloc = {};
16870 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16871 memAlloc.pNext = NULL;
16872 memAlloc.allocationSize = 0;
16873 memAlloc.memoryTypeIndex = 0;
16874
16875 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
16876 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016877 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060016878 ASSERT_TRUE(pass);
16879 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
16880 ASSERT_VK_SUCCESS(err);
16881
16882 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
16883 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016884 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Karl Schultzbdb75952016-04-19 11:36:49 -060016885 ASSERT_TRUE(pass);
16886 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
16887 ASSERT_VK_SUCCESS(err);
16888
16889 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16890 ASSERT_VK_SUCCESS(err);
16891 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
16892 ASSERT_VK_SUCCESS(err);
16893
Tony Barbour552f6c02016-12-21 14:34:07 -070016894 m_commandBuffer->BeginCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060016895 VkImageCopy copyRegion;
16896 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16897 copyRegion.srcSubresource.mipLevel = 0;
16898 copyRegion.srcSubresource.baseArrayLayer = 0;
16899 copyRegion.srcSubresource.layerCount = 0;
16900 copyRegion.srcOffset.x = 0;
16901 copyRegion.srcOffset.y = 0;
16902 copyRegion.srcOffset.z = 0;
16903 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
16904 copyRegion.dstSubresource.mipLevel = 0;
16905 copyRegion.dstSubresource.baseArrayLayer = 0;
16906 copyRegion.dstSubresource.layerCount = 0;
16907 copyRegion.dstOffset.x = 0;
16908 copyRegion.dstOffset.y = 0;
16909 copyRegion.dstOffset.z = 0;
16910 copyRegion.extent.width = 1;
16911 copyRegion.extent.height = 1;
16912 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016913 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070016914 m_commandBuffer->EndCommandBuffer();
Karl Schultzbdb75952016-04-19 11:36:49 -060016915
16916 m_errorMonitor->VerifyFound();
16917
16918 vkDestroyImage(m_device->device(), srcImage, NULL);
16919 vkDestroyImage(m_device->device(), dstImage, NULL);
16920 vkFreeMemory(m_device->device(), srcMem, NULL);
16921 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060016922}
16923
Karl Schultz6addd812016-02-02 17:17:23 -070016924TEST_F(VkLayerTest, CopyImageDepthStencilFormatMismatch) {
16925 VkResult err;
16926 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060016927
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016928 // Create a color image and a depth/stencil image and try to copy between them
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
16930 "vkCmdCopyImage called with unmatched source and dest image depth");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060016931
Mike Stroyana3082432015-09-25 13:39:21 -060016932 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf887b162017-03-09 10:06:46 -070016933 auto depth_format = find_depth_stencil_format(m_device);
16934 if (!depth_format) {
16935 return;
16936 }
Mike Stroyana3082432015-09-25 13:39:21 -060016937
16938 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070016939 VkImage srcImage;
16940 VkImage dstImage;
16941 VkDeviceMemory srcMem;
16942 VkDeviceMemory destMem;
16943 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060016944
16945 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016946 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
16947 image_create_info.pNext = NULL;
16948 image_create_info.imageType = VK_IMAGE_TYPE_2D;
16949 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
16950 image_create_info.extent.width = 32;
16951 image_create_info.extent.height = 32;
16952 image_create_info.extent.depth = 1;
16953 image_create_info.mipLevels = 1;
16954 image_create_info.arrayLayers = 1;
16955 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
16956 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
16957 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
16958 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016959
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016960 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016961 ASSERT_VK_SUCCESS(err);
16962
Karl Schultzbdb75952016-04-19 11:36:49 -060016963 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
16964
Mark Lobodzinskidb117632016-03-31 10:45:56 -060016965 // Introduce failure by creating second image with a depth/stencil format
Karl Schultz6addd812016-02-02 17:17:23 -070016966 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Tony Barbourf887b162017-03-09 10:06:46 -070016967 image_create_info.format = depth_format;
Mark Lobodzinski867787a2016-10-14 11:49:55 -060016968 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060016969
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016970 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060016971 ASSERT_VK_SUCCESS(err);
16972
16973 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016974 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070016975 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
16976 memAlloc.pNext = NULL;
16977 memAlloc.allocationSize = 0;
16978 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060016979
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060016980 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016981 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016982 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016983 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016984 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016985 ASSERT_VK_SUCCESS(err);
16986
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016987 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060016988 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060016989 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060016990 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016991 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060016992 ASSERT_VK_SUCCESS(err);
16993
16994 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
16995 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080016996 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060016997 ASSERT_VK_SUCCESS(err);
16998
Tony Barbour552f6c02016-12-21 14:34:07 -070016999 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017000 VkImageCopy copyRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017001 copyRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017002 copyRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017003 copyRegion.srcSubresource.baseArrayLayer = 0;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017004 copyRegion.srcSubresource.layerCount = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017005 copyRegion.srcOffset.x = 0;
17006 copyRegion.srcOffset.y = 0;
17007 copyRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017008 copyRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017009 copyRegion.dstSubresource.mipLevel = 0;
17010 copyRegion.dstSubresource.baseArrayLayer = 0;
17011 copyRegion.dstSubresource.layerCount = 0;
17012 copyRegion.dstOffset.x = 0;
17013 copyRegion.dstOffset.y = 0;
17014 copyRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017015 copyRegion.extent.width = 1;
17016 copyRegion.extent.height = 1;
17017 copyRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017018 m_commandBuffer->CopyImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &copyRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017019 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017020
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017021 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017022
Chia-I Wuf7458c52015-10-26 21:10:41 +080017023 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017024 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017025 vkFreeMemory(m_device->device(), srcMem, NULL);
17026 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017027}
17028
Karl Schultz6addd812016-02-02 17:17:23 -070017029TEST_F(VkLayerTest, ResolveImageLowSampleCount) {
17030 VkResult err;
17031 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017032
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017033 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17034 "vkCmdResolveImage called with source sample count less than 2.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017035
Mike Stroyana3082432015-09-25 13:39:21 -060017036 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060017037
17038 // Create two images of sample count 1 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017039 VkImage srcImage;
17040 VkImage dstImage;
17041 VkDeviceMemory srcMem;
17042 VkDeviceMemory destMem;
17043 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017044
17045 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017046 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17047 image_create_info.pNext = NULL;
17048 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17049 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17050 image_create_info.extent.width = 32;
17051 image_create_info.extent.height = 1;
17052 image_create_info.extent.depth = 1;
17053 image_create_info.mipLevels = 1;
17054 image_create_info.arrayLayers = 1;
17055 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17056 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17057 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
17058 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017059
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017060 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017061 ASSERT_VK_SUCCESS(err);
17062
Karl Schultz6addd812016-02-02 17:17:23 -070017063 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017064
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017065 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017066 ASSERT_VK_SUCCESS(err);
17067
17068 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017069 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017070 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17071 memAlloc.pNext = NULL;
17072 memAlloc.allocationSize = 0;
17073 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017074
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017075 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017076 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017077 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017078 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017079 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017080 ASSERT_VK_SUCCESS(err);
17081
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017082 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017083 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017084 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017085 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017086 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017087 ASSERT_VK_SUCCESS(err);
17088
17089 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17090 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017091 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017092 ASSERT_VK_SUCCESS(err);
17093
Tony Barbour552f6c02016-12-21 14:34:07 -070017094 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017095 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017096 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17097 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017098 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017099 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017100 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017101 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017102 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017103 resolveRegion.srcOffset.x = 0;
17104 resolveRegion.srcOffset.y = 0;
17105 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017106 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017107 resolveRegion.dstSubresource.mipLevel = 0;
17108 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017109 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017110 resolveRegion.dstOffset.x = 0;
17111 resolveRegion.dstOffset.y = 0;
17112 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017113 resolveRegion.extent.width = 1;
17114 resolveRegion.extent.height = 1;
17115 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017116 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017117 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017118
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017119 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017120
Chia-I Wuf7458c52015-10-26 21:10:41 +080017121 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017122 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017123 vkFreeMemory(m_device->device(), srcMem, NULL);
17124 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017125}
17126
Karl Schultz6addd812016-02-02 17:17:23 -070017127TEST_F(VkLayerTest, ResolveImageHighSampleCount) {
17128 VkResult err;
17129 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017130
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017131 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17132 "vkCmdResolveImage called with dest sample count greater than 1.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017133
Mike Stroyana3082432015-09-25 13:39:21 -060017134 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060017135
Chris Forbesa7530692016-05-08 12:35:39 +120017136 // Create two images of sample count 4 and try to Resolve between them
Karl Schultz6addd812016-02-02 17:17:23 -070017137 VkImage srcImage;
17138 VkImage dstImage;
17139 VkDeviceMemory srcMem;
17140 VkDeviceMemory destMem;
17141 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017142
17143 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017144 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17145 image_create_info.pNext = NULL;
17146 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17147 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17148 image_create_info.extent.width = 32;
17149 image_create_info.extent.height = 1;
17150 image_create_info.extent.depth = 1;
17151 image_create_info.mipLevels = 1;
17152 image_create_info.arrayLayers = 1;
Chris Forbesa7530692016-05-08 12:35:39 +120017153 image_create_info.samples = VK_SAMPLE_COUNT_4_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017154 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17155 // Note: Some implementations expect color attachment usage for any
17156 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017157 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017158 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017159
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017160 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017161 ASSERT_VK_SUCCESS(err);
17162
Karl Schultz6addd812016-02-02 17:17:23 -070017163 // Note: Some implementations expect color attachment usage for any
17164 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017165 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017166
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017167 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017168 ASSERT_VK_SUCCESS(err);
17169
17170 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017171 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017172 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17173 memAlloc.pNext = NULL;
17174 memAlloc.allocationSize = 0;
17175 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017176
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017177 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017178 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017179 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017180 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017181 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017182 ASSERT_VK_SUCCESS(err);
17183
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017184 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017185 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017186 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017187 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017188 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017189 ASSERT_VK_SUCCESS(err);
17190
17191 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17192 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017193 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017194 ASSERT_VK_SUCCESS(err);
17195
Tony Barbour552f6c02016-12-21 14:34:07 -070017196 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017197 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017198 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17199 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017200 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017201 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017202 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017203 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017204 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017205 resolveRegion.srcOffset.x = 0;
17206 resolveRegion.srcOffset.y = 0;
17207 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017208 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017209 resolveRegion.dstSubresource.mipLevel = 0;
17210 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017211 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017212 resolveRegion.dstOffset.x = 0;
17213 resolveRegion.dstOffset.y = 0;
17214 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017215 resolveRegion.extent.width = 1;
17216 resolveRegion.extent.height = 1;
17217 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017218 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017219 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017220
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017221 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017222
Chia-I Wuf7458c52015-10-26 21:10:41 +080017223 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017224 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017225 vkFreeMemory(m_device->device(), srcMem, NULL);
17226 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017227}
17228
Karl Schultz6addd812016-02-02 17:17:23 -070017229TEST_F(VkLayerTest, ResolveImageFormatMismatch) {
17230 VkResult err;
17231 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017232
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017233 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017234 "vkCmdResolveImage called with unmatched source and dest formats.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017235
Mike Stroyana3082432015-09-25 13:39:21 -060017236 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060017237
17238 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017239 VkImage srcImage;
17240 VkImage dstImage;
17241 VkDeviceMemory srcMem;
17242 VkDeviceMemory destMem;
17243 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017244
17245 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017246 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17247 image_create_info.pNext = NULL;
17248 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17249 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17250 image_create_info.extent.width = 32;
17251 image_create_info.extent.height = 1;
17252 image_create_info.extent.depth = 1;
17253 image_create_info.mipLevels = 1;
17254 image_create_info.arrayLayers = 1;
17255 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17256 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17257 // Note: Some implementations expect color attachment usage for any
17258 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017259 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017260 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017261
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017262 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017263 ASSERT_VK_SUCCESS(err);
17264
Karl Schultz6addd812016-02-02 17:17:23 -070017265 // Set format to something other than source image
17266 image_create_info.format = VK_FORMAT_R32_SFLOAT;
17267 // Note: Some implementations expect color attachment usage for any
17268 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017269 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017270 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017271
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017272 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017273 ASSERT_VK_SUCCESS(err);
17274
17275 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017276 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017277 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17278 memAlloc.pNext = NULL;
17279 memAlloc.allocationSize = 0;
17280 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017281
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017282 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017283 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017284 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017285 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017286 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017287 ASSERT_VK_SUCCESS(err);
17288
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017289 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017290 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017291 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017292 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017293 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017294 ASSERT_VK_SUCCESS(err);
17295
17296 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17297 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017298 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017299 ASSERT_VK_SUCCESS(err);
17300
Tony Barbour552f6c02016-12-21 14:34:07 -070017301 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017302 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017303 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17304 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017305 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017306 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017307 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017308 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017309 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017310 resolveRegion.srcOffset.x = 0;
17311 resolveRegion.srcOffset.y = 0;
17312 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017313 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017314 resolveRegion.dstSubresource.mipLevel = 0;
17315 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017316 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017317 resolveRegion.dstOffset.x = 0;
17318 resolveRegion.dstOffset.y = 0;
17319 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017320 resolveRegion.extent.width = 1;
17321 resolveRegion.extent.height = 1;
17322 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017323 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017324 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017325
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017326 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017327
Chia-I Wuf7458c52015-10-26 21:10:41 +080017328 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017329 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017330 vkFreeMemory(m_device->device(), srcMem, NULL);
17331 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017332}
17333
Karl Schultz6addd812016-02-02 17:17:23 -070017334TEST_F(VkLayerTest, ResolveImageTypeMismatch) {
17335 VkResult err;
17336 bool pass;
Mike Stroyana3082432015-09-25 13:39:21 -060017337
Mark Lobodzinski50fbef12017-02-06 15:31:33 -070017338 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT,
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017339 "vkCmdResolveImage called with unmatched source and dest image types.");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017340
Mike Stroyana3082432015-09-25 13:39:21 -060017341 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Stroyana3082432015-09-25 13:39:21 -060017342
17343 // Create two images of different types and try to copy between them
Karl Schultz6addd812016-02-02 17:17:23 -070017344 VkImage srcImage;
17345 VkImage dstImage;
17346 VkDeviceMemory srcMem;
17347 VkDeviceMemory destMem;
17348 VkMemoryRequirements memReqs;
Mike Stroyana3082432015-09-25 13:39:21 -060017349
17350 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017351 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17352 image_create_info.pNext = NULL;
17353 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17354 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
17355 image_create_info.extent.width = 32;
17356 image_create_info.extent.height = 1;
17357 image_create_info.extent.depth = 1;
17358 image_create_info.mipLevels = 1;
17359 image_create_info.arrayLayers = 1;
17360 image_create_info.samples = VK_SAMPLE_COUNT_2_BIT;
17361 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
17362 // Note: Some implementations expect color attachment usage for any
17363 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017364 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017365 image_create_info.flags = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017366
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017367 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &srcImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017368 ASSERT_VK_SUCCESS(err);
17369
Karl Schultz6addd812016-02-02 17:17:23 -070017370 image_create_info.imageType = VK_IMAGE_TYPE_1D;
17371 // Note: Some implementations expect color attachment usage for any
17372 // multisample surface
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017373 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_DST_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017374 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017375
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017376 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &dstImage);
Mike Stroyana3082432015-09-25 13:39:21 -060017377 ASSERT_VK_SUCCESS(err);
17378
17379 // Allocate memory
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017380 VkMemoryAllocateInfo memAlloc = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017381 memAlloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17382 memAlloc.pNext = NULL;
17383 memAlloc.allocationSize = 0;
17384 memAlloc.memoryTypeIndex = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017385
Courtney Goeltzenleuchter06d89472015-10-20 16:40:38 -060017386 vkGetImageMemoryRequirements(m_device->device(), srcImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017387 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017388 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017389 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017390 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &srcMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017391 ASSERT_VK_SUCCESS(err);
17392
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017393 vkGetImageMemoryRequirements(m_device->device(), dstImage, &memReqs);
Mike Stroyana3082432015-09-25 13:39:21 -060017394 memAlloc.allocationSize = memReqs.size;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017395 pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &memAlloc, 0);
Courtney Goeltzenleuchter1d2f0dd2015-10-22 11:03:31 -060017396 ASSERT_TRUE(pass);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017397 err = vkAllocateMemory(m_device->device(), &memAlloc, NULL, &destMem);
Mike Stroyana3082432015-09-25 13:39:21 -060017398 ASSERT_VK_SUCCESS(err);
17399
17400 err = vkBindImageMemory(m_device->device(), srcImage, srcMem, 0);
17401 ASSERT_VK_SUCCESS(err);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017402 err = vkBindImageMemory(m_device->device(), dstImage, destMem, 0);
Mike Stroyana3082432015-09-25 13:39:21 -060017403 ASSERT_VK_SUCCESS(err);
17404
Tony Barbour552f6c02016-12-21 14:34:07 -070017405 m_commandBuffer->BeginCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017406 // Need memory barrier to VK_IMAGE_LAYOUT_GENERAL for source and dest?
Karl Schultz6addd812016-02-02 17:17:23 -070017407 // VK_IMAGE_LAYOUT_UNDEFINED = 0,
17408 // VK_IMAGE_LAYOUT_GENERAL = 1,
Mike Stroyana3082432015-09-25 13:39:21 -060017409 VkImageResolve resolveRegion;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017410 resolveRegion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Mike Stroyana3082432015-09-25 13:39:21 -060017411 resolveRegion.srcSubresource.mipLevel = 0;
Courtney Goeltzenleuchter8367ce02015-10-16 09:46:00 -060017412 resolveRegion.srcSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017413 resolveRegion.srcSubresource.layerCount = 1;
Mike Stroyana3082432015-09-25 13:39:21 -060017414 resolveRegion.srcOffset.x = 0;
17415 resolveRegion.srcOffset.y = 0;
17416 resolveRegion.srcOffset.z = 0;
Chia-I Wuab83a0e2015-10-27 19:00:15 +080017417 resolveRegion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017418 resolveRegion.dstSubresource.mipLevel = 0;
17419 resolveRegion.dstSubresource.baseArrayLayer = 0;
Chris Forbes496c5982016-10-03 14:16:36 +130017420 resolveRegion.dstSubresource.layerCount = 1;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017421 resolveRegion.dstOffset.x = 0;
17422 resolveRegion.dstOffset.y = 0;
17423 resolveRegion.dstOffset.z = 0;
Mike Stroyana3082432015-09-25 13:39:21 -060017424 resolveRegion.extent.width = 1;
17425 resolveRegion.extent.height = 1;
17426 resolveRegion.extent.depth = 1;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017427 m_commandBuffer->ResolveImage(srcImage, VK_IMAGE_LAYOUT_GENERAL, dstImage, VK_IMAGE_LAYOUT_GENERAL, 1, &resolveRegion);
Tony Barbour552f6c02016-12-21 14:34:07 -070017428 m_commandBuffer->EndCommandBuffer();
Mike Stroyana3082432015-09-25 13:39:21 -060017429
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017430 m_errorMonitor->VerifyFound();
Mike Stroyana3082432015-09-25 13:39:21 -060017431
Chia-I Wuf7458c52015-10-26 21:10:41 +080017432 vkDestroyImage(m_device->device(), srcImage, NULL);
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017433 vkDestroyImage(m_device->device(), dstImage, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017434 vkFreeMemory(m_device->device(), srcMem, NULL);
17435 vkFreeMemory(m_device->device(), destMem, NULL);
Mike Stroyana3082432015-09-25 13:39:21 -060017436}
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017437
Karl Schultz6addd812016-02-02 17:17:23 -070017438TEST_F(VkLayerTest, DepthStencilImageViewWithColorAspectBitError) {
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017439 // Create a single Image descriptor and cause it to first hit an error due
Karl Schultz6addd812016-02-02 17:17:23 -070017440 // to using a DS format, then cause it to hit error due to COLOR_BIT not
17441 // set in aspect
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017442 // The image format check comes 2nd in validation so we trigger it first,
17443 // then when we cause aspect fail next, bad format check will be preempted
Karl Schultz6addd812016-02-02 17:17:23 -070017444 VkResult err;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017445
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017446 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17447 "Combination depth/stencil image formats can have only the ");
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017448
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017449 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf887b162017-03-09 10:06:46 -070017450 auto depth_format = find_depth_stencil_format(m_device);
17451 if (!depth_format) {
17452 return;
17453 }
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017454
Chia-I Wu1b99bb22015-10-27 19:25:11 +080017455 VkDescriptorPoolSize ds_type_count = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017456 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17457 ds_type_count.descriptorCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017458
17459 VkDescriptorPoolCreateInfo ds_pool_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017460 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
17461 ds_pool_ci.pNext = NULL;
17462 ds_pool_ci.maxSets = 1;
17463 ds_pool_ci.poolSizeCount = 1;
17464 ds_pool_ci.pPoolSizes = &ds_type_count;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017465
17466 VkDescriptorPool ds_pool;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017467 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017468 ASSERT_VK_SUCCESS(err);
17469
17470 VkDescriptorSetLayoutBinding dsl_binding = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017471 dsl_binding.binding = 0;
17472 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
17473 dsl_binding.descriptorCount = 1;
17474 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
17475 dsl_binding.pImmutableSamplers = NULL;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017476
17477 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017478 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
17479 ds_layout_ci.pNext = NULL;
17480 ds_layout_ci.bindingCount = 1;
17481 ds_layout_ci.pBindings = &dsl_binding;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017482 VkDescriptorSetLayout ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017483 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017484 ASSERT_VK_SUCCESS(err);
17485
17486 VkDescriptorSet descriptorSet;
Chia-I Wu3432a0c2015-10-27 18:04:07 +080017487 VkDescriptorSetAllocateInfo alloc_info = {};
Chia-I Wu00ce5402015-11-10 16:21:09 +080017488 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
Jon Ashburnf19916e2016-01-11 13:12:43 -070017489 alloc_info.descriptorSetCount = 1;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017490 alloc_info.descriptorPool = ds_pool;
17491 alloc_info.pSetLayouts = &ds_layout;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017492 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptorSet);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017493 ASSERT_VK_SUCCESS(err);
17494
Karl Schultz6addd812016-02-02 17:17:23 -070017495 VkImage image_bad;
17496 VkImage image_good;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017497 // One bad format and one good format for Color attachment
Tony Barbourf887b162017-03-09 10:06:46 -070017498 const VkFormat tex_format_bad = depth_format;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017499 const VkFormat tex_format_good = VK_FORMAT_B8G8R8A8_UNORM;
Karl Schultz6addd812016-02-02 17:17:23 -070017500 const int32_t tex_width = 32;
17501 const int32_t tex_height = 32;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017502
17503 VkImageCreateInfo image_create_info = {};
Karl Schultz6addd812016-02-02 17:17:23 -070017504 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17505 image_create_info.pNext = NULL;
17506 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17507 image_create_info.format = tex_format_bad;
17508 image_create_info.extent.width = tex_width;
17509 image_create_info.extent.height = tex_height;
17510 image_create_info.extent.depth = 1;
17511 image_create_info.mipLevels = 1;
17512 image_create_info.arrayLayers = 1;
17513 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17514 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017515 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT;
Karl Schultz6addd812016-02-02 17:17:23 -070017516 image_create_info.flags = 0;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017517
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017518 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_bad);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017519 ASSERT_VK_SUCCESS(err);
17520 image_create_info.format = tex_format_good;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017521 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT | VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
17522 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image_good);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017523 ASSERT_VK_SUCCESS(err);
17524
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017525 // ---Bind image memory---
17526 VkMemoryRequirements img_mem_reqs;
17527 vkGetImageMemoryRequirements(m_device->device(), image_bad, &img_mem_reqs);
17528 VkMemoryAllocateInfo image_alloc_info = {};
17529 image_alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
17530 image_alloc_info.pNext = NULL;
17531 image_alloc_info.memoryTypeIndex = 0;
17532 image_alloc_info.allocationSize = img_mem_reqs.size;
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017533 bool pass =
17534 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 -070017535 ASSERT_TRUE(pass);
17536 VkDeviceMemory mem;
17537 err = vkAllocateMemory(m_device->device(), &image_alloc_info, NULL, &mem);
17538 ASSERT_VK_SUCCESS(err);
17539 err = vkBindImageMemory(m_device->device(), image_bad, mem, 0);
17540 ASSERT_VK_SUCCESS(err);
17541 // -----------------------
17542
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017543 VkImageViewCreateInfo image_view_create_info = {};
Chris Forbes53bef902016-11-28 17:53:04 +130017544 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
Karl Schultz6addd812016-02-02 17:17:23 -070017545 image_view_create_info.image = image_bad;
17546 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
17547 image_view_create_info.format = tex_format_bad;
17548 image_view_create_info.subresourceRange.baseArrayLayer = 0;
17549 image_view_create_info.subresourceRange.baseMipLevel = 0;
17550 image_view_create_info.subresourceRange.layerCount = 1;
17551 image_view_create_info.subresourceRange.levelCount = 1;
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017552 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT | VK_IMAGE_ASPECT_DEPTH_BIT;
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017553
17554 VkImageView view;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017555 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
Mark Lobodzinski8507f2f2015-10-29 09:02:49 -060017556
Chris Forbes8f36a8a2016-04-07 13:21:07 +120017557 m_errorMonitor->VerifyFound();
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017558
Chia-I Wuf7458c52015-10-26 21:10:41 +080017559 vkDestroyImage(m_device->device(), image_bad, NULL);
17560 vkDestroyImage(m_device->device(), image_good, NULL);
Chia-I Wuf7458c52015-10-26 21:10:41 +080017561 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
17562 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
Rene Lindsayf1e89c82016-12-28 13:18:31 -070017563
17564 vkFreeMemory(m_device->device(), mem, NULL);
Tobin Ehlisa1c28562015-10-23 16:00:08 -060017565}
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017566
17567TEST_F(VkLayerTest, ClearImageErrors) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017568 TEST_DESCRIPTION(
17569 "Call ClearColorImage w/ a depth|stencil image and "
17570 "ClearDepthStencilImage with a color image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017571
17572 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf887b162017-03-09 10:06:46 -070017573 auto depth_format = find_depth_stencil_format(m_device);
17574 if (!depth_format) {
17575 return;
17576 }
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017577 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
17578
Tony Barbour552f6c02016-12-21 14:34:07 -070017579 m_commandBuffer->BeginCommandBuffer();
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017580
17581 // Color image
17582 VkClearColorValue clear_color;
17583 memset(clear_color.uint32, 0, sizeof(uint32_t) * 4);
17584 VkMemoryPropertyFlags reqs = VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT;
17585 const VkFormat color_format = VK_FORMAT_B8G8R8A8_UNORM;
17586 const int32_t img_width = 32;
17587 const int32_t img_height = 32;
17588 VkImageCreateInfo image_create_info = {};
17589 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
17590 image_create_info.pNext = NULL;
17591 image_create_info.imageType = VK_IMAGE_TYPE_2D;
17592 image_create_info.format = color_format;
17593 image_create_info.extent.width = img_width;
17594 image_create_info.extent.height = img_height;
17595 image_create_info.extent.depth = 1;
17596 image_create_info.mipLevels = 1;
17597 image_create_info.arrayLayers = 1;
17598 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
17599 image_create_info.tiling = VK_IMAGE_TILING_LINEAR;
17600 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
17601
17602 vk_testing::Image color_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017603 color_image.init(*m_device, (const VkImageCreateInfo &)image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017604
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017605 const VkImageSubresourceRange color_range = vk_testing::Image::subresource_range(image_create_info, VK_IMAGE_ASPECT_COLOR_BIT);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017606
17607 // Depth/Stencil image
17608 VkClearDepthStencilValue clear_value = {0};
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017609 reqs = 0; // don't need HOST_VISIBLE DS image
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017610 VkImageCreateInfo ds_image_create_info = vk_testing::Image::create_info();
17611 ds_image_create_info.imageType = VK_IMAGE_TYPE_2D;
Tony Barbourf887b162017-03-09 10:06:46 -070017612 ds_image_create_info.format = depth_format;
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017613 ds_image_create_info.extent.width = 64;
17614 ds_image_create_info.extent.height = 64;
17615 ds_image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070017616 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 -060017617
17618 vk_testing::Image ds_image;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017619 ds_image.init(*m_device, (const VkImageCreateInfo &)ds_image_create_info, reqs);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017620
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017621 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 -060017622
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017623 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "vkCmdClearColorImage called with depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017624
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017625 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), ds_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017626 &color_range);
17627
17628 m_errorMonitor->VerifyFound();
17629
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017630 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17631 "vkCmdClearColorImage called with "
17632 "image created without "
17633 "VK_IMAGE_USAGE_TRANSFER_DST_BIT");
Tony Barbour26434b92016-06-02 09:43:50 -060017634
Rene Lindsaya1fc64a2016-12-27 15:18:54 -070017635 vkCmdClearColorImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_GENERAL, &clear_color, 1,
Tony Barbour26434b92016-06-02 09:43:50 -060017636 &color_range);
17637
17638 m_errorMonitor->VerifyFound();
17639
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017640 // Call CmdClearDepthStencilImage with color image
Mark Lobodzinskice751c62016-09-08 10:45:35 -060017641 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17642 "vkCmdClearDepthStencilImage called without a depth/stencil image.");
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017643
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070017644 vkCmdClearDepthStencilImage(m_commandBuffer->GetBufferHandle(), color_image.handle(), VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL,
17645 &clear_value, 1, &ds_range);
Tobin Ehlis6e23d772016-05-19 11:08:34 -060017646
17647 m_errorMonitor->VerifyFound();
17648}
Tobin Ehliscde08892015-09-22 10:11:37 -060017649
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017650// WSI Enabled Tests
17651//
Chris Forbes09368e42016-10-13 11:59:22 +130017652#if 0
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017653TEST_F(VkWsiEnabledLayerTest, TestEnabledWsi) {
17654
17655#if defined(VK_USE_PLATFORM_XCB_KHR)
17656 VkSurfaceKHR surface = VK_NULL_HANDLE;
17657
17658 VkResult err;
17659 bool pass;
17660 VkSwapchainKHR swapchain = VK_NULL_HANDLE;
17661 VkSwapchainCreateInfoKHR swapchain_create_info = {};
17662 // uint32_t swapchain_image_count = 0;
17663 // VkImage swapchain_images[1] = {VK_NULL_HANDLE};
17664 // uint32_t image_index = 0;
17665 // VkPresentInfoKHR present_info = {};
17666
17667 ASSERT_NO_FATAL_FAILURE(InitState());
17668
17669 // Use the create function from one of the VK_KHR_*_surface extension in
17670 // order to create a surface, testing all known errors in the process,
17671 // before successfully creating a surface:
17672 // First, try to create a surface without a VkXcbSurfaceCreateInfoKHR:
17673 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo specified as NULL");
17674 err = vkCreateXcbSurfaceKHR(instance(), NULL, NULL, &surface);
17675 pass = (err != VK_SUCCESS);
17676 ASSERT_TRUE(pass);
17677 m_errorMonitor->VerifyFound();
17678
17679 // Next, try to create a surface with the wrong
17680 // VkXcbSurfaceCreateInfoKHR::sType:
17681 VkXcbSurfaceCreateInfoKHR xcb_create_info = {};
17682 xcb_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
17683 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
17684 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
17685 pass = (err != VK_SUCCESS);
17686 ASSERT_TRUE(pass);
17687 m_errorMonitor->VerifyFound();
17688
17689 // Create a native window, and then correctly create a surface:
17690 xcb_connection_t *connection;
17691 xcb_screen_t *screen;
17692 xcb_window_t xcb_window;
17693 xcb_intern_atom_reply_t *atom_wm_delete_window;
17694
17695 const xcb_setup_t *setup;
17696 xcb_screen_iterator_t iter;
17697 int scr;
17698 uint32_t value_mask, value_list[32];
17699 int width = 1;
17700 int height = 1;
17701
17702 connection = xcb_connect(NULL, &scr);
17703 ASSERT_TRUE(connection != NULL);
17704 setup = xcb_get_setup(connection);
17705 iter = xcb_setup_roots_iterator(setup);
17706 while (scr-- > 0)
17707 xcb_screen_next(&iter);
17708 screen = iter.data;
17709
17710 xcb_window = xcb_generate_id(connection);
17711
17712 value_mask = XCB_CW_BACK_PIXEL | XCB_CW_EVENT_MASK;
17713 value_list[0] = screen->black_pixel;
17714 value_list[1] = XCB_EVENT_MASK_KEY_RELEASE | XCB_EVENT_MASK_EXPOSURE | XCB_EVENT_MASK_STRUCTURE_NOTIFY;
17715
17716 xcb_create_window(connection, XCB_COPY_FROM_PARENT, xcb_window, screen->root, 0, 0, width, height, 0,
17717 XCB_WINDOW_CLASS_INPUT_OUTPUT, screen->root_visual, value_mask, value_list);
17718
17719 /* Magic code that will send notification when window is destroyed */
17720 xcb_intern_atom_cookie_t cookie = xcb_intern_atom(connection, 1, 12, "WM_PROTOCOLS");
17721 xcb_intern_atom_reply_t *reply = xcb_intern_atom_reply(connection, cookie, 0);
17722
17723 xcb_intern_atom_cookie_t cookie2 = xcb_intern_atom(connection, 0, 16, "WM_DELETE_WINDOW");
17724 atom_wm_delete_window = xcb_intern_atom_reply(connection, cookie2, 0);
17725 xcb_change_property(connection, XCB_PROP_MODE_REPLACE, xcb_window, (*reply).atom, 4, 32, 1, &(*atom_wm_delete_window).atom);
17726 free(reply);
17727
17728 xcb_map_window(connection, xcb_window);
17729
17730 // Force the x/y coordinates to 100,100 results are identical in consecutive
17731 // runs
17732 const uint32_t coords[] = { 100, 100 };
17733 xcb_configure_window(connection, xcb_window, XCB_CONFIG_WINDOW_X | XCB_CONFIG_WINDOW_Y, coords);
17734
17735 // Finally, try to correctly create a surface:
17736 xcb_create_info.sType = VK_STRUCTURE_TYPE_XCB_SURFACE_CREATE_INFO_KHR;
17737 xcb_create_info.pNext = NULL;
17738 xcb_create_info.flags = 0;
17739 xcb_create_info.connection = connection;
17740 xcb_create_info.window = xcb_window;
17741 err = vkCreateXcbSurfaceKHR(instance(), &xcb_create_info, NULL, &surface);
17742 pass = (err == VK_SUCCESS);
17743 ASSERT_TRUE(pass);
17744
17745 // Check if surface supports presentation:
17746
17747 // 1st, do so without having queried the queue families:
17748 VkBool32 supported = false;
17749 // TODO: Get the following error to come out:
17750 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17751 "called before calling the vkGetPhysicalDeviceQueueFamilyProperties "
17752 "function");
17753 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
17754 pass = (err != VK_SUCCESS);
17755 // ASSERT_TRUE(pass);
17756 // m_errorMonitor->VerifyFound();
17757
17758 // Next, query a queue family index that's too large:
17759 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
17760 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 100000, surface, &supported);
17761 pass = (err != VK_SUCCESS);
17762 ASSERT_TRUE(pass);
17763 m_errorMonitor->VerifyFound();
17764
17765 // Finally, do so correctly:
17766 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
17767 // SUPPORTED
17768 err = vkGetPhysicalDeviceSurfaceSupportKHR(gpu(), 0, surface, &supported);
17769 pass = (err == VK_SUCCESS);
17770 ASSERT_TRUE(pass);
17771
17772 // Before proceeding, try to create a swapchain without having called
17773 // vkGetPhysicalDeviceSurfaceCapabilitiesKHR():
17774 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
17775 swapchain_create_info.pNext = NULL;
17776 swapchain_create_info.flags = 0;
17777 swapchain_create_info.imageUsage = VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT;
17778 swapchain_create_info.surface = surface;
17779 swapchain_create_info.imageArrayLayers = 1;
17780 swapchain_create_info.preTransform = VK_SURFACE_TRANSFORM_IDENTITY_BIT_KHR;
17781 swapchain_create_info.compositeAlpha = VK_COMPOSITE_ALPHA_OPAQUE_BIT_KHR;
17782 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17783 "called before calling vkGetPhysicalDeviceSurfaceCapabilitiesKHR().");
17784 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
17785 pass = (err != VK_SUCCESS);
17786 ASSERT_TRUE(pass);
17787 m_errorMonitor->VerifyFound();
17788
17789 // Get the surface capabilities:
17790 VkSurfaceCapabilitiesKHR surface_capabilities;
17791
17792 // Do so correctly (only error logged by this entrypoint is if the
17793 // extension isn't enabled):
17794 err = vkGetPhysicalDeviceSurfaceCapabilitiesKHR(gpu(), surface, &surface_capabilities);
17795 pass = (err == VK_SUCCESS);
17796 ASSERT_TRUE(pass);
17797
17798 // Get the surface formats:
17799 uint32_t surface_format_count;
17800
17801 // First, try without a pointer to surface_format_count:
17802 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSurfaceFormatCount "
17803 "specified as NULL");
17804 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, NULL, NULL);
17805 pass = (err == VK_SUCCESS);
17806 ASSERT_TRUE(pass);
17807 m_errorMonitor->VerifyFound();
17808
17809 // Next, call with a non-NULL pSurfaceFormats, even though we haven't
17810 // correctly done a 1st try (to get the count):
17811 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
17812 surface_format_count = 0;
17813 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, (VkSurfaceFormatKHR *)&surface_format_count);
17814 pass = (err == VK_SUCCESS);
17815 ASSERT_TRUE(pass);
17816 m_errorMonitor->VerifyFound();
17817
17818 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
17819 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
17820 pass = (err == VK_SUCCESS);
17821 ASSERT_TRUE(pass);
17822
17823 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
17824 VkSurfaceFormatKHR *surface_formats = (VkSurfaceFormatKHR *)malloc(surface_format_count * sizeof(VkSurfaceFormatKHR));
17825
17826 // Next, do a 2nd try with surface_format_count being set too high:
17827 surface_format_count += 5;
17828 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
17829 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
17830 pass = (err == VK_SUCCESS);
17831 ASSERT_TRUE(pass);
17832 m_errorMonitor->VerifyFound();
17833
17834 // Finally, do a correct 1st and 2nd try:
17835 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, NULL);
17836 pass = (err == VK_SUCCESS);
17837 ASSERT_TRUE(pass);
17838 vkGetPhysicalDeviceSurfaceFormatsKHR(gpu(), surface, &surface_format_count, surface_formats);
17839 pass = (err == VK_SUCCESS);
17840 ASSERT_TRUE(pass);
17841
17842 // Get the surface present modes:
17843 uint32_t surface_present_mode_count;
17844
17845 // First, try without a pointer to surface_format_count:
17846 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pPresentModeCount "
17847 "specified as NULL");
17848
17849 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, NULL, NULL);
17850 pass = (err == VK_SUCCESS);
17851 ASSERT_TRUE(pass);
17852 m_errorMonitor->VerifyFound();
17853
17854 // Next, call with a non-NULL VkPresentModeKHR, even though we haven't
17855 // correctly done a 1st try (to get the count):
17856 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_WARNING_BIT_EXT, "but no prior positive value has been seen for");
17857 surface_present_mode_count = 0;
17858 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count,
17859 (VkPresentModeKHR *)&surface_present_mode_count);
17860 pass = (err == VK_SUCCESS);
17861 ASSERT_TRUE(pass);
17862 m_errorMonitor->VerifyFound();
17863
17864 // Next, correctly do a 1st try (with a NULL pointer to surface_formats):
17865 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
17866 pass = (err == VK_SUCCESS);
17867 ASSERT_TRUE(pass);
17868
17869 // Allocate memory for the correct number of VkSurfaceFormatKHR's:
17870 VkPresentModeKHR *surface_present_modes = (VkPresentModeKHR *)malloc(surface_present_mode_count * sizeof(VkPresentModeKHR));
17871
17872 // Next, do a 2nd try with surface_format_count being set too high:
17873 surface_present_mode_count += 5;
17874 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "that is greater than the value");
17875 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
17876 pass = (err == VK_SUCCESS);
17877 ASSERT_TRUE(pass);
17878 m_errorMonitor->VerifyFound();
17879
17880 // Finally, do a correct 1st and 2nd try:
17881 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, NULL);
17882 pass = (err == VK_SUCCESS);
17883 ASSERT_TRUE(pass);
17884 vkGetPhysicalDeviceSurfacePresentModesKHR(gpu(), surface, &surface_present_mode_count, surface_present_modes);
17885 pass = (err == VK_SUCCESS);
17886 ASSERT_TRUE(pass);
17887
17888 // Create a swapchain:
17889
17890 // First, try without a pointer to swapchain_create_info:
17891 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pCreateInfo "
17892 "specified as NULL");
17893
17894 err = vkCreateSwapchainKHR(m_device->device(), NULL, NULL, &swapchain);
17895 pass = (err != VK_SUCCESS);
17896 ASSERT_TRUE(pass);
17897 m_errorMonitor->VerifyFound();
17898
17899 // Next, call with a non-NULL swapchain_create_info, that has the wrong
17900 // sType:
17901 swapchain_create_info.sType = VK_STRUCTURE_TYPE_APPLICATION_INFO;
17902 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "parameter pCreateInfo->sType must be");
17903
17904 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
17905 pass = (err != VK_SUCCESS);
17906 ASSERT_TRUE(pass);
17907 m_errorMonitor->VerifyFound();
17908
17909 // Next, call with a NULL swapchain pointer:
17910 swapchain_create_info.sType = VK_STRUCTURE_TYPE_SWAPCHAIN_CREATE_INFO_KHR;
17911 swapchain_create_info.pNext = NULL;
17912 swapchain_create_info.flags = 0;
17913 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "required parameter pSwapchain "
17914 "specified as NULL");
17915
17916 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, NULL);
17917 pass = (err != VK_SUCCESS);
17918 ASSERT_TRUE(pass);
17919 m_errorMonitor->VerifyFound();
17920
17921 // TODO: Enhance swapchain layer so that
17922 // swapchain_create_info.queueFamilyIndexCount is checked against something?
17923
17924 // Next, call with a queue family index that's too large:
17925 uint32_t queueFamilyIndex[2] = { 100000, 0 };
17926 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
17927 swapchain_create_info.queueFamilyIndexCount = 2;
17928 swapchain_create_info.pQueueFamilyIndices = queueFamilyIndex;
17929 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, "called with a queueFamilyIndex that is too large");
17930 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
17931 pass = (err != VK_SUCCESS);
17932 ASSERT_TRUE(pass);
17933 m_errorMonitor->VerifyFound();
17934
17935 // Next, call a queueFamilyIndexCount that's too small for CONCURRENT:
17936 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_CONCURRENT;
17937 swapchain_create_info.queueFamilyIndexCount = 1;
17938 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17939 "but with a bad value(s) for pCreateInfo->queueFamilyIndexCount or "
17940 "pCreateInfo->pQueueFamilyIndices).");
17941 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
17942 pass = (err != VK_SUCCESS);
17943 ASSERT_TRUE(pass);
17944 m_errorMonitor->VerifyFound();
17945
17946 // Next, call with an invalid imageSharingMode:
17947 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_MAX_ENUM;
17948 swapchain_create_info.queueFamilyIndexCount = 1;
17949 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
17950 "called with a non-supported pCreateInfo->imageSharingMode (i.e.");
17951 err = vkCreateSwapchainKHR(m_device->device(), &swapchain_create_info, NULL, &swapchain);
17952 pass = (err != VK_SUCCESS);
17953 ASSERT_TRUE(pass);
17954 m_errorMonitor->VerifyFound();
17955 // Fix for the future:
17956 // FIXME: THIS ISN'T CORRECT--MUST QUERY UNTIL WE FIND A QUEUE FAMILY THAT'S
17957 // SUPPORTED
17958 swapchain_create_info.queueFamilyIndexCount = 0;
17959 queueFamilyIndex[0] = 0;
17960 swapchain_create_info.imageSharingMode = VK_SHARING_MODE_EXCLUSIVE;
17961
17962 // TODO: CONTINUE TESTING VALIDATION OF vkCreateSwapchainKHR() ...
17963 // Get the images from a swapchain:
17964 // Acquire an image from a swapchain:
17965 // Present an image to a swapchain:
17966 // Destroy the swapchain:
17967
17968 // TODOs:
17969 //
17970 // - Try destroying the device without first destroying the swapchain
17971 //
17972 // - Try destroying the device without first destroying the surface
17973 //
17974 // - Try destroying the surface without first destroying the swapchain
17975
17976 // Destroy the surface:
17977 vkDestroySurfaceKHR(instance(), surface, NULL);
17978
17979 // Tear down the window:
17980 xcb_destroy_window(connection, xcb_window);
17981 xcb_disconnect(connection);
17982
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017983#else // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017984 return;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070017985#endif // VK_USE_PLATFORM_XCB_KHR
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017986}
Chris Forbes09368e42016-10-13 11:59:22 +130017987#endif
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060017988
17989//
17990// POSITIVE VALIDATION TESTS
17991//
17992// These tests do not expect to encounter ANY validation errors pass only if this is true
17993
Mark Lobodzinski781aeb52017-02-22 10:57:53 -070017994TEST_F(VkPositiveLayerTest, SecondaryCommandBufferClearColorAttachments) {
17995 TEST_DESCRIPTION("Create a secondary command buffer and record a CmdClearAttachments call into it");
17996 ASSERT_NO_FATAL_FAILURE(InitState());
17997 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
17998
17999 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18000 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18001 command_buffer_allocate_info.commandPool = m_commandPool;
18002 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18003 command_buffer_allocate_info.commandBufferCount = 1;
18004
18005 VkCommandBuffer secondary_command_buffer;
18006 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18007 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18008 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18009 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18010 command_buffer_inheritance_info.renderPass = m_renderPass;
18011 command_buffer_inheritance_info.framebuffer = m_framebuffer;
18012
18013 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18014 command_buffer_begin_info.flags =
18015 VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT | VK_COMMAND_BUFFER_USAGE_RENDER_PASS_CONTINUE_BIT;
18016 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18017
18018 vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18019 VkClearAttachment color_attachment;
18020 color_attachment.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18021 color_attachment.clearValue.color.float32[0] = 0;
18022 color_attachment.clearValue.color.float32[1] = 0;
18023 color_attachment.clearValue.color.float32[2] = 0;
18024 color_attachment.clearValue.color.float32[3] = 0;
18025 color_attachment.colorAttachment = 0;
18026 VkClearRect clear_rect = {{{0, 0}, {32, 32}}};
18027 vkCmdClearAttachments(secondary_command_buffer, 1, &color_attachment, 1, &clear_rect);
18028}
18029
Tobin Ehlise0006882016-11-03 10:14:28 -060018030TEST_F(VkPositiveLayerTest, SecondaryCommandBufferImageLayoutTransitions) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018031 TEST_DESCRIPTION(
18032 "Perform an image layout transition in a secondary command buffer followed "
18033 "by a transition in the primary.");
Tobin Ehlise0006882016-11-03 10:14:28 -060018034 VkResult err;
18035 m_errorMonitor->ExpectSuccess();
18036 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf887b162017-03-09 10:06:46 -070018037 auto depth_format = find_depth_stencil_format(m_device);
18038 if (!depth_format) {
18039 return;
18040 }
Tobin Ehlise0006882016-11-03 10:14:28 -060018041 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
18042 // Allocate a secondary and primary cmd buffer
18043 VkCommandBufferAllocateInfo command_buffer_allocate_info = {};
18044 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18045 command_buffer_allocate_info.commandPool = m_commandPool;
18046 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
18047 command_buffer_allocate_info.commandBufferCount = 1;
18048
18049 VkCommandBuffer secondary_command_buffer;
18050 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer));
18051 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18052 VkCommandBuffer primary_command_buffer;
18053 ASSERT_VK_SUCCESS(vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &primary_command_buffer));
18054 VkCommandBufferBeginInfo command_buffer_begin_info = {};
18055 VkCommandBufferInheritanceInfo command_buffer_inheritance_info = {};
18056 command_buffer_inheritance_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
18057 command_buffer_begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18058 command_buffer_begin_info.flags = VK_COMMAND_BUFFER_USAGE_ONE_TIME_SUBMIT_BIT;
18059 command_buffer_begin_info.pInheritanceInfo = &command_buffer_inheritance_info;
18060
18061 err = vkBeginCommandBuffer(secondary_command_buffer, &command_buffer_begin_info);
18062 ASSERT_VK_SUCCESS(err);
18063 VkImageObj image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -070018064 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 -060018065 ASSERT_TRUE(image.initialized());
18066 VkImageMemoryBarrier img_barrier = {};
18067 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18068 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18069 img_barrier.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18070 img_barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
18071 img_barrier.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18072 img_barrier.image = image.handle();
18073 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18074 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18075 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18076 img_barrier.subresourceRange.baseArrayLayer = 0;
18077 img_barrier.subresourceRange.baseMipLevel = 0;
18078 img_barrier.subresourceRange.layerCount = 1;
18079 img_barrier.subresourceRange.levelCount = 1;
18080 vkCmdPipelineBarrier(secondary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr,
18081 0, nullptr, 1, &img_barrier);
18082 err = vkEndCommandBuffer(secondary_command_buffer);
18083 ASSERT_VK_SUCCESS(err);
18084
18085 // Now update primary cmd buffer to execute secondary and transitions image
18086 command_buffer_begin_info.pInheritanceInfo = nullptr;
18087 err = vkBeginCommandBuffer(primary_command_buffer, &command_buffer_begin_info);
18088 ASSERT_VK_SUCCESS(err);
18089 vkCmdExecuteCommands(primary_command_buffer, 1, &secondary_command_buffer);
18090 VkImageMemoryBarrier img_barrier2 = {};
18091 img_barrier2.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18092 img_barrier2.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18093 img_barrier2.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
18094 img_barrier2.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18095 img_barrier2.newLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
18096 img_barrier2.image = image.handle();
18097 img_barrier2.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18098 img_barrier2.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18099 img_barrier2.subresourceRange.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
18100 img_barrier2.subresourceRange.baseArrayLayer = 0;
18101 img_barrier2.subresourceRange.baseMipLevel = 0;
18102 img_barrier2.subresourceRange.layerCount = 1;
18103 img_barrier2.subresourceRange.levelCount = 1;
18104 vkCmdPipelineBarrier(primary_command_buffer, VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_VERTEX_SHADER_BIT, 0, 0, nullptr, 0,
18105 nullptr, 1, &img_barrier2);
18106 err = vkEndCommandBuffer(primary_command_buffer);
18107 ASSERT_VK_SUCCESS(err);
18108 VkSubmitInfo submit_info = {};
18109 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
18110 submit_info.commandBufferCount = 1;
18111 submit_info.pCommandBuffers = &primary_command_buffer;
18112 err = vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
18113 ASSERT_VK_SUCCESS(err);
18114 m_errorMonitor->VerifyNotFound();
18115 err = vkDeviceWaitIdle(m_device->device());
18116 ASSERT_VK_SUCCESS(err);
18117 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &secondary_command_buffer);
18118 vkFreeCommandBuffers(m_device->device(), m_commandPool, 1, &primary_command_buffer);
18119}
18120
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018121// This is a positive test. No failures are expected.
18122TEST_F(VkPositiveLayerTest, IgnoreUnrelatedDescriptor) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018123 TEST_DESCRIPTION(
18124 "Ensure that the vkUpdateDescriptorSets validation code "
18125 "is ignoring VkWriteDescriptorSet members that are not "
18126 "related to the descriptor type specified by "
18127 "VkWriteDescriptorSet::descriptorType. Correct "
18128 "validation behavior will result in the test running to "
18129 "completion without validation errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018130
18131 const uintptr_t invalid_ptr = 0xcdcdcdcd;
18132
18133 ASSERT_NO_FATAL_FAILURE(InitState());
18134
18135 // Image Case
18136 {
18137 m_errorMonitor->ExpectSuccess();
18138
18139 VkImage image;
18140 const VkFormat tex_format = VK_FORMAT_B8G8R8A8_UNORM;
18141 const int32_t tex_width = 32;
18142 const int32_t tex_height = 32;
18143 VkImageCreateInfo image_create_info = {};
18144 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18145 image_create_info.pNext = NULL;
18146 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18147 image_create_info.format = tex_format;
18148 image_create_info.extent.width = tex_width;
18149 image_create_info.extent.height = tex_height;
18150 image_create_info.extent.depth = 1;
18151 image_create_info.mipLevels = 1;
18152 image_create_info.arrayLayers = 1;
18153 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
18154 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
18155 image_create_info.usage = VK_IMAGE_USAGE_SAMPLED_BIT;
18156 image_create_info.flags = 0;
18157 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
18158 ASSERT_VK_SUCCESS(err);
18159
18160 VkMemoryRequirements memory_reqs;
18161 VkDeviceMemory image_memory;
18162 bool pass;
18163 VkMemoryAllocateInfo memory_info = {};
18164 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18165 memory_info.pNext = NULL;
18166 memory_info.allocationSize = 0;
18167 memory_info.memoryTypeIndex = 0;
18168 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
18169 memory_info.allocationSize = memory_reqs.size;
18170 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18171 ASSERT_TRUE(pass);
18172 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &image_memory);
18173 ASSERT_VK_SUCCESS(err);
18174 err = vkBindImageMemory(m_device->device(), image, image_memory, 0);
18175 ASSERT_VK_SUCCESS(err);
18176
18177 VkImageViewCreateInfo image_view_create_info = {};
18178 image_view_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
18179 image_view_create_info.image = image;
18180 image_view_create_info.viewType = VK_IMAGE_VIEW_TYPE_2D;
18181 image_view_create_info.format = tex_format;
18182 image_view_create_info.subresourceRange.layerCount = 1;
18183 image_view_create_info.subresourceRange.baseMipLevel = 0;
18184 image_view_create_info.subresourceRange.levelCount = 1;
18185 image_view_create_info.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18186
18187 VkImageView view;
18188 err = vkCreateImageView(m_device->device(), &image_view_create_info, NULL, &view);
18189 ASSERT_VK_SUCCESS(err);
18190
18191 VkDescriptorPoolSize ds_type_count = {};
18192 ds_type_count.type = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18193 ds_type_count.descriptorCount = 1;
18194
18195 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18196 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18197 ds_pool_ci.pNext = NULL;
18198 ds_pool_ci.maxSets = 1;
18199 ds_pool_ci.poolSizeCount = 1;
18200 ds_pool_ci.pPoolSizes = &ds_type_count;
18201
18202 VkDescriptorPool ds_pool;
18203 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18204 ASSERT_VK_SUCCESS(err);
18205
18206 VkDescriptorSetLayoutBinding dsl_binding = {};
18207 dsl_binding.binding = 0;
18208 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18209 dsl_binding.descriptorCount = 1;
18210 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18211 dsl_binding.pImmutableSamplers = NULL;
18212
18213 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18214 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18215 ds_layout_ci.pNext = NULL;
18216 ds_layout_ci.bindingCount = 1;
18217 ds_layout_ci.pBindings = &dsl_binding;
18218 VkDescriptorSetLayout ds_layout;
18219 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18220 ASSERT_VK_SUCCESS(err);
18221
18222 VkDescriptorSet descriptor_set;
18223 VkDescriptorSetAllocateInfo alloc_info = {};
18224 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18225 alloc_info.descriptorSetCount = 1;
18226 alloc_info.descriptorPool = ds_pool;
18227 alloc_info.pSetLayouts = &ds_layout;
18228 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18229 ASSERT_VK_SUCCESS(err);
18230
18231 VkDescriptorImageInfo image_info = {};
18232 image_info.imageView = view;
18233 image_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
18234
18235 VkWriteDescriptorSet descriptor_write;
18236 memset(&descriptor_write, 0, sizeof(descriptor_write));
18237 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18238 descriptor_write.dstSet = descriptor_set;
18239 descriptor_write.dstBinding = 0;
18240 descriptor_write.descriptorCount = 1;
18241 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE;
18242 descriptor_write.pImageInfo = &image_info;
18243
18244 // Set pBufferInfo and pTexelBufferView to invalid values, which should
18245 // be
18246 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE.
18247 // This will most likely produce a crash if the parameter_validation
18248 // layer
18249 // does not correctly ignore pBufferInfo.
18250 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18251 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18252
18253 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18254
18255 m_errorMonitor->VerifyNotFound();
18256
18257 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18258 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18259 vkDestroyImageView(m_device->device(), view, NULL);
18260 vkDestroyImage(m_device->device(), image, NULL);
18261 vkFreeMemory(m_device->device(), image_memory, NULL);
18262 }
18263
18264 // Buffer Case
18265 {
18266 m_errorMonitor->ExpectSuccess();
18267
18268 VkBuffer buffer;
18269 uint32_t queue_family_index = 0;
18270 VkBufferCreateInfo buffer_create_info = {};
18271 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18272 buffer_create_info.size = 1024;
18273 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18274 buffer_create_info.queueFamilyIndexCount = 1;
18275 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18276
18277 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18278 ASSERT_VK_SUCCESS(err);
18279
18280 VkMemoryRequirements memory_reqs;
18281 VkDeviceMemory buffer_memory;
18282 bool pass;
18283 VkMemoryAllocateInfo memory_info = {};
18284 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18285 memory_info.pNext = NULL;
18286 memory_info.allocationSize = 0;
18287 memory_info.memoryTypeIndex = 0;
18288
18289 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18290 memory_info.allocationSize = memory_reqs.size;
18291 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18292 ASSERT_TRUE(pass);
18293
18294 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18295 ASSERT_VK_SUCCESS(err);
18296 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18297 ASSERT_VK_SUCCESS(err);
18298
18299 VkDescriptorPoolSize ds_type_count = {};
18300 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18301 ds_type_count.descriptorCount = 1;
18302
18303 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18304 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18305 ds_pool_ci.pNext = NULL;
18306 ds_pool_ci.maxSets = 1;
18307 ds_pool_ci.poolSizeCount = 1;
18308 ds_pool_ci.pPoolSizes = &ds_type_count;
18309
18310 VkDescriptorPool ds_pool;
18311 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18312 ASSERT_VK_SUCCESS(err);
18313
18314 VkDescriptorSetLayoutBinding dsl_binding = {};
18315 dsl_binding.binding = 0;
18316 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18317 dsl_binding.descriptorCount = 1;
18318 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18319 dsl_binding.pImmutableSamplers = NULL;
18320
18321 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18322 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18323 ds_layout_ci.pNext = NULL;
18324 ds_layout_ci.bindingCount = 1;
18325 ds_layout_ci.pBindings = &dsl_binding;
18326 VkDescriptorSetLayout ds_layout;
18327 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18328 ASSERT_VK_SUCCESS(err);
18329
18330 VkDescriptorSet descriptor_set;
18331 VkDescriptorSetAllocateInfo alloc_info = {};
18332 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18333 alloc_info.descriptorSetCount = 1;
18334 alloc_info.descriptorPool = ds_pool;
18335 alloc_info.pSetLayouts = &ds_layout;
18336 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18337 ASSERT_VK_SUCCESS(err);
18338
18339 VkDescriptorBufferInfo buffer_info = {};
18340 buffer_info.buffer = buffer;
18341 buffer_info.offset = 0;
18342 buffer_info.range = 1024;
18343
18344 VkWriteDescriptorSet descriptor_write;
18345 memset(&descriptor_write, 0, sizeof(descriptor_write));
18346 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18347 descriptor_write.dstSet = descriptor_set;
18348 descriptor_write.dstBinding = 0;
18349 descriptor_write.descriptorCount = 1;
18350 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18351 descriptor_write.pBufferInfo = &buffer_info;
18352
18353 // Set pImageInfo and pTexelBufferView to invalid values, which should
18354 // be
18355 // ignored for descriptorType == VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER.
18356 // This will most likely produce a crash if the parameter_validation
18357 // layer
18358 // does not correctly ignore pImageInfo.
18359 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18360 descriptor_write.pTexelBufferView = reinterpret_cast<const VkBufferView *>(invalid_ptr);
18361
18362 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18363
18364 m_errorMonitor->VerifyNotFound();
18365
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018366 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18367 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18368 vkDestroyBuffer(m_device->device(), buffer, NULL);
18369 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18370 }
18371
18372 // Texel Buffer Case
18373 {
18374 m_errorMonitor->ExpectSuccess();
18375
18376 VkBuffer buffer;
18377 uint32_t queue_family_index = 0;
18378 VkBufferCreateInfo buffer_create_info = {};
18379 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18380 buffer_create_info.size = 1024;
18381 buffer_create_info.usage = VK_BUFFER_USAGE_STORAGE_TEXEL_BUFFER_BIT;
18382 buffer_create_info.queueFamilyIndexCount = 1;
18383 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
18384
18385 VkResult err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
18386 ASSERT_VK_SUCCESS(err);
18387
18388 VkMemoryRequirements memory_reqs;
18389 VkDeviceMemory buffer_memory;
18390 bool pass;
18391 VkMemoryAllocateInfo memory_info = {};
18392 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18393 memory_info.pNext = NULL;
18394 memory_info.allocationSize = 0;
18395 memory_info.memoryTypeIndex = 0;
18396
18397 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
18398 memory_info.allocationSize = memory_reqs.size;
18399 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
18400 ASSERT_TRUE(pass);
18401
18402 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
18403 ASSERT_VK_SUCCESS(err);
18404 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
18405 ASSERT_VK_SUCCESS(err);
18406
18407 VkBufferViewCreateInfo buff_view_ci = {};
18408 buff_view_ci.sType = VK_STRUCTURE_TYPE_BUFFER_VIEW_CREATE_INFO;
18409 buff_view_ci.buffer = buffer;
18410 buff_view_ci.format = VK_FORMAT_R8_UNORM;
18411 buff_view_ci.range = VK_WHOLE_SIZE;
18412 VkBufferView buffer_view;
18413 err = vkCreateBufferView(m_device->device(), &buff_view_ci, NULL, &buffer_view);
18414
18415 VkDescriptorPoolSize ds_type_count = {};
18416 ds_type_count.type = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18417 ds_type_count.descriptorCount = 1;
18418
18419 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18420 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18421 ds_pool_ci.pNext = NULL;
18422 ds_pool_ci.maxSets = 1;
18423 ds_pool_ci.poolSizeCount = 1;
18424 ds_pool_ci.pPoolSizes = &ds_type_count;
18425
18426 VkDescriptorPool ds_pool;
18427 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18428 ASSERT_VK_SUCCESS(err);
18429
18430 VkDescriptorSetLayoutBinding dsl_binding = {};
18431 dsl_binding.binding = 0;
18432 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18433 dsl_binding.descriptorCount = 1;
18434 dsl_binding.stageFlags = VK_SHADER_STAGE_ALL;
18435 dsl_binding.pImmutableSamplers = NULL;
18436
18437 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18438 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18439 ds_layout_ci.pNext = NULL;
18440 ds_layout_ci.bindingCount = 1;
18441 ds_layout_ci.pBindings = &dsl_binding;
18442 VkDescriptorSetLayout ds_layout;
18443 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18444 ASSERT_VK_SUCCESS(err);
18445
18446 VkDescriptorSet descriptor_set;
18447 VkDescriptorSetAllocateInfo alloc_info = {};
18448 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18449 alloc_info.descriptorSetCount = 1;
18450 alloc_info.descriptorPool = ds_pool;
18451 alloc_info.pSetLayouts = &ds_layout;
18452 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18453 ASSERT_VK_SUCCESS(err);
18454
18455 VkWriteDescriptorSet descriptor_write;
18456 memset(&descriptor_write, 0, sizeof(descriptor_write));
18457 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18458 descriptor_write.dstSet = descriptor_set;
18459 descriptor_write.dstBinding = 0;
18460 descriptor_write.descriptorCount = 1;
18461 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER;
18462 descriptor_write.pTexelBufferView = &buffer_view;
18463
18464 // Set pImageInfo and pBufferInfo to invalid values, which should be
18465 // ignored for descriptorType ==
18466 // VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER.
18467 // This will most likely produce a crash if the parameter_validation
18468 // layer
18469 // does not correctly ignore pImageInfo and pBufferInfo.
18470 descriptor_write.pImageInfo = reinterpret_cast<const VkDescriptorImageInfo *>(invalid_ptr);
18471 descriptor_write.pBufferInfo = reinterpret_cast<const VkDescriptorBufferInfo *>(invalid_ptr);
18472
18473 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18474
18475 m_errorMonitor->VerifyNotFound();
18476
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018477 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18478 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18479 vkDestroyBufferView(m_device->device(), buffer_view, NULL);
18480 vkDestroyBuffer(m_device->device(), buffer, NULL);
18481 vkFreeMemory(m_device->device(), buffer_memory, NULL);
18482 }
18483}
18484
Tobin Ehlisf7428442016-10-25 07:58:24 -060018485TEST_F(VkLayerTest, DuplicateDescriptorBinding) {
18486 TEST_DESCRIPTION("Create a descriptor set layout with a duplicate binding number.");
18487
18488 ASSERT_NO_FATAL_FAILURE(InitState());
18489 // Create layout where two binding #s are "1"
18490 static const uint32_t NUM_BINDINGS = 3;
18491 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
18492 dsl_binding[0].binding = 1;
18493 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18494 dsl_binding[0].descriptorCount = 1;
18495 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18496 dsl_binding[0].pImmutableSamplers = NULL;
18497 dsl_binding[1].binding = 0;
18498 dsl_binding[1].descriptorCount = 1;
18499 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18500 dsl_binding[1].descriptorCount = 1;
18501 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18502 dsl_binding[1].pImmutableSamplers = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018503 dsl_binding[2].binding = 1; // Duplicate binding should cause error
Tobin Ehlisf7428442016-10-25 07:58:24 -060018504 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18505 dsl_binding[2].descriptorCount = 1;
18506 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18507 dsl_binding[2].pImmutableSamplers = NULL;
18508
18509 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18510 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18511 ds_layout_ci.pNext = NULL;
18512 ds_layout_ci.bindingCount = NUM_BINDINGS;
18513 ds_layout_ci.pBindings = dsl_binding;
18514 VkDescriptorSetLayout ds_layout;
18515 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_02345);
18516 vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18517 m_errorMonitor->VerifyFound();
18518}
18519
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060018520TEST_F(VkLayerTest, ViewportAndScissorBoundsChecking) {
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018521 TEST_DESCRIPTION("Verify errors are detected on misuse of SetViewport and SetScissor.");
18522
18523 ASSERT_NO_FATAL_FAILURE(InitState());
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018524
Tony Barbour552f6c02016-12-21 14:34:07 -070018525 m_commandBuffer->BeginCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018526
Mike Weiblen9a0f55d2016-10-31 22:35:00 -060018527 const VkPhysicalDeviceLimits &limits = m_device->props.limits;
18528
18529 {
18530 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01448);
18531 VkViewport viewport = {0, 0, static_cast<float>(limits.maxViewportDimensions[0] + 1), 16, 0, 1};
18532 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18533 m_errorMonitor->VerifyFound();
18534 }
18535
18536 {
18537 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01449);
18538 VkViewport viewport = {0, 0, 16, static_cast<float>(limits.maxViewportDimensions[1] + 1), 0, 1};
18539 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18540 m_errorMonitor->VerifyFound();
18541 }
18542
18543 {
18544 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
18545 VkViewport viewport = {limits.viewportBoundsRange[0] - 1, 0, 16, 16, 0, 1};
18546 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18547 m_errorMonitor->VerifyFound();
18548 }
18549
18550 {
18551 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01450);
18552 VkViewport viewport = {0, limits.viewportBoundsRange[0] - 1, 16, 16, 0, 1};
18553 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18554 m_errorMonitor->VerifyFound();
18555 }
18556
18557 {
18558 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01451);
18559 VkViewport viewport = {limits.viewportBoundsRange[1], 0, 16, 16, 0, 1};
18560 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18561 m_errorMonitor->VerifyFound();
18562 }
18563
18564 {
18565 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01452);
18566 VkViewport viewport = {0, limits.viewportBoundsRange[1], 16, 16, 0, 1};
18567 vkCmdSetViewport(m_commandBuffer->handle(), 0, 1, &viewport);
18568 m_errorMonitor->VerifyFound();
18569 }
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018570
18571 {
18572 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
18573 VkRect2D scissor = {{-1, 0}, {16, 16}};
18574 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18575 m_errorMonitor->VerifyFound();
18576 }
18577
18578 {
18579 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01489);
18580 VkRect2D scissor = {{0, -2}, {16, 16}};
18581 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18582 m_errorMonitor->VerifyFound();
18583 }
18584
18585 {
18586 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01490);
18587 VkRect2D scissor = {{100, 100}, {INT_MAX, 16}};
18588 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18589 m_errorMonitor->VerifyFound();
18590 }
18591
18592 {
18593 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT, VALIDATION_ERROR_01491);
18594 VkRect2D scissor = {{100, 100}, {16, INT_MAX}};
18595 vkCmdSetScissor(m_commandBuffer->handle(), 0, 1, &scissor);
18596 m_errorMonitor->VerifyFound();
18597 }
18598
Tony Barbour552f6c02016-12-21 14:34:07 -070018599 m_commandBuffer->EndCommandBuffer();
Mike Weiblen4e5d39b2016-10-31 14:42:01 -060018600}
18601
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018602// This is a positive test. No failures are expected.
18603TEST_F(VkPositiveLayerTest, EmptyDescriptorUpdateTest) {
18604 TEST_DESCRIPTION("Update last descriptor in a set that includes an empty binding");
18605 VkResult err;
18606
18607 ASSERT_NO_FATAL_FAILURE(InitState());
18608 m_errorMonitor->ExpectSuccess();
18609 VkDescriptorPoolSize ds_type_count = {};
18610 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18611 ds_type_count.descriptorCount = 2;
18612
18613 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18614 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18615 ds_pool_ci.pNext = NULL;
18616 ds_pool_ci.maxSets = 1;
18617 ds_pool_ci.poolSizeCount = 1;
18618 ds_pool_ci.pPoolSizes = &ds_type_count;
18619
18620 VkDescriptorPool ds_pool;
18621 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18622 ASSERT_VK_SUCCESS(err);
18623
18624 // Create layout with two uniform buffer descriptors w/ empty binding between them
18625 static const uint32_t NUM_BINDINGS = 3;
18626 VkDescriptorSetLayoutBinding dsl_binding[NUM_BINDINGS] = {};
18627 dsl_binding[0].binding = 0;
18628 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18629 dsl_binding[0].descriptorCount = 1;
18630 dsl_binding[0].stageFlags = VK_SHADER_STAGE_ALL;
18631 dsl_binding[0].pImmutableSamplers = NULL;
18632 dsl_binding[1].binding = 1;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018633 dsl_binding[1].descriptorCount = 0; // empty binding
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018634 dsl_binding[2].binding = 2;
18635 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18636 dsl_binding[2].descriptorCount = 1;
18637 dsl_binding[2].stageFlags = VK_SHADER_STAGE_ALL;
18638 dsl_binding[2].pImmutableSamplers = NULL;
18639
18640 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18641 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18642 ds_layout_ci.pNext = NULL;
18643 ds_layout_ci.bindingCount = NUM_BINDINGS;
18644 ds_layout_ci.pBindings = dsl_binding;
18645 VkDescriptorSetLayout ds_layout;
18646 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18647 ASSERT_VK_SUCCESS(err);
18648
18649 VkDescriptorSet descriptor_set = {};
18650 VkDescriptorSetAllocateInfo alloc_info = {};
18651 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18652 alloc_info.descriptorSetCount = 1;
18653 alloc_info.descriptorPool = ds_pool;
18654 alloc_info.pSetLayouts = &ds_layout;
18655 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
18656 ASSERT_VK_SUCCESS(err);
18657
18658 // Create a buffer to be used for update
18659 VkBufferCreateInfo buff_ci = {};
18660 buff_ci.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18661 buff_ci.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18662 buff_ci.size = 256;
18663 buff_ci.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
18664 VkBuffer buffer;
18665 err = vkCreateBuffer(m_device->device(), &buff_ci, NULL, &buffer);
18666 ASSERT_VK_SUCCESS(err);
18667 // Have to bind memory to buffer before descriptor update
18668 VkMemoryAllocateInfo mem_alloc = {};
18669 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18670 mem_alloc.pNext = NULL;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018671 mem_alloc.allocationSize = 512; // one allocation for both buffers
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018672 mem_alloc.memoryTypeIndex = 0;
18673
18674 VkMemoryRequirements mem_reqs;
18675 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
18676 bool pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, 0);
18677 if (!pass) {
18678 vkDestroyBuffer(m_device->device(), buffer, NULL);
18679 return;
18680 }
18681
18682 VkDeviceMemory mem;
18683 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
18684 ASSERT_VK_SUCCESS(err);
18685 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
18686 ASSERT_VK_SUCCESS(err);
18687
18688 // Only update the descriptor at binding 2
18689 VkDescriptorBufferInfo buff_info = {};
18690 buff_info.buffer = buffer;
18691 buff_info.offset = 0;
18692 buff_info.range = VK_WHOLE_SIZE;
18693 VkWriteDescriptorSet descriptor_write = {};
18694 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
18695 descriptor_write.dstBinding = 2;
18696 descriptor_write.descriptorCount = 1;
18697 descriptor_write.pTexelBufferView = nullptr;
18698 descriptor_write.pBufferInfo = &buff_info;
18699 descriptor_write.pImageInfo = nullptr;
18700 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER;
18701 descriptor_write.dstSet = descriptor_set;
18702
18703 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
18704
18705 m_errorMonitor->VerifyNotFound();
18706 // Cleanup
18707 vkFreeMemory(m_device->device(), mem, NULL);
18708 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18709 vkDestroyBuffer(m_device->device(), buffer, NULL);
18710 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18711}
18712
18713// This is a positive test. No failures are expected.
18714TEST_F(VkPositiveLayerTest, TestAliasedMemoryTracking) {
18715 VkResult err;
18716 bool pass;
18717
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070018718 TEST_DESCRIPTION(
18719 "Create a buffer, allocate memory, bind memory, destroy "
18720 "the buffer, create an image, and bind the same memory to "
18721 "it");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018722
18723 m_errorMonitor->ExpectSuccess();
18724
18725 ASSERT_NO_FATAL_FAILURE(InitState());
18726
18727 VkBuffer buffer;
18728 VkImage image;
18729 VkDeviceMemory mem;
18730 VkMemoryRequirements mem_reqs;
18731
18732 VkBufferCreateInfo buf_info = {};
18733 buf_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
18734 buf_info.pNext = NULL;
18735 buf_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
18736 buf_info.size = 256;
18737 buf_info.queueFamilyIndexCount = 0;
18738 buf_info.pQueueFamilyIndices = NULL;
18739 buf_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
18740 buf_info.flags = 0;
18741 err = vkCreateBuffer(m_device->device(), &buf_info, NULL, &buffer);
18742 ASSERT_VK_SUCCESS(err);
18743
18744 vkGetBufferMemoryRequirements(m_device->device(), buffer, &mem_reqs);
18745
18746 VkMemoryAllocateInfo alloc_info = {};
18747 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18748 alloc_info.pNext = NULL;
18749 alloc_info.memoryTypeIndex = 0;
Dave Houlton9dae7ec2017-03-01 16:23:25 -070018750
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018751 // Ensure memory is big enough for both bindings
18752 alloc_info.allocationSize = 0x10000;
18753
18754 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
18755 if (!pass) {
18756 vkDestroyBuffer(m_device->device(), buffer, NULL);
18757 return;
18758 }
18759
18760 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
18761 ASSERT_VK_SUCCESS(err);
18762
18763 uint8_t *pData;
18764 err = vkMapMemory(m_device->device(), mem, 0, mem_reqs.size, 0, (void **)&pData);
18765 ASSERT_VK_SUCCESS(err);
18766
18767 memset(pData, 0xCADECADE, static_cast<size_t>(mem_reqs.size));
18768
18769 vkUnmapMemory(m_device->device(), mem);
18770
18771 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
18772 ASSERT_VK_SUCCESS(err);
18773
18774 // NOW, destroy the buffer. Obviously, the resource no longer occupies this
18775 // memory. In fact, it was never used by the GPU.
18776 // Just be be sure, wait for idle.
18777 vkDestroyBuffer(m_device->device(), buffer, NULL);
18778 vkDeviceWaitIdle(m_device->device());
18779
Tobin Ehlis6a005702016-12-28 15:25:56 -070018780 // Use optimal as some platforms report linear support but then fail image creation
18781 VkImageTiling image_tiling = VK_IMAGE_TILING_OPTIMAL;
18782 VkImageFormatProperties image_format_properties;
18783 vkGetPhysicalDeviceImageFormatProperties(gpu(), VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_TYPE_2D, image_tiling,
18784 VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0, &image_format_properties);
18785 if (image_format_properties.maxExtent.width == 0) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070018786 printf(" Image format not supported; skipped.\n");
Tobin Ehlis6a005702016-12-28 15:25:56 -070018787 vkFreeMemory(m_device->device(), mem, NULL);
18788 return;
18789 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018790 VkImageCreateInfo image_create_info = {};
18791 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
18792 image_create_info.pNext = NULL;
18793 image_create_info.imageType = VK_IMAGE_TYPE_2D;
18794 image_create_info.format = VK_FORMAT_R8G8B8A8_UNORM;
18795 image_create_info.extent.width = 64;
18796 image_create_info.extent.height = 64;
18797 image_create_info.extent.depth = 1;
18798 image_create_info.mipLevels = 1;
18799 image_create_info.arrayLayers = 1;
18800 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
Tobin Ehlis6a005702016-12-28 15:25:56 -070018801 image_create_info.tiling = image_tiling;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018802 image_create_info.initialLayout = VK_IMAGE_LAYOUT_PREINITIALIZED;
18803 image_create_info.usage = VK_IMAGE_USAGE_TRANSFER_SRC_BIT;
18804 image_create_info.queueFamilyIndexCount = 0;
18805 image_create_info.pQueueFamilyIndices = NULL;
18806 image_create_info.sharingMode = VK_SHARING_MODE_EXCLUSIVE;
18807 image_create_info.flags = 0;
18808
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018809 /* Create a mappable image. It will be the texture if linear images are ok
Dave Houlton9dae7ec2017-03-01 16:23:25 -070018810 * to be textures or it will be the staging image if they are not.
18811 */
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018812 err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
18813 ASSERT_VK_SUCCESS(err);
18814
18815 vkGetImageMemoryRequirements(m_device->device(), image, &mem_reqs);
18816
Tobin Ehlis6a005702016-12-28 15:25:56 -070018817 VkMemoryAllocateInfo mem_alloc = {};
18818 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
18819 mem_alloc.pNext = NULL;
18820 mem_alloc.allocationSize = 0;
18821 mem_alloc.memoryTypeIndex = 0;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018822 mem_alloc.allocationSize = mem_reqs.size;
18823
18824 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &mem_alloc, VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT);
18825 if (!pass) {
Tobin Ehlis6a005702016-12-28 15:25:56 -070018826 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018827 vkDestroyImage(m_device->device(), image, NULL);
18828 return;
18829 }
18830
18831 // VALIDATION FAILURE:
18832 err = vkBindImageMemory(m_device->device(), image, mem, 0);
18833 ASSERT_VK_SUCCESS(err);
18834
18835 m_errorMonitor->VerifyNotFound();
18836
18837 vkFreeMemory(m_device->device(), mem, NULL);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060018838 vkDestroyImage(m_device->device(), image, NULL);
18839}
18840
Tony Barbourab713912017-02-02 14:17:35 -070018841// This is a positive test. No failures are expected.
18842TEST_F(VkPositiveLayerTest, TestDestroyFreeNullHandles) {
18843 VkResult err;
18844
18845 TEST_DESCRIPTION(
18846 "Call all applicable destroy and free routines with NULL"
18847 "handles, expecting no validation errors");
18848
18849 m_errorMonitor->ExpectSuccess();
18850
18851 ASSERT_NO_FATAL_FAILURE(InitState());
18852 vkDestroyBuffer(m_device->device(), VK_NULL_HANDLE, NULL);
18853 vkDestroyBufferView(m_device->device(), VK_NULL_HANDLE, NULL);
18854 vkDestroyCommandPool(m_device->device(), VK_NULL_HANDLE, NULL);
18855 vkDestroyDescriptorPool(m_device->device(), VK_NULL_HANDLE, NULL);
18856 vkDestroyDescriptorSetLayout(m_device->device(), VK_NULL_HANDLE, NULL);
18857 vkDestroyDevice(VK_NULL_HANDLE, NULL);
18858 vkDestroyEvent(m_device->device(), VK_NULL_HANDLE, NULL);
18859 vkDestroyFence(m_device->device(), VK_NULL_HANDLE, NULL);
18860 vkDestroyFramebuffer(m_device->device(), VK_NULL_HANDLE, NULL);
18861 vkDestroyImage(m_device->device(), VK_NULL_HANDLE, NULL);
18862 vkDestroyImageView(m_device->device(), VK_NULL_HANDLE, NULL);
18863 vkDestroyInstance(VK_NULL_HANDLE, NULL);
18864 vkDestroyPipeline(m_device->device(), VK_NULL_HANDLE, NULL);
18865 vkDestroyPipelineCache(m_device->device(), VK_NULL_HANDLE, NULL);
18866 vkDestroyPipelineLayout(m_device->device(), VK_NULL_HANDLE, NULL);
18867 vkDestroyQueryPool(m_device->device(), VK_NULL_HANDLE, NULL);
18868 vkDestroyRenderPass(m_device->device(), VK_NULL_HANDLE, NULL);
18869 vkDestroySampler(m_device->device(), VK_NULL_HANDLE, NULL);
18870 vkDestroySemaphore(m_device->device(), VK_NULL_HANDLE, NULL);
18871 vkDestroyShaderModule(m_device->device(), VK_NULL_HANDLE, NULL);
18872
18873 VkCommandPool command_pool;
18874 VkCommandPoolCreateInfo pool_create_info{};
18875 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
18876 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
18877 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
18878 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
18879 VkCommandBuffer command_buffers[3] = {};
18880 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
18881 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18882 command_buffer_allocate_info.commandPool = command_pool;
18883 command_buffer_allocate_info.commandBufferCount = 1;
18884 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18885 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffers[1]);
18886 vkFreeCommandBuffers(m_device->device(), command_pool, 3, command_buffers);
18887 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
18888
18889 VkDescriptorPoolSize ds_type_count = {};
18890 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
18891 ds_type_count.descriptorCount = 1;
18892
18893 VkDescriptorPoolCreateInfo ds_pool_ci = {};
18894 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
18895 ds_pool_ci.pNext = NULL;
18896 ds_pool_ci.maxSets = 1;
18897 ds_pool_ci.poolSizeCount = 1;
18898 ds_pool_ci.flags = VK_DESCRIPTOR_POOL_CREATE_FREE_DESCRIPTOR_SET_BIT;
18899 ds_pool_ci.pPoolSizes = &ds_type_count;
18900
18901 VkDescriptorPool ds_pool;
18902 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
18903 ASSERT_VK_SUCCESS(err);
18904
18905 VkDescriptorSetLayoutBinding dsl_binding = {};
18906 dsl_binding.binding = 2;
18907 dsl_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
18908 dsl_binding.descriptorCount = 1;
18909 dsl_binding.stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
18910 dsl_binding.pImmutableSamplers = NULL;
18911 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
18912 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
18913 ds_layout_ci.pNext = NULL;
18914 ds_layout_ci.bindingCount = 1;
18915 ds_layout_ci.pBindings = &dsl_binding;
18916 VkDescriptorSetLayout ds_layout;
18917 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
18918 ASSERT_VK_SUCCESS(err);
18919
18920 VkDescriptorSet descriptor_sets[3] = {};
18921 VkDescriptorSetAllocateInfo alloc_info = {};
18922 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
18923 alloc_info.descriptorSetCount = 1;
18924 alloc_info.descriptorPool = ds_pool;
18925 alloc_info.pSetLayouts = &ds_layout;
18926 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_sets[1]);
18927 ASSERT_VK_SUCCESS(err);
18928 vkFreeDescriptorSets(m_device->device(), ds_pool, 3, descriptor_sets);
18929 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
18930 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
18931
18932 vkFreeMemory(m_device->device(), VK_NULL_HANDLE, NULL);
18933
18934 m_errorMonitor->VerifyNotFound();
18935}
18936
Tony Barbour626994c2017-02-08 15:29:37 -070018937TEST_F(VkPositiveLayerTest, QueueSubmitSemaphoresAndLayoutTracking) {
Tony Barboure0c5cc92017-02-08 13:53:39 -070018938 TEST_DESCRIPTION("Submit multiple command buffers with chained semaphore signals and layout transitions");
Tony Barbour626994c2017-02-08 15:29:37 -070018939
18940 m_errorMonitor->ExpectSuccess();
18941
18942 ASSERT_NO_FATAL_FAILURE(InitState());
18943 VkCommandBuffer cmd_bufs[4];
18944 VkCommandBufferAllocateInfo alloc_info;
18945 alloc_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
18946 alloc_info.pNext = NULL;
18947 alloc_info.commandBufferCount = 4;
18948 alloc_info.commandPool = m_commandPool;
18949 alloc_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
18950 vkAllocateCommandBuffers(m_device->device(), &alloc_info, cmd_bufs);
18951 VkImageObj image(m_device);
18952 image.init(128, 128, VK_FORMAT_B8G8R8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
18953 ASSERT_TRUE(image.initialized());
18954 VkCommandBufferBeginInfo cb_binfo;
18955 cb_binfo.pNext = NULL;
18956 cb_binfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
18957 cb_binfo.pInheritanceInfo = VK_NULL_HANDLE;
18958 cb_binfo.flags = 0;
18959 // Use 4 command buffers, each with an image layout transition, ColorAO->General->ColorAO->TransferSrc->TransferDst
18960 vkBeginCommandBuffer(cmd_bufs[0], &cb_binfo);
18961 VkImageMemoryBarrier img_barrier = {};
18962 img_barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
18963 img_barrier.pNext = NULL;
18964 img_barrier.srcAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18965 img_barrier.dstAccessMask = VK_ACCESS_HOST_WRITE_BIT;
18966 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
18967 img_barrier.newLayout = VK_IMAGE_LAYOUT_GENERAL;
18968 img_barrier.image = image.handle();
18969 img_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18970 img_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED;
18971 img_barrier.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
18972 img_barrier.subresourceRange.baseArrayLayer = 0;
18973 img_barrier.subresourceRange.baseMipLevel = 0;
18974 img_barrier.subresourceRange.layerCount = 1;
18975 img_barrier.subresourceRange.levelCount = 1;
18976 vkCmdPipelineBarrier(cmd_bufs[0], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
18977 &img_barrier);
18978 vkEndCommandBuffer(cmd_bufs[0]);
18979 vkBeginCommandBuffer(cmd_bufs[1], &cb_binfo);
18980 img_barrier.oldLayout = VK_IMAGE_LAYOUT_GENERAL;
18981 img_barrier.newLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
18982 vkCmdPipelineBarrier(cmd_bufs[1], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
18983 &img_barrier);
18984 vkEndCommandBuffer(cmd_bufs[1]);
18985 vkBeginCommandBuffer(cmd_bufs[2], &cb_binfo);
18986 img_barrier.oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL;
18987 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
18988 vkCmdPipelineBarrier(cmd_bufs[2], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
18989 &img_barrier);
18990 vkEndCommandBuffer(cmd_bufs[2]);
18991 vkBeginCommandBuffer(cmd_bufs[3], &cb_binfo);
18992 img_barrier.oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
18993 img_barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
18994 vkCmdPipelineBarrier(cmd_bufs[3], VK_PIPELINE_STAGE_HOST_BIT, VK_PIPELINE_STAGE_HOST_BIT, 0, 0, nullptr, 0, nullptr, 1,
18995 &img_barrier);
18996 vkEndCommandBuffer(cmd_bufs[3]);
18997
18998 // Submit 4 command buffers in 3 submits, with submits 2 and 3 waiting for semaphores from submits 1 and 2
18999 VkSemaphore semaphore1, semaphore2;
19000 VkSemaphoreCreateInfo semaphore_create_info{};
19001 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
19002 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore1);
19003 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore2);
19004 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
19005 VkSubmitInfo submit_info[3];
19006 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19007 submit_info[0].pNext = nullptr;
19008 submit_info[0].commandBufferCount = 1;
19009 submit_info[0].pCommandBuffers = &cmd_bufs[0];
19010 submit_info[0].signalSemaphoreCount = 1;
19011 submit_info[0].pSignalSemaphores = &semaphore1;
19012 submit_info[0].waitSemaphoreCount = 0;
19013 submit_info[0].pWaitDstStageMask = nullptr;
19014 submit_info[0].pWaitDstStageMask = flags;
19015 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19016 submit_info[1].pNext = nullptr;
19017 submit_info[1].commandBufferCount = 1;
19018 submit_info[1].pCommandBuffers = &cmd_bufs[1];
19019 submit_info[1].waitSemaphoreCount = 1;
19020 submit_info[1].pWaitSemaphores = &semaphore1;
19021 submit_info[1].signalSemaphoreCount = 1;
19022 submit_info[1].pSignalSemaphores = &semaphore2;
19023 submit_info[1].pWaitDstStageMask = flags;
19024 submit_info[2].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
19025 submit_info[2].pNext = nullptr;
19026 submit_info[2].commandBufferCount = 2;
19027 submit_info[2].pCommandBuffers = &cmd_bufs[2];
19028 submit_info[2].waitSemaphoreCount = 1;
19029 submit_info[2].pWaitSemaphores = &semaphore2;
19030 submit_info[2].signalSemaphoreCount = 0;
19031 submit_info[2].pSignalSemaphores = nullptr;
19032 submit_info[2].pWaitDstStageMask = flags;
19033 vkQueueSubmit(m_device->m_queue, 3, submit_info, VK_NULL_HANDLE);
19034 vkQueueWaitIdle(m_device->m_queue);
19035
19036 vkDestroySemaphore(m_device->device(), semaphore1, NULL);
19037 vkDestroySemaphore(m_device->device(), semaphore2, NULL);
19038 m_errorMonitor->VerifyNotFound();
19039}
19040
Tobin Ehlis953e8392016-11-17 10:54:13 -070019041TEST_F(VkPositiveLayerTest, DynamicOffsetWithInactiveBinding) {
19042 // Create a descriptorSet w/ dynamic descriptors where 1 binding is inactive
19043 // We previously had a bug where dynamic offset of inactive bindings was still being used
19044 VkResult err;
19045 m_errorMonitor->ExpectSuccess();
19046
19047 ASSERT_NO_FATAL_FAILURE(InitState());
19048 ASSERT_NO_FATAL_FAILURE(InitViewport());
19049 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
19050
19051 VkDescriptorPoolSize ds_type_count = {};
19052 ds_type_count.type = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19053 ds_type_count.descriptorCount = 3;
19054
19055 VkDescriptorPoolCreateInfo ds_pool_ci = {};
19056 ds_pool_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_POOL_CREATE_INFO;
19057 ds_pool_ci.pNext = NULL;
19058 ds_pool_ci.maxSets = 1;
19059 ds_pool_ci.poolSizeCount = 1;
19060 ds_pool_ci.pPoolSizes = &ds_type_count;
19061
19062 VkDescriptorPool ds_pool;
19063 err = vkCreateDescriptorPool(m_device->device(), &ds_pool_ci, NULL, &ds_pool);
19064 ASSERT_VK_SUCCESS(err);
19065
19066 const uint32_t BINDING_COUNT = 3;
19067 VkDescriptorSetLayoutBinding dsl_binding[BINDING_COUNT] = {};
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019068 dsl_binding[0].binding = 2;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019069 dsl_binding[0].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19070 dsl_binding[0].descriptorCount = 1;
19071 dsl_binding[0].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19072 dsl_binding[0].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019073 dsl_binding[1].binding = 0;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019074 dsl_binding[1].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19075 dsl_binding[1].descriptorCount = 1;
19076 dsl_binding[1].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19077 dsl_binding[1].pImmutableSamplers = NULL;
Tobin Ehlis0050fba2016-11-30 10:22:02 -070019078 dsl_binding[2].binding = 1;
Tobin Ehlis953e8392016-11-17 10:54:13 -070019079 dsl_binding[2].descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19080 dsl_binding[2].descriptorCount = 1;
19081 dsl_binding[2].stageFlags = VK_SHADER_STAGE_FRAGMENT_BIT;
19082 dsl_binding[2].pImmutableSamplers = NULL;
19083
19084 VkDescriptorSetLayoutCreateInfo ds_layout_ci = {};
19085 ds_layout_ci.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO;
19086 ds_layout_ci.pNext = NULL;
19087 ds_layout_ci.bindingCount = BINDING_COUNT;
19088 ds_layout_ci.pBindings = dsl_binding;
19089 VkDescriptorSetLayout ds_layout;
19090 err = vkCreateDescriptorSetLayout(m_device->device(), &ds_layout_ci, NULL, &ds_layout);
19091 ASSERT_VK_SUCCESS(err);
19092
19093 VkDescriptorSet descriptor_set;
19094 VkDescriptorSetAllocateInfo alloc_info = {};
19095 alloc_info.sType = VK_STRUCTURE_TYPE_DESCRIPTOR_SET_ALLOCATE_INFO;
19096 alloc_info.descriptorSetCount = 1;
19097 alloc_info.descriptorPool = ds_pool;
19098 alloc_info.pSetLayouts = &ds_layout;
19099 err = vkAllocateDescriptorSets(m_device->device(), &alloc_info, &descriptor_set);
19100 ASSERT_VK_SUCCESS(err);
19101
19102 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
19103 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
19104 pipeline_layout_ci.pNext = NULL;
19105 pipeline_layout_ci.setLayoutCount = 1;
19106 pipeline_layout_ci.pSetLayouts = &ds_layout;
19107
19108 VkPipelineLayout pipeline_layout;
19109 err = vkCreatePipelineLayout(m_device->device(), &pipeline_layout_ci, NULL, &pipeline_layout);
19110 ASSERT_VK_SUCCESS(err);
19111
19112 // Create two buffers to update the descriptors with
19113 // The first will be 2k and used for bindings 0 & 1, the second is 1k for binding 2
19114 uint32_t qfi = 0;
19115 VkBufferCreateInfo buffCI = {};
19116 buffCI.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
19117 buffCI.size = 2048;
19118 buffCI.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
19119 buffCI.queueFamilyIndexCount = 1;
19120 buffCI.pQueueFamilyIndices = &qfi;
19121
19122 VkBuffer dyub1;
19123 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub1);
19124 ASSERT_VK_SUCCESS(err);
19125 // buffer2
19126 buffCI.size = 1024;
19127 VkBuffer dyub2;
19128 err = vkCreateBuffer(m_device->device(), &buffCI, NULL, &dyub2);
19129 ASSERT_VK_SUCCESS(err);
19130 // Allocate memory and bind to buffers
19131 VkMemoryAllocateInfo mem_alloc[2] = {};
19132 mem_alloc[0].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19133 mem_alloc[0].pNext = NULL;
19134 mem_alloc[0].memoryTypeIndex = 0;
19135 mem_alloc[1].sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19136 mem_alloc[1].pNext = NULL;
19137 mem_alloc[1].memoryTypeIndex = 0;
19138
19139 VkMemoryRequirements mem_reqs1;
19140 vkGetBufferMemoryRequirements(m_device->device(), dyub1, &mem_reqs1);
19141 VkMemoryRequirements mem_reqs2;
19142 vkGetBufferMemoryRequirements(m_device->device(), dyub2, &mem_reqs2);
19143 mem_alloc[0].allocationSize = mem_reqs1.size;
19144 bool pass = m_device->phy().set_memory_type(mem_reqs1.memoryTypeBits, &mem_alloc[0], 0);
19145 mem_alloc[1].allocationSize = mem_reqs2.size;
19146 pass &= m_device->phy().set_memory_type(mem_reqs2.memoryTypeBits, &mem_alloc[1], 0);
19147 if (!pass) {
19148 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19149 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19150 return;
19151 }
19152
19153 VkDeviceMemory mem1;
19154 err = vkAllocateMemory(m_device->device(), &mem_alloc[0], NULL, &mem1);
19155 ASSERT_VK_SUCCESS(err);
19156 err = vkBindBufferMemory(m_device->device(), dyub1, mem1, 0);
19157 ASSERT_VK_SUCCESS(err);
19158 VkDeviceMemory mem2;
19159 err = vkAllocateMemory(m_device->device(), &mem_alloc[1], NULL, &mem2);
19160 ASSERT_VK_SUCCESS(err);
19161 err = vkBindBufferMemory(m_device->device(), dyub2, mem2, 0);
19162 ASSERT_VK_SUCCESS(err);
19163 // Update descriptors
19164 VkDescriptorBufferInfo buff_info[BINDING_COUNT] = {};
19165 buff_info[0].buffer = dyub1;
19166 buff_info[0].offset = 0;
19167 buff_info[0].range = 256;
19168 buff_info[1].buffer = dyub1;
19169 buff_info[1].offset = 256;
19170 buff_info[1].range = 512;
19171 buff_info[2].buffer = dyub2;
19172 buff_info[2].offset = 0;
19173 buff_info[2].range = 512;
19174
19175 VkWriteDescriptorSet descriptor_write;
19176 memset(&descriptor_write, 0, sizeof(descriptor_write));
19177 descriptor_write.sType = VK_STRUCTURE_TYPE_WRITE_DESCRIPTOR_SET;
19178 descriptor_write.dstSet = descriptor_set;
19179 descriptor_write.dstBinding = 0;
19180 descriptor_write.descriptorCount = BINDING_COUNT;
19181 descriptor_write.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC;
19182 descriptor_write.pBufferInfo = buff_info;
19183
19184 vkUpdateDescriptorSets(m_device->device(), 1, &descriptor_write, 0, NULL);
19185
Tony Barbour552f6c02016-12-21 14:34:07 -070019186 m_commandBuffer->BeginCommandBuffer();
19187 m_commandBuffer->BeginRenderPass(m_renderPassBeginInfo);
Tobin Ehlis953e8392016-11-17 10:54:13 -070019188
19189 // Create PSO to be used for draw-time errors below
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019190 char const *vsSource =
19191 "#version 450\n"
19192 "\n"
19193 "out gl_PerVertex { \n"
19194 " vec4 gl_Position;\n"
19195 "};\n"
19196 "void main(){\n"
19197 " gl_Position = vec4(1);\n"
19198 "}\n";
19199 char const *fsSource =
19200 "#version 450\n"
19201 "\n"
19202 "layout(location=0) out vec4 x;\n"
19203 "layout(set=0) layout(binding=0) uniform foo1 { int x; int y; } bar1;\n"
19204 "layout(set=0) layout(binding=2) uniform foo2 { int x; int y; } bar2;\n"
19205 "void main(){\n"
19206 " x = vec4(bar1.y) + vec4(bar2.y);\n"
19207 "}\n";
Tobin Ehlis953e8392016-11-17 10:54:13 -070019208 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
19209 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
19210 VkPipelineObj pipe(m_device);
19211 pipe.SetViewport(m_viewports);
19212 pipe.SetScissor(m_scissors);
19213 pipe.AddShader(&vs);
19214 pipe.AddShader(&fs);
19215 pipe.AddColorAttachment();
19216 pipe.CreateVKPipeline(pipeline_layout, renderPass());
19217
19218 vkCmdBindPipeline(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipe.handle());
19219 // This update should succeed, but offset of inactive binding 1 oversteps binding 2 buffer size
19220 // we used to have a bug in this case.
19221 uint32_t dyn_off[BINDING_COUNT] = {0, 1024, 256};
19222 vkCmdBindDescriptorSets(m_commandBuffer->GetBufferHandle(), VK_PIPELINE_BIND_POINT_GRAPHICS, pipeline_layout, 0, 1,
19223 &descriptor_set, BINDING_COUNT, dyn_off);
19224 Draw(1, 0, 0, 0);
19225 m_errorMonitor->VerifyNotFound();
19226
19227 vkDestroyBuffer(m_device->device(), dyub1, NULL);
19228 vkDestroyBuffer(m_device->device(), dyub2, NULL);
19229 vkFreeMemory(m_device->device(), mem1, NULL);
19230 vkFreeMemory(m_device->device(), mem2, NULL);
19231
19232 vkDestroyPipelineLayout(m_device->device(), pipeline_layout, NULL);
19233 vkDestroyDescriptorSetLayout(m_device->device(), ds_layout, NULL);
19234 vkDestroyDescriptorPool(m_device->device(), ds_pool, NULL);
19235}
19236
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019237TEST_F(VkPositiveLayerTest, NonCoherentMemoryMapping) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019238 TEST_DESCRIPTION(
19239 "Ensure that validations handling of non-coherent memory "
19240 "mapping while using VK_WHOLE_SIZE does not cause access "
19241 "violations");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019242 VkResult err;
19243 uint8_t *pData;
19244 ASSERT_NO_FATAL_FAILURE(InitState());
19245
19246 VkDeviceMemory mem;
19247 VkMemoryRequirements mem_reqs;
19248 mem_reqs.memoryTypeBits = 0xFFFFFFFF;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019249 const VkDeviceSize atom_size = m_device->props.limits.nonCoherentAtomSize;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019250 VkMemoryAllocateInfo alloc_info = {};
19251 alloc_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19252 alloc_info.pNext = NULL;
19253 alloc_info.memoryTypeIndex = 0;
19254
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019255 static const VkDeviceSize allocation_size = 32 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019256 alloc_info.allocationSize = allocation_size;
19257
19258 // Find a memory configurations WITHOUT a COHERENT bit, otherwise exit
19259 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 -070019260 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019261 if (!pass) {
19262 pass = m_device->phy().set_memory_type(mem_reqs.memoryTypeBits, &alloc_info,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019263 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT,
19264 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019265 if (!pass) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019266 pass = m_device->phy().set_memory_type(
19267 mem_reqs.memoryTypeBits, &alloc_info,
19268 VK_MEMORY_PROPERTY_HOST_VISIBLE_BIT | VK_MEMORY_PROPERTY_DEVICE_LOCAL_BIT | VK_MEMORY_PROPERTY_HOST_CACHED_BIT,
19269 VK_MEMORY_PROPERTY_HOST_COHERENT_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019270 if (!pass) {
19271 return;
19272 }
19273 }
19274 }
19275
19276 err = vkAllocateMemory(m_device->device(), &alloc_info, NULL, &mem);
19277 ASSERT_VK_SUCCESS(err);
19278
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019279 // Map/Flush/Invalidate using WHOLE_SIZE and zero offsets and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019280 m_errorMonitor->ExpectSuccess();
19281 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19282 ASSERT_VK_SUCCESS(err);
19283 VkMappedMemoryRange mmr = {};
19284 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19285 mmr.memory = mem;
19286 mmr.offset = 0;
19287 mmr.size = VK_WHOLE_SIZE;
19288 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19289 ASSERT_VK_SUCCESS(err);
19290 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19291 ASSERT_VK_SUCCESS(err);
19292 m_errorMonitor->VerifyNotFound();
19293 vkUnmapMemory(m_device->device(), mem);
19294
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019295 // Map/Flush/Invalidate using WHOLE_SIZE and an offset and entire mapped range
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019296 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019297 err = vkMapMemory(m_device->device(), mem, 5 * atom_size, VK_WHOLE_SIZE, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019298 ASSERT_VK_SUCCESS(err);
19299 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19300 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019301 mmr.offset = 6 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019302 mmr.size = VK_WHOLE_SIZE;
19303 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19304 ASSERT_VK_SUCCESS(err);
19305 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19306 ASSERT_VK_SUCCESS(err);
19307 m_errorMonitor->VerifyNotFound();
19308 vkUnmapMemory(m_device->device(), mem);
19309
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019310 // Map with offset and size
19311 // Flush/Invalidate subrange of mapped area with offset and size
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019312 m_errorMonitor->ExpectSuccess();
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019313 err = vkMapMemory(m_device->device(), mem, 3 * atom_size, 9 * atom_size, 0, (void **)&pData);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019314 ASSERT_VK_SUCCESS(err);
19315 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19316 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019317 mmr.offset = 4 * atom_size;
19318 mmr.size = 2 * atom_size;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019319 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19320 ASSERT_VK_SUCCESS(err);
19321 err = vkInvalidateMappedMemoryRanges(m_device->device(), 1, &mmr);
19322 ASSERT_VK_SUCCESS(err);
19323 m_errorMonitor->VerifyNotFound();
19324 vkUnmapMemory(m_device->device(), mem);
19325
19326 // Map without offset and flush WHOLE_SIZE with two separate offsets
19327 m_errorMonitor->ExpectSuccess();
19328 err = vkMapMemory(m_device->device(), mem, 0, VK_WHOLE_SIZE, 0, (void **)&pData);
19329 ASSERT_VK_SUCCESS(err);
19330 mmr.sType = VK_STRUCTURE_TYPE_MAPPED_MEMORY_RANGE;
19331 mmr.memory = mem;
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019332 mmr.offset = allocation_size - (4 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019333 mmr.size = VK_WHOLE_SIZE;
19334 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19335 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski255cdef2016-11-28 13:58:59 -070019336 mmr.offset = allocation_size - (6 * atom_size);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019337 mmr.size = VK_WHOLE_SIZE;
19338 err = vkFlushMappedMemoryRanges(m_device->device(), 1, &mmr);
19339 ASSERT_VK_SUCCESS(err);
19340 m_errorMonitor->VerifyNotFound();
19341 vkUnmapMemory(m_device->device(), mem);
19342
19343 vkFreeMemory(m_device->device(), mem, NULL);
19344}
19345
19346// This is a positive test. We used to expect error in this case but spec now allows it
19347TEST_F(VkPositiveLayerTest, ResetUnsignaledFence) {
19348 m_errorMonitor->ExpectSuccess();
19349 vk_testing::Fence testFence;
19350 VkFenceCreateInfo fenceInfo = {};
19351 fenceInfo.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
19352 fenceInfo.pNext = NULL;
19353
19354 ASSERT_NO_FATAL_FAILURE(InitState());
19355 testFence.init(*m_device, fenceInfo);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019356 VkFence fences[1] = {testFence.handle()};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019357 VkResult result = vkResetFences(m_device->device(), 1, fences);
19358 ASSERT_VK_SUCCESS(result);
19359
19360 m_errorMonitor->VerifyNotFound();
19361}
19362
19363TEST_F(VkPositiveLayerTest, CommandBufferSimultaneousUseSync) {
19364 m_errorMonitor->ExpectSuccess();
19365
19366 ASSERT_NO_FATAL_FAILURE(InitState());
19367 VkResult err;
19368
19369 // Record (empty!) command buffer that can be submitted multiple times
19370 // simultaneously.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019371 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr,
19372 VK_COMMAND_BUFFER_USAGE_SIMULTANEOUS_USE_BIT, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019373 m_commandBuffer->BeginCommandBuffer(&cbbi);
19374 m_commandBuffer->EndCommandBuffer();
19375
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019376 VkFenceCreateInfo fci = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019377 VkFence fence;
19378 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
19379 ASSERT_VK_SUCCESS(err);
19380
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019381 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019382 VkSemaphore s1, s2;
19383 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s1);
19384 ASSERT_VK_SUCCESS(err);
19385 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s2);
19386 ASSERT_VK_SUCCESS(err);
19387
19388 // Submit CB once signaling s1, with fence so we can roll forward to its retirement.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019389 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &m_commandBuffer->handle(), 1, &s1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019390 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
19391 ASSERT_VK_SUCCESS(err);
19392
19393 // Submit CB again, signaling s2.
19394 si.pSignalSemaphores = &s2;
19395 err = vkQueueSubmit(m_device->m_queue, 1, &si, VK_NULL_HANDLE);
19396 ASSERT_VK_SUCCESS(err);
19397
19398 // Wait for fence.
19399 err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
19400 ASSERT_VK_SUCCESS(err);
19401
19402 // CB is still in flight from second submission, but semaphore s1 is no
19403 // longer in flight. delete it.
19404 vkDestroySemaphore(m_device->device(), s1, nullptr);
19405
19406 m_errorMonitor->VerifyNotFound();
19407
19408 // Force device idle and clean up remaining objects
19409 vkDeviceWaitIdle(m_device->device());
19410 vkDestroySemaphore(m_device->device(), s2, nullptr);
19411 vkDestroyFence(m_device->device(), fence, nullptr);
19412}
19413
19414TEST_F(VkPositiveLayerTest, FenceCreateSignaledWaitHandling) {
19415 m_errorMonitor->ExpectSuccess();
19416
19417 ASSERT_NO_FATAL_FAILURE(InitState());
19418 VkResult err;
19419
19420 // A fence created signaled
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019421 VkFenceCreateInfo fci1 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, VK_FENCE_CREATE_SIGNALED_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019422 VkFence f1;
19423 err = vkCreateFence(m_device->device(), &fci1, nullptr, &f1);
19424 ASSERT_VK_SUCCESS(err);
19425
19426 // A fence created not
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019427 VkFenceCreateInfo fci2 = {VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019428 VkFence f2;
19429 err = vkCreateFence(m_device->device(), &fci2, nullptr, &f2);
19430 ASSERT_VK_SUCCESS(err);
19431
19432 // Submit the unsignaled fence
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019433 VkSubmitInfo si = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019434 err = vkQueueSubmit(m_device->m_queue, 1, &si, f2);
19435
19436 // Wait on both fences, with signaled first.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019437 VkFence fences[] = {f1, f2};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019438 vkWaitForFences(m_device->device(), 2, fences, VK_TRUE, UINT64_MAX);
19439
19440 // Should have both retired!
19441 vkDestroyFence(m_device->device(), f1, nullptr);
19442 vkDestroyFence(m_device->device(), f2, nullptr);
19443
19444 m_errorMonitor->VerifyNotFound();
19445}
19446
19447TEST_F(VkPositiveLayerTest, ValidUsage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019448 TEST_DESCRIPTION(
19449 "Verify that creating an image view from an image with valid usage "
19450 "doesn't generate validation errors");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019451
19452 ASSERT_NO_FATAL_FAILURE(InitState());
19453
19454 m_errorMonitor->ExpectSuccess();
19455 // Verify that we can create a view with usage INPUT_ATTACHMENT
19456 VkImageObj image(m_device);
19457 image.init(128, 128, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_INPUT_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
19458 ASSERT_TRUE(image.initialized());
19459 VkImageView imageView;
19460 VkImageViewCreateInfo ivci = {};
19461 ivci.sType = VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO;
19462 ivci.image = image.handle();
19463 ivci.viewType = VK_IMAGE_VIEW_TYPE_2D;
19464 ivci.format = VK_FORMAT_R8G8B8A8_UNORM;
19465 ivci.subresourceRange.layerCount = 1;
19466 ivci.subresourceRange.baseMipLevel = 0;
19467 ivci.subresourceRange.levelCount = 1;
19468 ivci.subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT;
19469
19470 vkCreateImageView(m_device->device(), &ivci, NULL, &imageView);
19471 m_errorMonitor->VerifyNotFound();
19472 vkDestroyImageView(m_device->device(), imageView, NULL);
19473}
19474
19475// This is a positive test. No failures are expected.
19476TEST_F(VkPositiveLayerTest, BindSparse) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019477 TEST_DESCRIPTION(
19478 "Bind 2 memory ranges to one image using vkQueueBindSparse, destroy the image"
19479 "and then free the memory");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019480
19481 ASSERT_NO_FATAL_FAILURE(InitState());
19482
19483 auto index = m_device->graphics_queue_node_index_;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019484 if (!(m_device->queue_props[index].queueFlags & VK_QUEUE_SPARSE_BINDING_BIT)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019485
19486 m_errorMonitor->ExpectSuccess();
19487
19488 VkImage image;
19489 VkImageCreateInfo image_create_info = {};
19490 image_create_info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO;
19491 image_create_info.pNext = NULL;
19492 image_create_info.imageType = VK_IMAGE_TYPE_2D;
19493 image_create_info.format = VK_FORMAT_B8G8R8A8_UNORM;
19494 image_create_info.extent.width = 64;
19495 image_create_info.extent.height = 64;
19496 image_create_info.extent.depth = 1;
19497 image_create_info.mipLevels = 1;
19498 image_create_info.arrayLayers = 1;
19499 image_create_info.samples = VK_SAMPLE_COUNT_1_BIT;
19500 image_create_info.tiling = VK_IMAGE_TILING_OPTIMAL;
19501 image_create_info.usage = VK_IMAGE_USAGE_STORAGE_BIT;
19502 image_create_info.flags = VK_IMAGE_CREATE_SPARSE_BINDING_BIT;
19503 VkResult err = vkCreateImage(m_device->device(), &image_create_info, NULL, &image);
19504 ASSERT_VK_SUCCESS(err);
19505
19506 VkMemoryRequirements memory_reqs;
19507 VkDeviceMemory memory_one, memory_two;
19508 bool pass;
19509 VkMemoryAllocateInfo memory_info = {};
19510 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
19511 memory_info.pNext = NULL;
19512 memory_info.allocationSize = 0;
19513 memory_info.memoryTypeIndex = 0;
19514 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19515 // Find an image big enough to allow sparse mapping of 2 memory regions
19516 // Increase the image size until it is at least twice the
19517 // size of the required alignment, to ensure we can bind both
19518 // allocated memory blocks to the image on aligned offsets.
19519 while (memory_reqs.size < (memory_reqs.alignment * 2)) {
19520 vkDestroyImage(m_device->device(), image, nullptr);
19521 image_create_info.extent.width *= 2;
19522 image_create_info.extent.height *= 2;
19523 err = vkCreateImage(m_device->device(), &image_create_info, nullptr, &image);
19524 ASSERT_VK_SUCCESS(err);
19525 vkGetImageMemoryRequirements(m_device->device(), image, &memory_reqs);
19526 }
19527 // Allocate 2 memory regions of minimum alignment size, bind one at 0, the other
19528 // at the end of the first
19529 memory_info.allocationSize = memory_reqs.alignment;
19530 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
19531 ASSERT_TRUE(pass);
19532 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_one);
19533 ASSERT_VK_SUCCESS(err);
19534 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &memory_two);
19535 ASSERT_VK_SUCCESS(err);
19536 VkSparseMemoryBind binds[2];
19537 binds[0].flags = 0;
19538 binds[0].memory = memory_one;
19539 binds[0].memoryOffset = 0;
19540 binds[0].resourceOffset = 0;
19541 binds[0].size = memory_info.allocationSize;
19542 binds[1].flags = 0;
19543 binds[1].memory = memory_two;
19544 binds[1].memoryOffset = 0;
19545 binds[1].resourceOffset = memory_info.allocationSize;
19546 binds[1].size = memory_info.allocationSize;
19547
19548 VkSparseImageOpaqueMemoryBindInfo opaqueBindInfo;
19549 opaqueBindInfo.image = image;
19550 opaqueBindInfo.bindCount = 2;
19551 opaqueBindInfo.pBinds = binds;
19552
19553 VkFence fence = VK_NULL_HANDLE;
19554 VkBindSparseInfo bindSparseInfo = {};
19555 bindSparseInfo.sType = VK_STRUCTURE_TYPE_BIND_SPARSE_INFO;
19556 bindSparseInfo.imageOpaqueBindCount = 1;
19557 bindSparseInfo.pImageOpaqueBinds = &opaqueBindInfo;
19558
19559 vkQueueBindSparse(m_device->m_queue, 1, &bindSparseInfo, fence);
19560 vkQueueWaitIdle(m_device->m_queue);
19561 vkDestroyImage(m_device->device(), image, NULL);
19562 vkFreeMemory(m_device->device(), memory_one, NULL);
19563 vkFreeMemory(m_device->device(), memory_two, NULL);
19564 m_errorMonitor->VerifyNotFound();
19565}
19566
19567TEST_F(VkPositiveLayerTest, RenderPassInitialLayoutUndefined) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019568 TEST_DESCRIPTION(
19569 "Ensure that CmdBeginRenderPass with an attachment's "
19570 "initialLayout of VK_IMAGE_LAYOUT_UNDEFINED works when "
19571 "the command buffer has prior knowledge of that "
19572 "attachment's layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019573
19574 m_errorMonitor->ExpectSuccess();
19575
19576 ASSERT_NO_FATAL_FAILURE(InitState());
19577
19578 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019579 VkAttachmentDescription attachment = {0,
19580 VK_FORMAT_R8G8B8A8_UNORM,
19581 VK_SAMPLE_COUNT_1_BIT,
19582 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19583 VK_ATTACHMENT_STORE_OP_STORE,
19584 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19585 VK_ATTACHMENT_STORE_OP_DONT_CARE,
19586 VK_IMAGE_LAYOUT_UNDEFINED,
19587 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019588
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019589 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019590
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019591 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019592
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019593 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019594
19595 VkRenderPass rp;
19596 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
19597 ASSERT_VK_SUCCESS(err);
19598
19599 // A compatible framebuffer.
19600 VkImageObj image(m_device);
19601 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
19602 ASSERT_TRUE(image.initialized());
19603
19604 VkImageViewCreateInfo ivci = {
19605 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
19606 nullptr,
19607 0,
19608 image.handle(),
19609 VK_IMAGE_VIEW_TYPE_2D,
19610 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019611 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
19612 VK_COMPONENT_SWIZZLE_IDENTITY},
19613 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019614 };
19615 VkImageView view;
19616 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
19617 ASSERT_VK_SUCCESS(err);
19618
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019619 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019620 VkFramebuffer fb;
19621 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
19622 ASSERT_VK_SUCCESS(err);
19623
19624 // Record a single command buffer which uses this renderpass twice. The
19625 // bug is triggered at the beginning of the second renderpass, when the
19626 // command buffer already has a layout recorded for the attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019627 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 -070019628 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019629 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
19630 vkCmdEndRenderPass(m_commandBuffer->handle());
19631 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
19632
19633 m_errorMonitor->VerifyNotFound();
19634
19635 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070019636 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019637
19638 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
19639 vkDestroyRenderPass(m_device->device(), rp, nullptr);
19640 vkDestroyImageView(m_device->device(), view, nullptr);
19641}
19642
19643TEST_F(VkPositiveLayerTest, FramebufferBindingDestroyCommandPool) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019644 TEST_DESCRIPTION(
19645 "This test should pass. Create a Framebuffer and "
19646 "command buffer, bind them together, then destroy "
19647 "command pool and framebuffer and verify there are no "
19648 "errors.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019649
19650 m_errorMonitor->ExpectSuccess();
19651
19652 ASSERT_NO_FATAL_FAILURE(InitState());
19653
19654 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019655 VkAttachmentDescription attachment = {0,
19656 VK_FORMAT_R8G8B8A8_UNORM,
19657 VK_SAMPLE_COUNT_1_BIT,
19658 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19659 VK_ATTACHMENT_STORE_OP_STORE,
19660 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19661 VK_ATTACHMENT_STORE_OP_DONT_CARE,
19662 VK_IMAGE_LAYOUT_UNDEFINED,
19663 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019664
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019665 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019666
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019667 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019668
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019669 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019670
19671 VkRenderPass rp;
19672 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
19673 ASSERT_VK_SUCCESS(err);
19674
19675 // A compatible framebuffer.
19676 VkImageObj image(m_device);
19677 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
19678 ASSERT_TRUE(image.initialized());
19679
19680 VkImageViewCreateInfo ivci = {
19681 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
19682 nullptr,
19683 0,
19684 image.handle(),
19685 VK_IMAGE_VIEW_TYPE_2D,
19686 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019687 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
19688 VK_COMPONENT_SWIZZLE_IDENTITY},
19689 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019690 };
19691 VkImageView view;
19692 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
19693 ASSERT_VK_SUCCESS(err);
19694
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019695 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019696 VkFramebuffer fb;
19697 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
19698 ASSERT_VK_SUCCESS(err);
19699
19700 // Explicitly create a command buffer to bind the FB to so that we can then
19701 // destroy the command pool in order to implicitly free command buffer
19702 VkCommandPool command_pool;
19703 VkCommandPoolCreateInfo pool_create_info{};
19704 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
19705 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
19706 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
19707 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
19708
19709 VkCommandBuffer command_buffer;
19710 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
19711 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
19712 command_buffer_allocate_info.commandPool = command_pool;
19713 command_buffer_allocate_info.commandBufferCount = 1;
19714 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
19715 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
19716
19717 // Begin our cmd buffer with renderpass using our framebuffer
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019718 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 -060019719 VkCommandBufferBeginInfo begin_info{};
19720 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
19721 vkBeginCommandBuffer(command_buffer, &begin_info);
19722
19723 vkCmdBeginRenderPass(command_buffer, &rpbi, VK_SUBPASS_CONTENTS_INLINE);
19724 vkCmdEndRenderPass(command_buffer);
19725 vkEndCommandBuffer(command_buffer);
19726 vkDestroyImageView(m_device->device(), view, nullptr);
19727 // Destroy command pool to implicitly free command buffer
19728 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
19729 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
19730 vkDestroyRenderPass(m_device->device(), rp, nullptr);
19731 m_errorMonitor->VerifyNotFound();
19732}
19733
19734TEST_F(VkPositiveLayerTest, RenderPassSubpassZeroTransitionsApplied) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019735 TEST_DESCRIPTION(
19736 "Ensure that CmdBeginRenderPass applies the layout "
19737 "transitions for the first subpass");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019738
19739 m_errorMonitor->ExpectSuccess();
19740
19741 ASSERT_NO_FATAL_FAILURE(InitState());
19742
19743 // A renderpass with one color attachment.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019744 VkAttachmentDescription attachment = {0,
19745 VK_FORMAT_R8G8B8A8_UNORM,
19746 VK_SAMPLE_COUNT_1_BIT,
19747 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19748 VK_ATTACHMENT_STORE_OP_STORE,
19749 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19750 VK_ATTACHMENT_STORE_OP_DONT_CARE,
19751 VK_IMAGE_LAYOUT_UNDEFINED,
19752 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019753
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019754 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019755
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019756 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019757
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019758 VkSubpassDependency dep = {0,
19759 0,
19760 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
19761 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
19762 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
19763 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
19764 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019765
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019766 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019767
19768 VkResult err;
19769 VkRenderPass rp;
19770 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
19771 ASSERT_VK_SUCCESS(err);
19772
19773 // A compatible framebuffer.
19774 VkImageObj image(m_device);
19775 image.init(32, 32, VK_FORMAT_R8G8B8A8_UNORM, VK_IMAGE_USAGE_COLOR_ATTACHMENT_BIT, VK_IMAGE_TILING_OPTIMAL, 0);
19776 ASSERT_TRUE(image.initialized());
19777
19778 VkImageViewCreateInfo ivci = {
19779 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
19780 nullptr,
19781 0,
19782 image.handle(),
19783 VK_IMAGE_VIEW_TYPE_2D,
19784 VK_FORMAT_R8G8B8A8_UNORM,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019785 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
19786 VK_COMPONENT_SWIZZLE_IDENTITY},
19787 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019788 };
19789 VkImageView view;
19790 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
19791 ASSERT_VK_SUCCESS(err);
19792
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019793 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019794 VkFramebuffer fb;
19795 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
19796 ASSERT_VK_SUCCESS(err);
19797
19798 // Record a single command buffer which issues a pipeline barrier w/
19799 // image memory barrier for the attachment. This detects the previously
19800 // missing tracking of the subpass layout by throwing a validation error
19801 // if it doesn't occur.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019802 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 -070019803 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019804 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
19805
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019806 VkImageMemoryBarrier imb = {VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER,
19807 nullptr,
19808 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
19809 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
19810 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
19811 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
19812 VK_QUEUE_FAMILY_IGNORED,
19813 VK_QUEUE_FAMILY_IGNORED,
19814 image.handle(),
19815 {VK_IMAGE_ASPECT_COLOR_BIT, 0, 1, 0, 1}};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019816 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019817 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
19818 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019819
19820 vkCmdEndRenderPass(m_commandBuffer->handle());
19821 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070019822 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019823
19824 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
19825 vkDestroyRenderPass(m_device->device(), rp, nullptr);
19826 vkDestroyImageView(m_device->device(), view, nullptr);
19827}
19828
19829TEST_F(VkPositiveLayerTest, DepthStencilLayoutTransitionForDepthOnlyImageview) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019830 TEST_DESCRIPTION(
19831 "Validate that when an imageView of a depth/stencil image "
19832 "is used as a depth/stencil framebuffer attachment, the "
19833 "aspectMask is ignored and both depth and stencil image "
19834 "subresources are used.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019835
19836 VkFormatProperties format_properties;
19837 vkGetPhysicalDeviceFormatProperties(gpu(), VK_FORMAT_D32_SFLOAT_S8_UINT, &format_properties);
19838 if (!(format_properties.optimalTilingFeatures & VK_FORMAT_FEATURE_SAMPLED_IMAGE_BIT)) {
19839 return;
19840 }
19841
19842 m_errorMonitor->ExpectSuccess();
19843
19844 ASSERT_NO_FATAL_FAILURE(InitState());
19845
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019846 VkAttachmentDescription attachment = {0,
19847 VK_FORMAT_D32_SFLOAT_S8_UINT,
19848 VK_SAMPLE_COUNT_1_BIT,
19849 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19850 VK_ATTACHMENT_STORE_OP_STORE,
19851 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
19852 VK_ATTACHMENT_STORE_OP_DONT_CARE,
19853 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL,
19854 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019855
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019856 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019857
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019858 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019859
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019860 VkSubpassDependency dep = {0,
19861 0,
19862 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
19863 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
19864 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
19865 VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT,
19866 VK_DEPENDENCY_BY_REGION_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019867
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019868 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 1, &dep};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019869
19870 VkResult err;
19871 VkRenderPass rp;
19872 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
19873 ASSERT_VK_SUCCESS(err);
19874
19875 VkImageObj image(m_device);
19876 image.init_no_layout(32, 32, VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019877 0x26, // usage
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019878 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019879 ASSERT_TRUE(image.initialized());
19880 image.SetLayout(0x6, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL);
19881
19882 VkImageViewCreateInfo ivci = {
19883 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
19884 nullptr,
19885 0,
19886 image.handle(),
19887 VK_IMAGE_VIEW_TYPE_2D,
19888 VK_FORMAT_D32_SFLOAT_S8_UINT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019889 {VK_COMPONENT_SWIZZLE_R, VK_COMPONENT_SWIZZLE_G, VK_COMPONENT_SWIZZLE_B, VK_COMPONENT_SWIZZLE_A},
19890 {0x2, 0, 1, 0, 1},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019891 };
19892 VkImageView view;
19893 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
19894 ASSERT_VK_SUCCESS(err);
19895
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019896 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019897 VkFramebuffer fb;
19898 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
19899 ASSERT_VK_SUCCESS(err);
19900
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019901 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 -070019902 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019903 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
19904
19905 VkImageMemoryBarrier imb = {};
19906 imb.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
19907 imb.pNext = nullptr;
19908 imb.srcAccessMask = VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
19909 imb.dstAccessMask = VK_ACCESS_SHADER_READ_BIT;
19910 imb.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
19911 imb.newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL;
19912 imb.srcQueueFamilyIndex = 0;
19913 imb.dstQueueFamilyIndex = 0;
19914 imb.image = image.handle();
19915 imb.subresourceRange.aspectMask = 0x6;
19916 imb.subresourceRange.baseMipLevel = 0;
19917 imb.subresourceRange.levelCount = 0x1;
19918 imb.subresourceRange.baseArrayLayer = 0;
19919 imb.subresourceRange.layerCount = 0x1;
19920
19921 vkCmdPipelineBarrier(m_commandBuffer->handle(), VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019922 VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, VK_DEPENDENCY_BY_REGION_BIT, 0, nullptr, 0, nullptr, 1,
19923 &imb);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019924
19925 vkCmdEndRenderPass(m_commandBuffer->handle());
Tony Barbour552f6c02016-12-21 14:34:07 -070019926 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019927 QueueCommandBuffer(false);
19928 m_errorMonitor->VerifyNotFound();
19929
19930 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
19931 vkDestroyRenderPass(m_device->device(), rp, nullptr);
19932 vkDestroyImageView(m_device->device(), view, nullptr);
19933}
19934
19935TEST_F(VkPositiveLayerTest, RenderPassTransitionsAttachmentUnused) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019936 TEST_DESCRIPTION(
19937 "Ensure that layout transitions work correctly without "
19938 "errors, when an attachment reference is "
19939 "VK_ATTACHMENT_UNUSED");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019940
19941 m_errorMonitor->ExpectSuccess();
19942
19943 ASSERT_NO_FATAL_FAILURE(InitState());
19944
19945 // A renderpass with no attachments
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019946 VkAttachmentReference att_ref = {VK_ATTACHMENT_UNUSED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019947
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019948 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 1, &att_ref, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019949
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019950 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 0, nullptr, 1, &subpass, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019951
19952 VkRenderPass rp;
19953 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
19954 ASSERT_VK_SUCCESS(err);
19955
19956 // A compatible framebuffer.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019957 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 0, nullptr, 32, 32, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019958 VkFramebuffer fb;
19959 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
19960 ASSERT_VK_SUCCESS(err);
19961
19962 // Record a command buffer which just begins and ends the renderpass. The
19963 // bug manifests in BeginRenderPass.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019964 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 -070019965 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019966 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
19967 vkCmdEndRenderPass(m_commandBuffer->handle());
19968 m_errorMonitor->VerifyNotFound();
Tony Barbour552f6c02016-12-21 14:34:07 -070019969 m_commandBuffer->EndCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019970
19971 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
19972 vkDestroyRenderPass(m_device->device(), rp, nullptr);
19973}
19974
19975// This is a positive test. No errors are expected.
19976TEST_F(VkPositiveLayerTest, StencilLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070019977 TEST_DESCRIPTION(
19978 "Create a stencil-only attachment with a LOAD_OP set to "
19979 "CLEAR. stencil[Load|Store]Op used to be ignored.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019980 VkResult result = VK_SUCCESS;
Tony Barbourf887b162017-03-09 10:06:46 -070019981 ASSERT_NO_FATAL_FAILURE(InitState());
19982 auto depth_format = find_depth_stencil_format(m_device);
19983 if (!depth_format) {
19984 printf(" No Depth + Stencil format found. Skipped.\n");
19985 return;
19986 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019987 VkImageFormatProperties formatProps;
Tony Barbourf887b162017-03-09 10:06:46 -070019988 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019989 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT, 0,
19990 &formatProps);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019991 if (formatProps.maxExtent.width < 100 || formatProps.maxExtent.height < 100) {
19992 return;
19993 }
19994
Tony Barbourf887b162017-03-09 10:06:46 -070019995 VkFormat depth_stencil_fmt = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019996 m_depthStencil->Init(m_device, 100, 100, depth_stencil_fmt,
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070019997 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | VK_IMAGE_USAGE_TRANSFER_SRC_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060019998 VkAttachmentDescription att = {};
19999 VkAttachmentReference ref = {};
20000 att.format = depth_stencil_fmt;
20001 att.samples = VK_SAMPLE_COUNT_1_BIT;
20002 att.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE;
20003 att.storeOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
20004 att.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
20005 att.stencilStoreOp = VK_ATTACHMENT_STORE_OP_STORE;
20006 att.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20007 att.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20008
20009 VkClearValue clear;
20010 clear.depthStencil.depth = 1.0;
20011 clear.depthStencil.stencil = 0;
20012 ref.attachment = 0;
20013 ref.layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20014
20015 VkSubpassDescription subpass = {};
20016 subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS;
20017 subpass.flags = 0;
20018 subpass.inputAttachmentCount = 0;
20019 subpass.pInputAttachments = NULL;
20020 subpass.colorAttachmentCount = 0;
20021 subpass.pColorAttachments = NULL;
20022 subpass.pResolveAttachments = NULL;
20023 subpass.pDepthStencilAttachment = &ref;
20024 subpass.preserveAttachmentCount = 0;
20025 subpass.pPreserveAttachments = NULL;
20026
20027 VkRenderPass rp;
20028 VkRenderPassCreateInfo rp_info = {};
20029 rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
20030 rp_info.attachmentCount = 1;
20031 rp_info.pAttachments = &att;
20032 rp_info.subpassCount = 1;
20033 rp_info.pSubpasses = &subpass;
20034 result = vkCreateRenderPass(device(), &rp_info, NULL, &rp);
20035 ASSERT_VK_SUCCESS(result);
20036
20037 VkImageView *depthView = m_depthStencil->BindInfo();
20038 VkFramebufferCreateInfo fb_info = {};
20039 fb_info.sType = VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO;
20040 fb_info.pNext = NULL;
20041 fb_info.renderPass = rp;
20042 fb_info.attachmentCount = 1;
20043 fb_info.pAttachments = depthView;
20044 fb_info.width = 100;
20045 fb_info.height = 100;
20046 fb_info.layers = 1;
20047 VkFramebuffer fb;
20048 result = vkCreateFramebuffer(device(), &fb_info, NULL, &fb);
20049 ASSERT_VK_SUCCESS(result);
20050
20051 VkRenderPassBeginInfo rpbinfo = {};
20052 rpbinfo.clearValueCount = 1;
20053 rpbinfo.pClearValues = &clear;
20054 rpbinfo.pNext = NULL;
20055 rpbinfo.renderPass = rp;
20056 rpbinfo.sType = VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO;
20057 rpbinfo.renderArea.extent.width = 100;
20058 rpbinfo.renderArea.extent.height = 100;
20059 rpbinfo.renderArea.offset.x = 0;
20060 rpbinfo.renderArea.offset.y = 0;
20061 rpbinfo.framebuffer = fb;
20062
20063 VkFence fence = {};
20064 VkFenceCreateInfo fence_ci = {};
20065 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20066 fence_ci.pNext = nullptr;
20067 fence_ci.flags = 0;
20068 result = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fence);
20069 ASSERT_VK_SUCCESS(result);
20070
20071 m_commandBuffer->BeginCommandBuffer();
20072 m_commandBuffer->BeginRenderPass(rpbinfo);
20073 m_commandBuffer->EndRenderPass();
20074 m_commandBuffer->EndCommandBuffer();
20075 m_commandBuffer->QueueCommandBuffer(fence);
20076
20077 VkImageObj destImage(m_device);
20078 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 -070020079 VK_IMAGE_TILING_OPTIMAL, 0);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020080 VkImageMemoryBarrier barrier = {};
20081 VkImageSubresourceRange range;
20082 barrier.sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER;
20083 barrier.srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20084 barrier.dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_READ_BIT;
20085 barrier.oldLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
20086 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL;
20087 barrier.image = m_depthStencil->handle();
20088 range.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20089 range.baseMipLevel = 0;
20090 range.levelCount = 1;
20091 range.baseArrayLayer = 0;
20092 range.layerCount = 1;
20093 barrier.subresourceRange = range;
20094 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20095 VkCommandBufferObj cmdbuf(m_device, m_commandPool);
20096 cmdbuf.BeginCommandBuffer();
20097 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 -070020098 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020099 barrier.srcAccessMask = 0;
20100 barrier.oldLayout = VK_IMAGE_LAYOUT_UNDEFINED;
20101 barrier.newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL;
20102 barrier.image = destImage.handle();
20103 barrier.dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT | VK_ACCESS_DEPTH_STENCIL_ATTACHMENT_WRITE_BIT;
20104 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 -070020105 &barrier);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020106 VkImageCopy cregion;
20107 cregion.srcSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20108 cregion.srcSubresource.mipLevel = 0;
20109 cregion.srcSubresource.baseArrayLayer = 0;
20110 cregion.srcSubresource.layerCount = 1;
20111 cregion.srcOffset.x = 0;
20112 cregion.srcOffset.y = 0;
20113 cregion.srcOffset.z = 0;
20114 cregion.dstSubresource.aspectMask = VK_IMAGE_ASPECT_DEPTH_BIT | VK_IMAGE_ASPECT_STENCIL_BIT;
20115 cregion.dstSubresource.mipLevel = 0;
20116 cregion.dstSubresource.baseArrayLayer = 0;
20117 cregion.dstSubresource.layerCount = 1;
20118 cregion.dstOffset.x = 0;
20119 cregion.dstOffset.y = 0;
20120 cregion.dstOffset.z = 0;
20121 cregion.extent.width = 100;
20122 cregion.extent.height = 100;
20123 cregion.extent.depth = 1;
20124 cmdbuf.CopyImage(m_depthStencil->handle(), VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, destImage.handle(),
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020125 VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, &cregion);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020126 cmdbuf.EndCommandBuffer();
20127
20128 VkSubmitInfo submit_info;
20129 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20130 submit_info.pNext = NULL;
20131 submit_info.waitSemaphoreCount = 0;
20132 submit_info.pWaitSemaphores = NULL;
20133 submit_info.pWaitDstStageMask = NULL;
20134 submit_info.commandBufferCount = 1;
20135 submit_info.pCommandBuffers = &cmdbuf.handle();
20136 submit_info.signalSemaphoreCount = 0;
20137 submit_info.pSignalSemaphores = NULL;
20138
20139 m_errorMonitor->ExpectSuccess();
20140 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20141 m_errorMonitor->VerifyNotFound();
20142
20143 vkQueueWaitIdle(m_device->m_queue);
20144 vkDestroyFence(m_device->device(), fence, nullptr);
20145 vkDestroyRenderPass(m_device->device(), rp, nullptr);
20146 vkDestroyFramebuffer(m_device->device(), fb, nullptr);
20147}
20148
20149// This is a positive test. No errors should be generated.
20150TEST_F(VkPositiveLayerTest, WaitEventThenSet) {
20151 TEST_DESCRIPTION("Wait on a event then set it after the wait has been submitted.");
20152
20153 m_errorMonitor->ExpectSuccess();
20154 ASSERT_NO_FATAL_FAILURE(InitState());
20155
20156 VkEvent event;
20157 VkEventCreateInfo event_create_info{};
20158 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20159 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20160
20161 VkCommandPool command_pool;
20162 VkCommandPoolCreateInfo pool_create_info{};
20163 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20164 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20165 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20166 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20167
20168 VkCommandBuffer command_buffer;
20169 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20170 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20171 command_buffer_allocate_info.commandPool = command_pool;
20172 command_buffer_allocate_info.commandBufferCount = 1;
20173 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20174 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20175
20176 VkQueue queue = VK_NULL_HANDLE;
20177 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20178
20179 {
20180 VkCommandBufferBeginInfo begin_info{};
20181 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20182 vkBeginCommandBuffer(command_buffer, &begin_info);
20183
20184 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 -070020185 nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020186 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
20187 vkEndCommandBuffer(command_buffer);
20188 }
20189 {
20190 VkSubmitInfo submit_info{};
20191 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20192 submit_info.commandBufferCount = 1;
20193 submit_info.pCommandBuffers = &command_buffer;
20194 submit_info.signalSemaphoreCount = 0;
20195 submit_info.pSignalSemaphores = nullptr;
20196 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20197 }
20198 { vkSetEvent(m_device->device(), event); }
20199
20200 vkQueueWaitIdle(queue);
20201
20202 vkDestroyEvent(m_device->device(), event, nullptr);
20203 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20204 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20205
20206 m_errorMonitor->VerifyNotFound();
20207}
20208// This is a positive test. No errors should be generated.
20209TEST_F(VkPositiveLayerTest, QueryAndCopySecondaryCommandBuffers) {
20210 TEST_DESCRIPTION("Issue a query on a secondary command buffery and copy it on a primary.");
20211
20212 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020213 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020214
20215 m_errorMonitor->ExpectSuccess();
20216
20217 VkQueryPool query_pool;
20218 VkQueryPoolCreateInfo query_pool_create_info{};
20219 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20220 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20221 query_pool_create_info.queryCount = 1;
20222 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20223
20224 VkCommandPool command_pool;
20225 VkCommandPoolCreateInfo pool_create_info{};
20226 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20227 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20228 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20229 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20230
20231 VkCommandBuffer command_buffer;
20232 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20233 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20234 command_buffer_allocate_info.commandPool = command_pool;
20235 command_buffer_allocate_info.commandBufferCount = 1;
20236 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20237 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20238
20239 VkCommandBuffer secondary_command_buffer;
20240 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_SECONDARY;
20241 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &secondary_command_buffer);
20242
20243 VkQueue queue = VK_NULL_HANDLE;
20244 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20245
20246 uint32_t qfi = 0;
20247 VkBufferCreateInfo buff_create_info = {};
20248 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20249 buff_create_info.size = 1024;
20250 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20251 buff_create_info.queueFamilyIndexCount = 1;
20252 buff_create_info.pQueueFamilyIndices = &qfi;
20253
20254 VkResult err;
20255 VkBuffer buffer;
20256 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20257 ASSERT_VK_SUCCESS(err);
20258 VkMemoryAllocateInfo mem_alloc = {};
20259 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20260 mem_alloc.pNext = NULL;
20261 mem_alloc.allocationSize = 1024;
20262 mem_alloc.memoryTypeIndex = 0;
20263
20264 VkMemoryRequirements memReqs;
20265 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20266 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20267 if (!pass) {
20268 vkDestroyBuffer(m_device->device(), buffer, NULL);
20269 return;
20270 }
20271
20272 VkDeviceMemory mem;
20273 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20274 ASSERT_VK_SUCCESS(err);
20275 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20276 ASSERT_VK_SUCCESS(err);
20277
20278 VkCommandBufferInheritanceInfo hinfo = {};
20279 hinfo.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_INHERITANCE_INFO;
20280 hinfo.renderPass = VK_NULL_HANDLE;
20281 hinfo.subpass = 0;
20282 hinfo.framebuffer = VK_NULL_HANDLE;
20283 hinfo.occlusionQueryEnable = VK_FALSE;
20284 hinfo.queryFlags = 0;
20285 hinfo.pipelineStatistics = 0;
20286
20287 {
20288 VkCommandBufferBeginInfo begin_info{};
20289 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20290 begin_info.pInheritanceInfo = &hinfo;
20291 vkBeginCommandBuffer(secondary_command_buffer, &begin_info);
20292
20293 vkCmdResetQueryPool(secondary_command_buffer, query_pool, 0, 1);
20294 vkCmdWriteTimestamp(secondary_command_buffer, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20295
20296 vkEndCommandBuffer(secondary_command_buffer);
20297
20298 begin_info.pInheritanceInfo = nullptr;
20299 vkBeginCommandBuffer(command_buffer, &begin_info);
20300
20301 vkCmdExecuteCommands(command_buffer, 1, &secondary_command_buffer);
20302 vkCmdCopyQueryPoolResults(command_buffer, query_pool, 0, 1, buffer, 0, 0, 0);
20303
20304 vkEndCommandBuffer(command_buffer);
20305 }
20306 {
20307 VkSubmitInfo submit_info{};
20308 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20309 submit_info.commandBufferCount = 1;
20310 submit_info.pCommandBuffers = &command_buffer;
20311 submit_info.signalSemaphoreCount = 0;
20312 submit_info.pSignalSemaphores = nullptr;
20313 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20314 }
20315
20316 vkQueueWaitIdle(queue);
20317
20318 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
20319 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20320 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &secondary_command_buffer);
20321 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20322 vkDestroyBuffer(m_device->device(), buffer, NULL);
20323 vkFreeMemory(m_device->device(), mem, NULL);
20324
20325 m_errorMonitor->VerifyNotFound();
20326}
20327
20328// This is a positive test. No errors should be generated.
20329TEST_F(VkPositiveLayerTest, QueryAndCopyMultipleCommandBuffers) {
20330 TEST_DESCRIPTION("Issue a query and copy from it on a second command buffer.");
20331
20332 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020333 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020334
20335 m_errorMonitor->ExpectSuccess();
20336
20337 VkQueryPool query_pool;
20338 VkQueryPoolCreateInfo query_pool_create_info{};
20339 query_pool_create_info.sType = VK_STRUCTURE_TYPE_QUERY_POOL_CREATE_INFO;
20340 query_pool_create_info.queryType = VK_QUERY_TYPE_TIMESTAMP;
20341 query_pool_create_info.queryCount = 1;
20342 vkCreateQueryPool(m_device->device(), &query_pool_create_info, nullptr, &query_pool);
20343
20344 VkCommandPool command_pool;
20345 VkCommandPoolCreateInfo pool_create_info{};
20346 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20347 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20348 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20349 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20350
20351 VkCommandBuffer command_buffer[2];
20352 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20353 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20354 command_buffer_allocate_info.commandPool = command_pool;
20355 command_buffer_allocate_info.commandBufferCount = 2;
20356 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20357 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20358
20359 VkQueue queue = VK_NULL_HANDLE;
20360 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20361
20362 uint32_t qfi = 0;
20363 VkBufferCreateInfo buff_create_info = {};
20364 buff_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
20365 buff_create_info.size = 1024;
20366 buff_create_info.usage = VK_BUFFER_USAGE_TRANSFER_DST_BIT;
20367 buff_create_info.queueFamilyIndexCount = 1;
20368 buff_create_info.pQueueFamilyIndices = &qfi;
20369
20370 VkResult err;
20371 VkBuffer buffer;
20372 err = vkCreateBuffer(m_device->device(), &buff_create_info, NULL, &buffer);
20373 ASSERT_VK_SUCCESS(err);
20374 VkMemoryAllocateInfo mem_alloc = {};
20375 mem_alloc.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
20376 mem_alloc.pNext = NULL;
20377 mem_alloc.allocationSize = 1024;
20378 mem_alloc.memoryTypeIndex = 0;
20379
20380 VkMemoryRequirements memReqs;
20381 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memReqs);
20382 bool pass = m_device->phy().set_memory_type(memReqs.memoryTypeBits, &mem_alloc, 0);
20383 if (!pass) {
20384 vkDestroyBuffer(m_device->device(), buffer, NULL);
20385 return;
20386 }
20387
20388 VkDeviceMemory mem;
20389 err = vkAllocateMemory(m_device->device(), &mem_alloc, NULL, &mem);
20390 ASSERT_VK_SUCCESS(err);
20391 err = vkBindBufferMemory(m_device->device(), buffer, mem, 0);
20392 ASSERT_VK_SUCCESS(err);
20393
20394 {
20395 VkCommandBufferBeginInfo begin_info{};
20396 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20397 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20398
20399 vkCmdResetQueryPool(command_buffer[0], query_pool, 0, 1);
20400 vkCmdWriteTimestamp(command_buffer[0], VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, query_pool, 0);
20401
20402 vkEndCommandBuffer(command_buffer[0]);
20403
20404 vkBeginCommandBuffer(command_buffer[1], &begin_info);
20405
20406 vkCmdCopyQueryPoolResults(command_buffer[1], query_pool, 0, 1, buffer, 0, 0, 0);
20407
20408 vkEndCommandBuffer(command_buffer[1]);
20409 }
20410 {
20411 VkSubmitInfo submit_info{};
20412 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20413 submit_info.commandBufferCount = 2;
20414 submit_info.pCommandBuffers = command_buffer;
20415 submit_info.signalSemaphoreCount = 0;
20416 submit_info.pSignalSemaphores = nullptr;
20417 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20418 }
20419
20420 vkQueueWaitIdle(queue);
20421
20422 vkDestroyQueryPool(m_device->device(), query_pool, nullptr);
20423 vkFreeCommandBuffers(m_device->device(), command_pool, 2, command_buffer);
20424 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20425 vkDestroyBuffer(m_device->device(), buffer, NULL);
20426 vkFreeMemory(m_device->device(), mem, NULL);
20427
20428 m_errorMonitor->VerifyNotFound();
20429}
20430
Tony Barbourc46924f2016-11-04 11:49:52 -060020431TEST_F(VkLayerTest, ResetEventThenSet) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020432 TEST_DESCRIPTION("Reset an event then set it after the reset has been submitted.");
20433
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020434 ASSERT_NO_FATAL_FAILURE(InitState());
20435 VkEvent event;
20436 VkEventCreateInfo event_create_info{};
20437 event_create_info.sType = VK_STRUCTURE_TYPE_EVENT_CREATE_INFO;
20438 vkCreateEvent(m_device->device(), &event_create_info, nullptr, &event);
20439
20440 VkCommandPool command_pool;
20441 VkCommandPoolCreateInfo pool_create_info{};
20442 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20443 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20444 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20445 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20446
20447 VkCommandBuffer command_buffer;
20448 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20449 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20450 command_buffer_allocate_info.commandPool = command_pool;
20451 command_buffer_allocate_info.commandBufferCount = 1;
20452 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20453 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, &command_buffer);
20454
20455 VkQueue queue = VK_NULL_HANDLE;
20456 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20457
20458 {
20459 VkCommandBufferBeginInfo begin_info{};
20460 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20461 vkBeginCommandBuffer(command_buffer, &begin_info);
20462
20463 vkCmdResetEvent(command_buffer, event, VK_PIPELINE_STAGE_ALL_COMMANDS_BIT);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020464 vkEndCommandBuffer(command_buffer);
20465 }
20466 {
20467 VkSubmitInfo submit_info{};
20468 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20469 submit_info.commandBufferCount = 1;
20470 submit_info.pCommandBuffers = &command_buffer;
20471 submit_info.signalSemaphoreCount = 0;
20472 submit_info.pSignalSemaphores = nullptr;
20473 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20474 }
20475 {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020476 m_errorMonitor->SetDesiredFailureMsg(VK_DEBUG_REPORT_ERROR_BIT_EXT,
20477 "that is already in use by a "
20478 "command buffer.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020479 vkSetEvent(m_device->device(), event);
20480 m_errorMonitor->VerifyFound();
20481 }
20482
20483 vkQueueWaitIdle(queue);
20484
20485 vkDestroyEvent(m_device->device(), event, nullptr);
20486 vkFreeCommandBuffers(m_device->device(), command_pool, 1, &command_buffer);
20487 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20488}
20489
20490// This is a positive test. No errors should be generated.
20491TEST_F(VkPositiveLayerTest, TwoFencesThreeFrames) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020492 TEST_DESCRIPTION(
20493 "Two command buffers with two separate fences are each "
20494 "run through a Submit & WaitForFences cycle 3 times. This "
20495 "previously revealed a bug so running this positive test "
20496 "to prevent a regression.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020497 m_errorMonitor->ExpectSuccess();
20498
20499 ASSERT_NO_FATAL_FAILURE(InitState());
20500 VkQueue queue = VK_NULL_HANDLE;
20501 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 0, &queue);
20502
20503 static const uint32_t NUM_OBJECTS = 2;
20504 static const uint32_t NUM_FRAMES = 3;
20505 VkCommandBuffer cmd_buffers[NUM_OBJECTS] = {};
20506 VkFence fences[NUM_OBJECTS] = {};
20507
20508 VkCommandPool cmd_pool;
20509 VkCommandPoolCreateInfo cmd_pool_ci = {};
20510 cmd_pool_ci.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20511 cmd_pool_ci.queueFamilyIndex = m_device->graphics_queue_node_index_;
20512 cmd_pool_ci.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20513 VkResult err = vkCreateCommandPool(m_device->device(), &cmd_pool_ci, nullptr, &cmd_pool);
20514 ASSERT_VK_SUCCESS(err);
20515
20516 VkCommandBufferAllocateInfo cmd_buf_info = {};
20517 cmd_buf_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20518 cmd_buf_info.commandPool = cmd_pool;
20519 cmd_buf_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20520 cmd_buf_info.commandBufferCount = 1;
20521
20522 VkFenceCreateInfo fence_ci = {};
20523 fence_ci.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20524 fence_ci.pNext = nullptr;
20525 fence_ci.flags = 0;
20526
20527 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
20528 err = vkAllocateCommandBuffers(m_device->device(), &cmd_buf_info, &cmd_buffers[i]);
20529 ASSERT_VK_SUCCESS(err);
20530 err = vkCreateFence(m_device->device(), &fence_ci, nullptr, &fences[i]);
20531 ASSERT_VK_SUCCESS(err);
20532 }
20533
20534 for (uint32_t frame = 0; frame < NUM_FRAMES; ++frame) {
20535 for (uint32_t obj = 0; obj < NUM_OBJECTS; ++obj) {
20536 // Create empty cmd buffer
20537 VkCommandBufferBeginInfo cmdBufBeginDesc = {};
20538 cmdBufBeginDesc.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20539
20540 err = vkBeginCommandBuffer(cmd_buffers[obj], &cmdBufBeginDesc);
20541 ASSERT_VK_SUCCESS(err);
20542 err = vkEndCommandBuffer(cmd_buffers[obj]);
20543 ASSERT_VK_SUCCESS(err);
20544
20545 VkSubmitInfo submit_info = {};
20546 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20547 submit_info.commandBufferCount = 1;
20548 submit_info.pCommandBuffers = &cmd_buffers[obj];
20549 // Submit cmd buffer and wait for fence
20550 err = vkQueueSubmit(queue, 1, &submit_info, fences[obj]);
20551 ASSERT_VK_SUCCESS(err);
20552 err = vkWaitForFences(m_device->device(), 1, &fences[obj], VK_TRUE, UINT64_MAX);
20553 ASSERT_VK_SUCCESS(err);
20554 err = vkResetFences(m_device->device(), 1, &fences[obj]);
20555 ASSERT_VK_SUCCESS(err);
20556 }
20557 }
20558 m_errorMonitor->VerifyNotFound();
20559 vkDestroyCommandPool(m_device->device(), cmd_pool, NULL);
20560 for (uint32_t i = 0; i < NUM_OBJECTS; ++i) {
20561 vkDestroyFence(m_device->device(), fences[i], nullptr);
20562 }
20563}
20564// This is a positive test. No errors should be generated.
20565TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWI) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020566 TEST_DESCRIPTION(
20567 "Two command buffers, each in a separate QueueSubmit call "
20568 "submitted on separate queues followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020569
20570 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020571 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020572
20573 m_errorMonitor->ExpectSuccess();
20574
20575 VkSemaphore semaphore;
20576 VkSemaphoreCreateInfo semaphore_create_info{};
20577 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
20578 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
20579
20580 VkCommandPool command_pool;
20581 VkCommandPoolCreateInfo pool_create_info{};
20582 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20583 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20584 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20585 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20586
20587 VkCommandBuffer command_buffer[2];
20588 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20589 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20590 command_buffer_allocate_info.commandPool = command_pool;
20591 command_buffer_allocate_info.commandBufferCount = 2;
20592 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20593 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20594
20595 VkQueue queue = VK_NULL_HANDLE;
20596 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20597
20598 {
20599 VkCommandBufferBeginInfo begin_info{};
20600 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20601 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20602
20603 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 -070020604 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020605
20606 VkViewport viewport{};
20607 viewport.maxDepth = 1.0f;
20608 viewport.minDepth = 0.0f;
20609 viewport.width = 512;
20610 viewport.height = 512;
20611 viewport.x = 0;
20612 viewport.y = 0;
20613 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
20614 vkEndCommandBuffer(command_buffer[0]);
20615 }
20616 {
20617 VkCommandBufferBeginInfo begin_info{};
20618 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20619 vkBeginCommandBuffer(command_buffer[1], &begin_info);
20620
20621 VkViewport viewport{};
20622 viewport.maxDepth = 1.0f;
20623 viewport.minDepth = 0.0f;
20624 viewport.width = 512;
20625 viewport.height = 512;
20626 viewport.x = 0;
20627 viewport.y = 0;
20628 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
20629 vkEndCommandBuffer(command_buffer[1]);
20630 }
20631 {
20632 VkSubmitInfo submit_info{};
20633 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20634 submit_info.commandBufferCount = 1;
20635 submit_info.pCommandBuffers = &command_buffer[0];
20636 submit_info.signalSemaphoreCount = 1;
20637 submit_info.pSignalSemaphores = &semaphore;
20638 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20639 }
20640 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020641 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020642 VkSubmitInfo submit_info{};
20643 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20644 submit_info.commandBufferCount = 1;
20645 submit_info.pCommandBuffers = &command_buffer[1];
20646 submit_info.waitSemaphoreCount = 1;
20647 submit_info.pWaitSemaphores = &semaphore;
20648 submit_info.pWaitDstStageMask = flags;
20649 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
20650 }
20651
20652 vkQueueWaitIdle(m_device->m_queue);
20653
20654 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
20655 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
20656 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20657
20658 m_errorMonitor->VerifyNotFound();
20659}
20660
20661// This is a positive test. No errors should be generated.
20662TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceQWIFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020663 TEST_DESCRIPTION(
20664 "Two command buffers, each in a separate QueueSubmit call "
20665 "submitted on separate queues, the second having a fence"
20666 "followed by a QueueWaitIdle.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020667
20668 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020669 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020670
20671 m_errorMonitor->ExpectSuccess();
20672
20673 VkFence fence;
20674 VkFenceCreateInfo fence_create_info{};
20675 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20676 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
20677
20678 VkSemaphore semaphore;
20679 VkSemaphoreCreateInfo semaphore_create_info{};
20680 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
20681 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
20682
20683 VkCommandPool command_pool;
20684 VkCommandPoolCreateInfo pool_create_info{};
20685 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20686 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20687 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20688 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20689
20690 VkCommandBuffer command_buffer[2];
20691 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20692 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20693 command_buffer_allocate_info.commandPool = command_pool;
20694 command_buffer_allocate_info.commandBufferCount = 2;
20695 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20696 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20697
20698 VkQueue queue = VK_NULL_HANDLE;
20699 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20700
20701 {
20702 VkCommandBufferBeginInfo begin_info{};
20703 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20704 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20705
20706 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 -070020707 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020708
20709 VkViewport viewport{};
20710 viewport.maxDepth = 1.0f;
20711 viewport.minDepth = 0.0f;
20712 viewport.width = 512;
20713 viewport.height = 512;
20714 viewport.x = 0;
20715 viewport.y = 0;
20716 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
20717 vkEndCommandBuffer(command_buffer[0]);
20718 }
20719 {
20720 VkCommandBufferBeginInfo begin_info{};
20721 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20722 vkBeginCommandBuffer(command_buffer[1], &begin_info);
20723
20724 VkViewport viewport{};
20725 viewport.maxDepth = 1.0f;
20726 viewport.minDepth = 0.0f;
20727 viewport.width = 512;
20728 viewport.height = 512;
20729 viewport.x = 0;
20730 viewport.y = 0;
20731 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
20732 vkEndCommandBuffer(command_buffer[1]);
20733 }
20734 {
20735 VkSubmitInfo submit_info{};
20736 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20737 submit_info.commandBufferCount = 1;
20738 submit_info.pCommandBuffers = &command_buffer[0];
20739 submit_info.signalSemaphoreCount = 1;
20740 submit_info.pSignalSemaphores = &semaphore;
20741 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20742 }
20743 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020744 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020745 VkSubmitInfo submit_info{};
20746 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20747 submit_info.commandBufferCount = 1;
20748 submit_info.pCommandBuffers = &command_buffer[1];
20749 submit_info.waitSemaphoreCount = 1;
20750 submit_info.pWaitSemaphores = &semaphore;
20751 submit_info.pWaitDstStageMask = flags;
20752 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
20753 }
20754
20755 vkQueueWaitIdle(m_device->m_queue);
20756
20757 vkDestroyFence(m_device->device(), fence, nullptr);
20758 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
20759 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
20760 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20761
20762 m_errorMonitor->VerifyNotFound();
20763}
20764
20765// This is a positive test. No errors should be generated.
20766TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFenceTwoWFF) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020767 TEST_DESCRIPTION(
20768 "Two command buffers, each in a separate QueueSubmit call "
20769 "submitted on separate queues, the second having a fence"
20770 "followed by two consecutive WaitForFences calls on the same fence.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020771
20772 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020773 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020774
20775 m_errorMonitor->ExpectSuccess();
20776
20777 VkFence fence;
20778 VkFenceCreateInfo fence_create_info{};
20779 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20780 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
20781
20782 VkSemaphore semaphore;
20783 VkSemaphoreCreateInfo semaphore_create_info{};
20784 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
20785 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
20786
20787 VkCommandPool command_pool;
20788 VkCommandPoolCreateInfo pool_create_info{};
20789 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20790 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20791 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20792 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20793
20794 VkCommandBuffer command_buffer[2];
20795 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20796 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20797 command_buffer_allocate_info.commandPool = command_pool;
20798 command_buffer_allocate_info.commandBufferCount = 2;
20799 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20800 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20801
20802 VkQueue queue = VK_NULL_HANDLE;
20803 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20804
20805 {
20806 VkCommandBufferBeginInfo begin_info{};
20807 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20808 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20809
20810 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 -070020811 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020812
20813 VkViewport viewport{};
20814 viewport.maxDepth = 1.0f;
20815 viewport.minDepth = 0.0f;
20816 viewport.width = 512;
20817 viewport.height = 512;
20818 viewport.x = 0;
20819 viewport.y = 0;
20820 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
20821 vkEndCommandBuffer(command_buffer[0]);
20822 }
20823 {
20824 VkCommandBufferBeginInfo begin_info{};
20825 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20826 vkBeginCommandBuffer(command_buffer[1], &begin_info);
20827
20828 VkViewport viewport{};
20829 viewport.maxDepth = 1.0f;
20830 viewport.minDepth = 0.0f;
20831 viewport.width = 512;
20832 viewport.height = 512;
20833 viewport.x = 0;
20834 viewport.y = 0;
20835 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
20836 vkEndCommandBuffer(command_buffer[1]);
20837 }
20838 {
20839 VkSubmitInfo submit_info{};
20840 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20841 submit_info.commandBufferCount = 1;
20842 submit_info.pCommandBuffers = &command_buffer[0];
20843 submit_info.signalSemaphoreCount = 1;
20844 submit_info.pSignalSemaphores = &semaphore;
20845 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
20846 }
20847 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020848 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020849 VkSubmitInfo submit_info{};
20850 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
20851 submit_info.commandBufferCount = 1;
20852 submit_info.pCommandBuffers = &command_buffer[1];
20853 submit_info.waitSemaphoreCount = 1;
20854 submit_info.pWaitSemaphores = &semaphore;
20855 submit_info.pWaitDstStageMask = flags;
20856 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
20857 }
20858
20859 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20860 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
20861
20862 vkDestroyFence(m_device->device(), fence, nullptr);
20863 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
20864 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
20865 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
20866
20867 m_errorMonitor->VerifyNotFound();
20868}
20869
20870TEST_F(VkPositiveLayerTest, TwoQueuesEnsureCorrectRetirementWithWorkStolen) {
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020871 ASSERT_NO_FATAL_FAILURE(InitState());
20872 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070020873 printf(" Test requires two queues, skipping\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020874 return;
20875 }
20876
20877 VkResult err;
20878
20879 m_errorMonitor->ExpectSuccess();
20880
20881 VkQueue q0 = m_device->m_queue;
20882 VkQueue q1 = nullptr;
20883 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &q1);
20884 ASSERT_NE(q1, nullptr);
20885
20886 // An (empty) command buffer. We must have work in the first submission --
20887 // the layer treats unfenced work differently from fenced work.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020888 VkCommandPoolCreateInfo cpci = {VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO, nullptr, 0, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020889 VkCommandPool pool;
20890 err = vkCreateCommandPool(m_device->device(), &cpci, nullptr, &pool);
20891 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020892 VkCommandBufferAllocateInfo cbai = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO, nullptr, pool,
20893 VK_COMMAND_BUFFER_LEVEL_PRIMARY, 1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020894 VkCommandBuffer cb;
20895 err = vkAllocateCommandBuffers(m_device->device(), &cbai, &cb);
20896 ASSERT_VK_SUCCESS(err);
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020897 VkCommandBufferBeginInfo cbbi = {VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020898 err = vkBeginCommandBuffer(cb, &cbbi);
20899 ASSERT_VK_SUCCESS(err);
20900 err = vkEndCommandBuffer(cb);
20901 ASSERT_VK_SUCCESS(err);
20902
20903 // A semaphore
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020904 VkSemaphoreCreateInfo sci = {VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO, nullptr, 0};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020905 VkSemaphore s;
20906 err = vkCreateSemaphore(m_device->device(), &sci, nullptr, &s);
20907 ASSERT_VK_SUCCESS(err);
20908
20909 // First submission, to q0
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020910 VkSubmitInfo s0 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr, 1, &cb, 1, &s};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020911
20912 err = vkQueueSubmit(q0, 1, &s0, VK_NULL_HANDLE);
20913 ASSERT_VK_SUCCESS(err);
20914
20915 // Second submission, to q1, waiting on s
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020916 VkFlags waitmask = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT; // doesn't really matter what this value is.
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070020917 VkSubmitInfo s1 = {VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 1, &s, &waitmask, 0, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020918
20919 err = vkQueueSubmit(q1, 1, &s1, VK_NULL_HANDLE);
20920 ASSERT_VK_SUCCESS(err);
20921
20922 // Wait for q0 idle
20923 err = vkQueueWaitIdle(q0);
20924 ASSERT_VK_SUCCESS(err);
20925
20926 // Command buffer should have been completed (it was on q0); reset the pool.
20927 vkFreeCommandBuffers(m_device->device(), pool, 1, &cb);
20928
20929 m_errorMonitor->VerifyNotFound();
20930
20931 // Force device completely idle and clean up resources
20932 vkDeviceWaitIdle(m_device->device());
20933 vkDestroyCommandPool(m_device->device(), pool, nullptr);
20934 vkDestroySemaphore(m_device->device(), s, nullptr);
20935}
20936
20937// This is a positive test. No errors should be generated.
20938TEST_F(VkPositiveLayerTest, TwoQueueSubmitsSeparateQueuesWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020939 TEST_DESCRIPTION(
20940 "Two command buffers, each in a separate QueueSubmit call "
20941 "submitted on separate queues, the second having a fence, "
20942 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020943
20944 ASSERT_NO_FATAL_FAILURE(InitState());
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070020945 if ((m_device->queue_props.empty()) || (m_device->queue_props[0].queueCount < 2)) return;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020946
20947 m_errorMonitor->ExpectSuccess();
20948
20949 ASSERT_NO_FATAL_FAILURE(InitState());
20950 VkFence fence;
20951 VkFenceCreateInfo fence_create_info{};
20952 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
20953 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
20954
20955 VkSemaphore semaphore;
20956 VkSemaphoreCreateInfo semaphore_create_info{};
20957 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
20958 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
20959
20960 VkCommandPool command_pool;
20961 VkCommandPoolCreateInfo pool_create_info{};
20962 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
20963 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
20964 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
20965 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
20966
20967 VkCommandBuffer command_buffer[2];
20968 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
20969 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
20970 command_buffer_allocate_info.commandPool = command_pool;
20971 command_buffer_allocate_info.commandBufferCount = 2;
20972 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
20973 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
20974
20975 VkQueue queue = VK_NULL_HANDLE;
20976 vkGetDeviceQueue(m_device->device(), m_device->graphics_queue_node_index_, 1, &queue);
20977
20978 {
20979 VkCommandBufferBeginInfo begin_info{};
20980 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20981 vkBeginCommandBuffer(command_buffer[0], &begin_info);
20982
20983 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 -070020984 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060020985
20986 VkViewport viewport{};
20987 viewport.maxDepth = 1.0f;
20988 viewport.minDepth = 0.0f;
20989 viewport.width = 512;
20990 viewport.height = 512;
20991 viewport.x = 0;
20992 viewport.y = 0;
20993 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
20994 vkEndCommandBuffer(command_buffer[0]);
20995 }
20996 {
20997 VkCommandBufferBeginInfo begin_info{};
20998 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
20999 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21000
21001 VkViewport viewport{};
21002 viewport.maxDepth = 1.0f;
21003 viewport.minDepth = 0.0f;
21004 viewport.width = 512;
21005 viewport.height = 512;
21006 viewport.x = 0;
21007 viewport.y = 0;
21008 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21009 vkEndCommandBuffer(command_buffer[1]);
21010 }
21011 {
21012 VkSubmitInfo submit_info{};
21013 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21014 submit_info.commandBufferCount = 1;
21015 submit_info.pCommandBuffers = &command_buffer[0];
21016 submit_info.signalSemaphoreCount = 1;
21017 submit_info.pSignalSemaphores = &semaphore;
21018 vkQueueSubmit(queue, 1, &submit_info, VK_NULL_HANDLE);
21019 }
21020 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021021 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021022 VkSubmitInfo submit_info{};
21023 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21024 submit_info.commandBufferCount = 1;
21025 submit_info.pCommandBuffers = &command_buffer[1];
21026 submit_info.waitSemaphoreCount = 1;
21027 submit_info.pWaitSemaphores = &semaphore;
21028 submit_info.pWaitDstStageMask = flags;
21029 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21030 }
21031
21032 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21033
21034 vkDestroyFence(m_device->device(), fence, nullptr);
21035 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21036 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21037 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21038
21039 m_errorMonitor->VerifyNotFound();
21040}
21041
21042// This is a positive test. No errors should be generated.
21043TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueWithSemaphoreAndOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021044 TEST_DESCRIPTION(
21045 "Two command buffers, each in a separate QueueSubmit call "
21046 "on the same queue, sharing a signal/wait semaphore, the "
21047 "second having a fence, "
21048 "followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021049
21050 m_errorMonitor->ExpectSuccess();
21051
21052 ASSERT_NO_FATAL_FAILURE(InitState());
21053 VkFence fence;
21054 VkFenceCreateInfo fence_create_info{};
21055 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21056 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21057
21058 VkSemaphore semaphore;
21059 VkSemaphoreCreateInfo semaphore_create_info{};
21060 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21061 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21062
21063 VkCommandPool command_pool;
21064 VkCommandPoolCreateInfo pool_create_info{};
21065 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21066 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21067 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21068 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21069
21070 VkCommandBuffer command_buffer[2];
21071 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21072 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21073 command_buffer_allocate_info.commandPool = command_pool;
21074 command_buffer_allocate_info.commandBufferCount = 2;
21075 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21076 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21077
21078 {
21079 VkCommandBufferBeginInfo begin_info{};
21080 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21081 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21082
21083 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 -070021084 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021085
21086 VkViewport viewport{};
21087 viewport.maxDepth = 1.0f;
21088 viewport.minDepth = 0.0f;
21089 viewport.width = 512;
21090 viewport.height = 512;
21091 viewport.x = 0;
21092 viewport.y = 0;
21093 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21094 vkEndCommandBuffer(command_buffer[0]);
21095 }
21096 {
21097 VkCommandBufferBeginInfo begin_info{};
21098 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21099 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21100
21101 VkViewport viewport{};
21102 viewport.maxDepth = 1.0f;
21103 viewport.minDepth = 0.0f;
21104 viewport.width = 512;
21105 viewport.height = 512;
21106 viewport.x = 0;
21107 viewport.y = 0;
21108 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21109 vkEndCommandBuffer(command_buffer[1]);
21110 }
21111 {
21112 VkSubmitInfo submit_info{};
21113 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21114 submit_info.commandBufferCount = 1;
21115 submit_info.pCommandBuffers = &command_buffer[0];
21116 submit_info.signalSemaphoreCount = 1;
21117 submit_info.pSignalSemaphores = &semaphore;
21118 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21119 }
21120 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021121 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021122 VkSubmitInfo submit_info{};
21123 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21124 submit_info.commandBufferCount = 1;
21125 submit_info.pCommandBuffers = &command_buffer[1];
21126 submit_info.waitSemaphoreCount = 1;
21127 submit_info.pWaitSemaphores = &semaphore;
21128 submit_info.pWaitDstStageMask = flags;
21129 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21130 }
21131
21132 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21133
21134 vkDestroyFence(m_device->device(), fence, nullptr);
21135 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21136 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21137 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21138
21139 m_errorMonitor->VerifyNotFound();
21140}
21141
21142// This is a positive test. No errors should be generated.
21143TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueNullQueueSubmitWithFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021144 TEST_DESCRIPTION(
21145 "Two command buffers, each in a separate QueueSubmit call "
21146 "on the same queue, no fences, followed by a third QueueSubmit with NO "
21147 "SubmitInfos but with a fence, followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021148
21149 m_errorMonitor->ExpectSuccess();
21150
21151 ASSERT_NO_FATAL_FAILURE(InitState());
21152 VkFence fence;
21153 VkFenceCreateInfo fence_create_info{};
21154 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21155 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21156
21157 VkCommandPool command_pool;
21158 VkCommandPoolCreateInfo pool_create_info{};
21159 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21160 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21161 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21162 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21163
21164 VkCommandBuffer command_buffer[2];
21165 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21166 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21167 command_buffer_allocate_info.commandPool = command_pool;
21168 command_buffer_allocate_info.commandBufferCount = 2;
21169 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21170 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21171
21172 {
21173 VkCommandBufferBeginInfo begin_info{};
21174 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21175 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21176
21177 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 -070021178 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021179
21180 VkViewport viewport{};
21181 viewport.maxDepth = 1.0f;
21182 viewport.minDepth = 0.0f;
21183 viewport.width = 512;
21184 viewport.height = 512;
21185 viewport.x = 0;
21186 viewport.y = 0;
21187 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21188 vkEndCommandBuffer(command_buffer[0]);
21189 }
21190 {
21191 VkCommandBufferBeginInfo begin_info{};
21192 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21193 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21194
21195 VkViewport viewport{};
21196 viewport.maxDepth = 1.0f;
21197 viewport.minDepth = 0.0f;
21198 viewport.width = 512;
21199 viewport.height = 512;
21200 viewport.x = 0;
21201 viewport.y = 0;
21202 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21203 vkEndCommandBuffer(command_buffer[1]);
21204 }
21205 {
21206 VkSubmitInfo submit_info{};
21207 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21208 submit_info.commandBufferCount = 1;
21209 submit_info.pCommandBuffers = &command_buffer[0];
21210 submit_info.signalSemaphoreCount = 0;
21211 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21212 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21213 }
21214 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021215 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021216 VkSubmitInfo submit_info{};
21217 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21218 submit_info.commandBufferCount = 1;
21219 submit_info.pCommandBuffers = &command_buffer[1];
21220 submit_info.waitSemaphoreCount = 0;
21221 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21222 submit_info.pWaitDstStageMask = flags;
21223 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21224 }
21225
21226 vkQueueSubmit(m_device->m_queue, 0, NULL, fence);
21227
21228 VkResult err = vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21229 ASSERT_VK_SUCCESS(err);
21230
21231 vkDestroyFence(m_device->device(), fence, nullptr);
21232 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21233 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21234
21235 m_errorMonitor->VerifyNotFound();
21236}
21237
21238// This is a positive test. No errors should be generated.
21239TEST_F(VkPositiveLayerTest, TwoQueueSubmitsOneQueueOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021240 TEST_DESCRIPTION(
21241 "Two command buffers, each in a separate QueueSubmit call "
21242 "on the same queue, the second having a fence, followed "
21243 "by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021244
21245 m_errorMonitor->ExpectSuccess();
21246
21247 ASSERT_NO_FATAL_FAILURE(InitState());
21248 VkFence fence;
21249 VkFenceCreateInfo fence_create_info{};
21250 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21251 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21252
21253 VkCommandPool command_pool;
21254 VkCommandPoolCreateInfo pool_create_info{};
21255 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21256 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21257 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21258 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21259
21260 VkCommandBuffer command_buffer[2];
21261 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21262 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21263 command_buffer_allocate_info.commandPool = command_pool;
21264 command_buffer_allocate_info.commandBufferCount = 2;
21265 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21266 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21267
21268 {
21269 VkCommandBufferBeginInfo begin_info{};
21270 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21271 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21272
21273 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 -070021274 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021275
21276 VkViewport viewport{};
21277 viewport.maxDepth = 1.0f;
21278 viewport.minDepth = 0.0f;
21279 viewport.width = 512;
21280 viewport.height = 512;
21281 viewport.x = 0;
21282 viewport.y = 0;
21283 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21284 vkEndCommandBuffer(command_buffer[0]);
21285 }
21286 {
21287 VkCommandBufferBeginInfo begin_info{};
21288 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21289 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21290
21291 VkViewport viewport{};
21292 viewport.maxDepth = 1.0f;
21293 viewport.minDepth = 0.0f;
21294 viewport.width = 512;
21295 viewport.height = 512;
21296 viewport.x = 0;
21297 viewport.y = 0;
21298 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21299 vkEndCommandBuffer(command_buffer[1]);
21300 }
21301 {
21302 VkSubmitInfo submit_info{};
21303 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21304 submit_info.commandBufferCount = 1;
21305 submit_info.pCommandBuffers = &command_buffer[0];
21306 submit_info.signalSemaphoreCount = 0;
21307 submit_info.pSignalSemaphores = VK_NULL_HANDLE;
21308 vkQueueSubmit(m_device->m_queue, 1, &submit_info, VK_NULL_HANDLE);
21309 }
21310 {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021311 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021312 VkSubmitInfo submit_info{};
21313 submit_info.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21314 submit_info.commandBufferCount = 1;
21315 submit_info.pCommandBuffers = &command_buffer[1];
21316 submit_info.waitSemaphoreCount = 0;
21317 submit_info.pWaitSemaphores = VK_NULL_HANDLE;
21318 submit_info.pWaitDstStageMask = flags;
21319 vkQueueSubmit(m_device->m_queue, 1, &submit_info, fence);
21320 }
21321
21322 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21323
21324 vkDestroyFence(m_device->device(), fence, nullptr);
21325 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21326 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21327
21328 m_errorMonitor->VerifyNotFound();
21329}
21330
21331// This is a positive test. No errors should be generated.
21332TEST_F(VkPositiveLayerTest, TwoSubmitInfosWithSemaphoreOneQueueSubmitsOneFence) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021333 TEST_DESCRIPTION(
21334 "Two command buffers each in a separate SubmitInfo sent in a single "
21335 "QueueSubmit call followed by a WaitForFences call.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021336 ASSERT_NO_FATAL_FAILURE(InitState());
21337
21338 m_errorMonitor->ExpectSuccess();
21339
21340 VkFence fence;
21341 VkFenceCreateInfo fence_create_info{};
21342 fence_create_info.sType = VK_STRUCTURE_TYPE_FENCE_CREATE_INFO;
21343 vkCreateFence(m_device->device(), &fence_create_info, nullptr, &fence);
21344
21345 VkSemaphore semaphore;
21346 VkSemaphoreCreateInfo semaphore_create_info{};
21347 semaphore_create_info.sType = VK_STRUCTURE_TYPE_SEMAPHORE_CREATE_INFO;
21348 vkCreateSemaphore(m_device->device(), &semaphore_create_info, nullptr, &semaphore);
21349
21350 VkCommandPool command_pool;
21351 VkCommandPoolCreateInfo pool_create_info{};
21352 pool_create_info.sType = VK_STRUCTURE_TYPE_COMMAND_POOL_CREATE_INFO;
21353 pool_create_info.queueFamilyIndex = m_device->graphics_queue_node_index_;
21354 pool_create_info.flags = VK_COMMAND_POOL_CREATE_RESET_COMMAND_BUFFER_BIT;
21355 vkCreateCommandPool(m_device->device(), &pool_create_info, nullptr, &command_pool);
21356
21357 VkCommandBuffer command_buffer[2];
21358 VkCommandBufferAllocateInfo command_buffer_allocate_info{};
21359 command_buffer_allocate_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_ALLOCATE_INFO;
21360 command_buffer_allocate_info.commandPool = command_pool;
21361 command_buffer_allocate_info.commandBufferCount = 2;
21362 command_buffer_allocate_info.level = VK_COMMAND_BUFFER_LEVEL_PRIMARY;
21363 vkAllocateCommandBuffers(m_device->device(), &command_buffer_allocate_info, command_buffer);
21364
21365 {
21366 VkCommandBufferBeginInfo begin_info{};
21367 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21368 vkBeginCommandBuffer(command_buffer[0], &begin_info);
21369
21370 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 -070021371 nullptr, 0, nullptr, 0, nullptr);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021372
21373 VkViewport viewport{};
21374 viewport.maxDepth = 1.0f;
21375 viewport.minDepth = 0.0f;
21376 viewport.width = 512;
21377 viewport.height = 512;
21378 viewport.x = 0;
21379 viewport.y = 0;
21380 vkCmdSetViewport(command_buffer[0], 0, 1, &viewport);
21381 vkEndCommandBuffer(command_buffer[0]);
21382 }
21383 {
21384 VkCommandBufferBeginInfo begin_info{};
21385 begin_info.sType = VK_STRUCTURE_TYPE_COMMAND_BUFFER_BEGIN_INFO;
21386 vkBeginCommandBuffer(command_buffer[1], &begin_info);
21387
21388 VkViewport viewport{};
21389 viewport.maxDepth = 1.0f;
21390 viewport.minDepth = 0.0f;
21391 viewport.width = 512;
21392 viewport.height = 512;
21393 viewport.x = 0;
21394 viewport.y = 0;
21395 vkCmdSetViewport(command_buffer[1], 0, 1, &viewport);
21396 vkEndCommandBuffer(command_buffer[1]);
21397 }
21398 {
21399 VkSubmitInfo submit_info[2];
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021400 VkPipelineStageFlags flags[]{VK_PIPELINE_STAGE_ALL_COMMANDS_BIT};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021401
21402 submit_info[0].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21403 submit_info[0].pNext = NULL;
21404 submit_info[0].commandBufferCount = 1;
21405 submit_info[0].pCommandBuffers = &command_buffer[0];
21406 submit_info[0].signalSemaphoreCount = 1;
21407 submit_info[0].pSignalSemaphores = &semaphore;
21408 submit_info[0].waitSemaphoreCount = 0;
21409 submit_info[0].pWaitSemaphores = NULL;
21410 submit_info[0].pWaitDstStageMask = 0;
21411
21412 submit_info[1].sType = VK_STRUCTURE_TYPE_SUBMIT_INFO;
21413 submit_info[1].pNext = NULL;
21414 submit_info[1].commandBufferCount = 1;
21415 submit_info[1].pCommandBuffers = &command_buffer[1];
21416 submit_info[1].waitSemaphoreCount = 1;
21417 submit_info[1].pWaitSemaphores = &semaphore;
21418 submit_info[1].pWaitDstStageMask = flags;
21419 submit_info[1].signalSemaphoreCount = 0;
21420 submit_info[1].pSignalSemaphores = NULL;
21421 vkQueueSubmit(m_device->m_queue, 2, &submit_info[0], fence);
21422 }
21423
21424 vkWaitForFences(m_device->device(), 1, &fence, VK_TRUE, UINT64_MAX);
21425
21426 vkDestroyFence(m_device->device(), fence, nullptr);
21427 vkFreeCommandBuffers(m_device->device(), command_pool, 2, &command_buffer[0]);
21428 vkDestroyCommandPool(m_device->device(), command_pool, NULL);
21429 vkDestroySemaphore(m_device->device(), semaphore, nullptr);
21430
21431 m_errorMonitor->VerifyNotFound();
21432}
21433
21434TEST_F(VkPositiveLayerTest, RenderPassSecondaryCommandBuffersMultipleTimes) {
21435 m_errorMonitor->ExpectSuccess();
21436
21437 ASSERT_NO_FATAL_FAILURE(InitState());
21438 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21439
Tony Barbour552f6c02016-12-21 14:34:07 -070021440 m_commandBuffer->BeginCommandBuffer();
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021441
21442 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_SECONDARY_COMMAND_BUFFERS);
21443 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
21444 m_errorMonitor->VerifyNotFound();
21445 vkCmdBeginRenderPass(m_commandBuffer->GetBufferHandle(), &m_renderPassBeginInfo, VK_SUBPASS_CONTENTS_INLINE);
21446 m_errorMonitor->VerifyNotFound();
21447 vkCmdEndRenderPass(m_commandBuffer->GetBufferHandle());
21448 m_errorMonitor->VerifyNotFound();
21449
21450 m_commandBuffer->EndCommandBuffer();
21451 m_errorMonitor->VerifyNotFound();
21452}
21453
21454TEST_F(VkPositiveLayerTest, ValidRenderPassAttachmentLayoutWithLoadOp) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021455 TEST_DESCRIPTION(
21456 "Positive test where we create a renderpass with an "
21457 "attachment that uses LOAD_OP_CLEAR, the first subpass "
21458 "has a valid layout, and a second subpass then uses a "
21459 "valid *READ_ONLY* layout.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021460 m_errorMonitor->ExpectSuccess();
21461 ASSERT_NO_FATAL_FAILURE(InitState());
Tony Barbourf887b162017-03-09 10:06:46 -070021462 auto depth_format = find_depth_stencil_format(m_device);
21463 if (!depth_format) {
21464 printf(" No Depth + Stencil format found. Skipped.\n");
21465 return;
21466 }
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021467
21468 VkAttachmentReference attach[2] = {};
21469 attach[0].attachment = 0;
21470 attach[0].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21471 attach[1].attachment = 0;
21472 attach[1].layout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
21473 VkSubpassDescription subpasses[2] = {};
21474 // First subpass clears DS attach on load
21475 subpasses[0].pDepthStencilAttachment = &attach[0];
21476 // 2nd subpass reads in DS as input attachment
21477 subpasses[1].inputAttachmentCount = 1;
21478 subpasses[1].pInputAttachments = &attach[1];
21479 VkAttachmentDescription attach_desc = {};
Tony Barbourf887b162017-03-09 10:06:46 -070021480 attach_desc.format = depth_format;
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021481 attach_desc.samples = VK_SAMPLE_COUNT_1_BIT;
21482 attach_desc.storeOp = VK_ATTACHMENT_STORE_OP_STORE;
21483 attach_desc.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE;
21484 attach_desc.loadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21485 attach_desc.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_CLEAR;
21486 attach_desc.initialLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL;
21487 attach_desc.finalLayout = VK_IMAGE_LAYOUT_DEPTH_STENCIL_READ_ONLY_OPTIMAL;
21488 VkRenderPassCreateInfo rpci = {};
21489 rpci.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO;
21490 rpci.attachmentCount = 1;
21491 rpci.pAttachments = &attach_desc;
21492 rpci.subpassCount = 2;
21493 rpci.pSubpasses = subpasses;
21494
21495 // Now create RenderPass and verify no errors
21496 VkRenderPass rp;
21497 vkCreateRenderPass(m_device->device(), &rpci, NULL, &rp);
21498 m_errorMonitor->VerifyNotFound();
21499
21500 vkDestroyRenderPass(m_device->device(), rp, NULL);
21501}
21502
Tobin Ehlis01103de2017-02-16 13:22:47 -070021503TEST_F(VkPositiveLayerTest, RenderPassDepthStencilLayoutTransition) {
21504 TEST_DESCRIPTION(
21505 "Create a render pass with depth-stencil attachment where layout transition "
21506 "from UNDEFINED TO DS_READ_ONLY_OPTIMAL is set by render pass and verify that "
21507 "transition has correctly occurred at queue submit time with no validation errors.");
21508
Tony Barbourf887b162017-03-09 10:06:46 -070021509 ASSERT_NO_FATAL_FAILURE(InitState());
21510 auto depth_format = find_depth_stencil_format(m_device);
21511 if (!depth_format) {
21512 printf(" No Depth + Stencil format found. Skipped.\n");
21513 return;
21514 }
Tobin Ehlis01103de2017-02-16 13:22:47 -070021515 VkImageFormatProperties format_props;
Tony Barbourf887b162017-03-09 10:06:46 -070021516 vkGetPhysicalDeviceImageFormatProperties(gpu(), depth_format, VK_IMAGE_TYPE_2D, VK_IMAGE_TILING_OPTIMAL,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021517 VK_IMAGE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT, 0, &format_props);
21518 if (format_props.maxExtent.width < 32 || format_props.maxExtent.height < 32) {
Tony Barbourf887b162017-03-09 10:06:46 -070021519 printf("Depth extent too small, RenderPassDepthStencilLayoutTransition skipped.\n");
Tobin Ehlis01103de2017-02-16 13:22:47 -070021520 return;
21521 }
21522
21523 m_errorMonitor->ExpectSuccess();
Tobin Ehlis01103de2017-02-16 13:22:47 -070021524 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21525
21526 // A renderpass with one depth/stencil attachment.
21527 VkAttachmentDescription attachment = {0,
Tony Barbourf887b162017-03-09 10:06:46 -070021528 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021529 VK_SAMPLE_COUNT_1_BIT,
21530 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21531 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21532 VK_ATTACHMENT_LOAD_OP_DONT_CARE,
21533 VK_ATTACHMENT_STORE_OP_DONT_CARE,
21534 VK_IMAGE_LAYOUT_UNDEFINED,
21535 VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
21536
21537 VkAttachmentReference att_ref = {0, VK_IMAGE_LAYOUT_DEPTH_STENCIL_ATTACHMENT_OPTIMAL};
21538
21539 VkSubpassDescription subpass = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 0, nullptr, 0, nullptr, nullptr, &att_ref, 0, nullptr};
21540
21541 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 1, &attachment, 1, &subpass, 0, nullptr};
21542
21543 VkRenderPass rp;
21544 VkResult err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
21545 ASSERT_VK_SUCCESS(err);
21546 // A compatible ds image.
21547 VkImageObj image(m_device);
Tony Barbourf887b162017-03-09 10:06:46 -070021548 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 -070021549 ASSERT_TRUE(image.initialized());
21550
21551 VkImageViewCreateInfo ivci = {
21552 VK_STRUCTURE_TYPE_IMAGE_VIEW_CREATE_INFO,
21553 nullptr,
21554 0,
21555 image.handle(),
21556 VK_IMAGE_VIEW_TYPE_2D,
Tony Barbourf887b162017-03-09 10:06:46 -070021557 depth_format,
Tobin Ehlis01103de2017-02-16 13:22:47 -070021558 {VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY, VK_COMPONENT_SWIZZLE_IDENTITY,
21559 VK_COMPONENT_SWIZZLE_IDENTITY},
21560 {VK_IMAGE_ASPECT_DEPTH_BIT, 0, 1, 0, 1},
21561 };
21562 VkImageView view;
21563 err = vkCreateImageView(m_device->device(), &ivci, nullptr, &view);
21564 ASSERT_VK_SUCCESS(err);
21565
21566 VkFramebufferCreateInfo fci = {VK_STRUCTURE_TYPE_FRAMEBUFFER_CREATE_INFO, nullptr, 0, rp, 1, &view, 32, 32, 1};
21567 VkFramebuffer fb;
21568 err = vkCreateFramebuffer(m_device->device(), &fci, nullptr, &fb);
21569 ASSERT_VK_SUCCESS(err);
21570
21571 VkRenderPassBeginInfo rpbi = {VK_STRUCTURE_TYPE_RENDER_PASS_BEGIN_INFO, nullptr, rp, fb, {{0, 0}, {32, 32}}, 0, nullptr};
21572 m_commandBuffer->BeginCommandBuffer();
21573 vkCmdBeginRenderPass(m_commandBuffer->handle(), &rpbi, VK_SUBPASS_CONTENTS_INLINE);
21574 vkCmdEndRenderPass(m_commandBuffer->handle());
21575 m_commandBuffer->EndCommandBuffer();
21576 QueueCommandBuffer(false);
21577 m_errorMonitor->VerifyNotFound();
21578
21579 // Cleanup
21580 vkDestroyImageView(m_device->device(), view, NULL);
21581 vkDestroyRenderPass(m_device->device(), rp, NULL);
21582 vkDestroyFramebuffer(m_device->device(), fb, NULL);
21583}
21584
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021585TEST_F(VkPositiveLayerTest, CreatePipelineAttribMatrixType) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021586 TEST_DESCRIPTION(
21587 "Test that pipeline validation accepts matrices passed "
21588 "as vertex attributes");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021589 m_errorMonitor->ExpectSuccess();
21590
21591 ASSERT_NO_FATAL_FAILURE(InitState());
21592 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21593
21594 VkVertexInputBindingDescription input_binding;
21595 memset(&input_binding, 0, sizeof(input_binding));
21596
21597 VkVertexInputAttributeDescription input_attribs[2];
21598 memset(input_attribs, 0, sizeof(input_attribs));
21599
21600 for (int i = 0; i < 2; i++) {
21601 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
21602 input_attribs[i].location = i;
21603 }
21604
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021605 char const *vsSource =
21606 "#version 450\n"
21607 "\n"
21608 "layout(location=0) in mat2x4 x;\n"
21609 "out gl_PerVertex {\n"
21610 " vec4 gl_Position;\n"
21611 "};\n"
21612 "void main(){\n"
21613 " gl_Position = x[0] + x[1];\n"
21614 "}\n";
21615 char const *fsSource =
21616 "#version 450\n"
21617 "\n"
21618 "layout(location=0) out vec4 color;\n"
21619 "void main(){\n"
21620 " color = vec4(1);\n"
21621 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021622
21623 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
21624 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
21625
21626 VkPipelineObj pipe(m_device);
21627 pipe.AddColorAttachment();
21628 pipe.AddShader(&vs);
21629 pipe.AddShader(&fs);
21630
21631 pipe.AddVertexInputBindings(&input_binding, 1);
21632 pipe.AddVertexInputAttribs(input_attribs, 2);
21633
21634 VkDescriptorSetObj descriptorSet(m_device);
21635 descriptorSet.AppendDummy();
21636 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
21637
21638 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
21639
21640 /* expect success */
21641 m_errorMonitor->VerifyNotFound();
21642}
21643
21644TEST_F(VkPositiveLayerTest, CreatePipelineAttribArrayType) {
21645 m_errorMonitor->ExpectSuccess();
21646
21647 ASSERT_NO_FATAL_FAILURE(InitState());
21648 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21649
21650 VkVertexInputBindingDescription input_binding;
21651 memset(&input_binding, 0, sizeof(input_binding));
21652
21653 VkVertexInputAttributeDescription input_attribs[2];
21654 memset(input_attribs, 0, sizeof(input_attribs));
21655
21656 for (int i = 0; i < 2; i++) {
21657 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
21658 input_attribs[i].location = i;
21659 }
21660
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021661 char const *vsSource =
21662 "#version 450\n"
21663 "\n"
21664 "layout(location=0) in vec4 x[2];\n"
21665 "out gl_PerVertex {\n"
21666 " vec4 gl_Position;\n"
21667 "};\n"
21668 "void main(){\n"
21669 " gl_Position = x[0] + x[1];\n"
21670 "}\n";
21671 char const *fsSource =
21672 "#version 450\n"
21673 "\n"
21674 "layout(location=0) out vec4 color;\n"
21675 "void main(){\n"
21676 " color = vec4(1);\n"
21677 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021678
21679 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
21680 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
21681
21682 VkPipelineObj pipe(m_device);
21683 pipe.AddColorAttachment();
21684 pipe.AddShader(&vs);
21685 pipe.AddShader(&fs);
21686
21687 pipe.AddVertexInputBindings(&input_binding, 1);
21688 pipe.AddVertexInputAttribs(input_attribs, 2);
21689
21690 VkDescriptorSetObj descriptorSet(m_device);
21691 descriptorSet.AppendDummy();
21692 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
21693
21694 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
21695
21696 m_errorMonitor->VerifyNotFound();
21697}
21698
21699TEST_F(VkPositiveLayerTest, CreatePipelineAttribComponents) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021700 TEST_DESCRIPTION(
21701 "Test that pipeline validation accepts consuming a vertex attribute "
21702 "through multiple vertex shader inputs, each consuming a different "
21703 "subset of the components.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021704 m_errorMonitor->ExpectSuccess();
21705
21706 ASSERT_NO_FATAL_FAILURE(InitState());
21707 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21708
21709 VkVertexInputBindingDescription input_binding;
21710 memset(&input_binding, 0, sizeof(input_binding));
21711
21712 VkVertexInputAttributeDescription input_attribs[3];
21713 memset(input_attribs, 0, sizeof(input_attribs));
21714
21715 for (int i = 0; i < 3; i++) {
21716 input_attribs[i].format = VK_FORMAT_R32G32B32A32_SFLOAT;
21717 input_attribs[i].location = i;
21718 }
21719
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021720 char const *vsSource =
21721 "#version 450\n"
21722 "\n"
21723 "layout(location=0) in vec4 x;\n"
21724 "layout(location=1) in vec3 y1;\n"
21725 "layout(location=1, component=3) in float y2;\n"
21726 "layout(location=2) in vec4 z;\n"
21727 "out gl_PerVertex {\n"
21728 " vec4 gl_Position;\n"
21729 "};\n"
21730 "void main(){\n"
21731 " gl_Position = x + vec4(y1, y2) + z;\n"
21732 "}\n";
21733 char const *fsSource =
21734 "#version 450\n"
21735 "\n"
21736 "layout(location=0) out vec4 color;\n"
21737 "void main(){\n"
21738 " color = vec4(1);\n"
21739 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021740
21741 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
21742 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
21743
21744 VkPipelineObj pipe(m_device);
21745 pipe.AddColorAttachment();
21746 pipe.AddShader(&vs);
21747 pipe.AddShader(&fs);
21748
21749 pipe.AddVertexInputBindings(&input_binding, 1);
21750 pipe.AddVertexInputAttribs(input_attribs, 3);
21751
21752 VkDescriptorSetObj descriptorSet(m_device);
21753 descriptorSet.AppendDummy();
21754 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
21755
21756 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
21757
21758 m_errorMonitor->VerifyNotFound();
21759}
21760
21761TEST_F(VkPositiveLayerTest, CreatePipelineSimplePositive) {
21762 m_errorMonitor->ExpectSuccess();
21763
21764 ASSERT_NO_FATAL_FAILURE(InitState());
21765 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21766
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021767 char const *vsSource =
21768 "#version 450\n"
21769 "out gl_PerVertex {\n"
21770 " vec4 gl_Position;\n"
21771 "};\n"
21772 "void main(){\n"
21773 " gl_Position = vec4(0);\n"
21774 "}\n";
21775 char const *fsSource =
21776 "#version 450\n"
21777 "\n"
21778 "layout(location=0) out vec4 color;\n"
21779 "void main(){\n"
21780 " color = vec4(1);\n"
21781 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021782
21783 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
21784 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
21785
21786 VkPipelineObj pipe(m_device);
21787 pipe.AddColorAttachment();
21788 pipe.AddShader(&vs);
21789 pipe.AddShader(&fs);
21790
21791 VkDescriptorSetObj descriptorSet(m_device);
21792 descriptorSet.AppendDummy();
21793 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
21794
21795 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
21796
21797 m_errorMonitor->VerifyNotFound();
21798}
21799
21800TEST_F(VkPositiveLayerTest, CreatePipelineRelaxedTypeMatch) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021801 TEST_DESCRIPTION(
21802 "Test that pipeline validation accepts the relaxed type matching rules "
21803 "set out in 14.1.3: fundamental type must match, and producer side must "
21804 "have at least as many components");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021805 m_errorMonitor->ExpectSuccess();
21806
21807 // VK 1.0.8 Specification, 14.1.3 "Additionally,..." block
21808
21809 ASSERT_NO_FATAL_FAILURE(InitState());
21810 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21811
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021812 char const *vsSource =
21813 "#version 450\n"
21814 "out gl_PerVertex {\n"
21815 " vec4 gl_Position;\n"
21816 "};\n"
21817 "layout(location=0) out vec3 x;\n"
21818 "layout(location=1) out ivec3 y;\n"
21819 "layout(location=2) out vec3 z;\n"
21820 "void main(){\n"
21821 " gl_Position = vec4(0);\n"
21822 " x = vec3(0); y = ivec3(0); z = vec3(0);\n"
21823 "}\n";
21824 char const *fsSource =
21825 "#version 450\n"
21826 "\n"
21827 "layout(location=0) out vec4 color;\n"
21828 "layout(location=0) in float x;\n"
21829 "layout(location=1) flat in int y;\n"
21830 "layout(location=2) in vec2 z;\n"
21831 "void main(){\n"
21832 " color = vec4(1 + x + y + z.x);\n"
21833 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021834
21835 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
21836 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
21837
21838 VkPipelineObj pipe(m_device);
21839 pipe.AddColorAttachment();
21840 pipe.AddShader(&vs);
21841 pipe.AddShader(&fs);
21842
21843 VkDescriptorSetObj descriptorSet(m_device);
21844 descriptorSet.AppendDummy();
21845 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
21846
21847 VkResult err = VK_SUCCESS;
21848 err = pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
21849 ASSERT_VK_SUCCESS(err);
21850
21851 m_errorMonitor->VerifyNotFound();
21852}
21853
21854TEST_F(VkPositiveLayerTest, CreatePipelineTessPerVertex) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021855 TEST_DESCRIPTION(
21856 "Test that pipeline validation accepts per-vertex variables "
21857 "passed between the TCS and TES stages");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021858 m_errorMonitor->ExpectSuccess();
21859
21860 ASSERT_NO_FATAL_FAILURE(InitState());
21861 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21862
21863 if (!m_device->phy().features().tessellationShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070021864 printf(" Device does not support tessellation shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021865 return;
21866 }
21867
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021868 char const *vsSource =
21869 "#version 450\n"
21870 "void main(){}\n";
21871 char const *tcsSource =
21872 "#version 450\n"
21873 "layout(location=0) out int x[];\n"
21874 "layout(vertices=3) out;\n"
21875 "void main(){\n"
21876 " gl_TessLevelOuter[0] = gl_TessLevelOuter[1] = gl_TessLevelOuter[2] = 1;\n"
21877 " gl_TessLevelInner[0] = 1;\n"
21878 " x[gl_InvocationID] = gl_InvocationID;\n"
21879 "}\n";
21880 char const *tesSource =
21881 "#version 450\n"
21882 "layout(triangles, equal_spacing, cw) in;\n"
21883 "layout(location=0) in int x[];\n"
21884 "out gl_PerVertex { vec4 gl_Position; };\n"
21885 "void main(){\n"
21886 " gl_Position.xyz = gl_TessCoord;\n"
21887 " gl_Position.w = x[0] + x[1] + x[2];\n"
21888 "}\n";
21889 char const *fsSource =
21890 "#version 450\n"
21891 "layout(location=0) out vec4 color;\n"
21892 "void main(){\n"
21893 " color = vec4(1);\n"
21894 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021895
21896 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
21897 VkShaderObj tcs(m_device, tcsSource, VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, this);
21898 VkShaderObj tes(m_device, tesSource, VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, this);
21899 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
21900
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021901 VkPipelineInputAssemblyStateCreateInfo iasci{VK_STRUCTURE_TYPE_PIPELINE_INPUT_ASSEMBLY_STATE_CREATE_INFO, nullptr, 0,
21902 VK_PRIMITIVE_TOPOLOGY_PATCH_LIST, VK_FALSE};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021903
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070021904 VkPipelineTessellationStateCreateInfo tsci{VK_STRUCTURE_TYPE_PIPELINE_TESSELLATION_STATE_CREATE_INFO, nullptr, 0, 3};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021905
21906 VkPipelineObj pipe(m_device);
21907 pipe.SetInputAssembly(&iasci);
21908 pipe.SetTessellation(&tsci);
21909 pipe.AddColorAttachment();
21910 pipe.AddShader(&vs);
21911 pipe.AddShader(&tcs);
21912 pipe.AddShader(&tes);
21913 pipe.AddShader(&fs);
21914
21915 VkDescriptorSetObj descriptorSet(m_device);
21916 descriptorSet.AppendDummy();
21917 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
21918
21919 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
21920
21921 m_errorMonitor->VerifyNotFound();
21922}
21923
21924TEST_F(VkPositiveLayerTest, CreatePipelineGeometryInputBlockPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021925 TEST_DESCRIPTION(
21926 "Test that pipeline validation accepts a user-defined "
21927 "interface block passed into the geometry shader. This "
21928 "is interesting because the 'extra' array level is not "
21929 "present on the member type, but on the block instance.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021930 m_errorMonitor->ExpectSuccess();
21931
21932 ASSERT_NO_FATAL_FAILURE(InitState());
21933 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21934
21935 if (!m_device->phy().features().geometryShader) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070021936 printf(" Device does not support geometry shaders; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021937 return;
21938 }
21939
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021940 char const *vsSource =
21941 "#version 450\n"
21942 "layout(location=0) out VertexData { vec4 x; } vs_out;\n"
21943 "void main(){\n"
21944 " vs_out.x = vec4(1);\n"
21945 "}\n";
21946 char const *gsSource =
21947 "#version 450\n"
21948 "layout(triangles) in;\n"
21949 "layout(triangle_strip, max_vertices=3) out;\n"
21950 "layout(location=0) in VertexData { vec4 x; } gs_in[];\n"
21951 "out gl_PerVertex { vec4 gl_Position; };\n"
21952 "void main() {\n"
21953 " gl_Position = gs_in[0].x;\n"
21954 " EmitVertex();\n"
21955 "}\n";
21956 char const *fsSource =
21957 "#version 450\n"
21958 "layout(location=0) out vec4 color;\n"
21959 "void main(){\n"
21960 " color = vec4(1);\n"
21961 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021962
21963 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
21964 VkShaderObj gs(m_device, gsSource, VK_SHADER_STAGE_GEOMETRY_BIT, this);
21965 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
21966
21967 VkPipelineObj pipe(m_device);
21968 pipe.AddColorAttachment();
21969 pipe.AddShader(&vs);
21970 pipe.AddShader(&gs);
21971 pipe.AddShader(&fs);
21972
21973 VkDescriptorSetObj descriptorSet(m_device);
21974 descriptorSet.AppendDummy();
21975 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
21976
21977 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
21978
21979 m_errorMonitor->VerifyNotFound();
21980}
21981
21982TEST_F(VkPositiveLayerTest, CreatePipeline64BitAttributesPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070021983 TEST_DESCRIPTION(
21984 "Test that pipeline validation accepts basic use of 64bit vertex "
21985 "attributes. This is interesting because they consume multiple "
21986 "locations.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021987 m_errorMonitor->ExpectSuccess();
21988
21989 ASSERT_NO_FATAL_FAILURE(InitState());
21990 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
21991
21992 if (!m_device->phy().features().shaderFloat64) {
Mark Lobodzinskif8839bd2017-02-16 10:41:47 -070021993 printf(" Device does not support 64bit vertex attributes; skipped.\n");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060021994 return;
21995 }
21996
21997 VkVertexInputBindingDescription input_bindings[1];
21998 memset(input_bindings, 0, sizeof(input_bindings));
21999
22000 VkVertexInputAttributeDescription input_attribs[4];
22001 memset(input_attribs, 0, sizeof(input_attribs));
22002 input_attribs[0].location = 0;
22003 input_attribs[0].offset = 0;
22004 input_attribs[0].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22005 input_attribs[1].location = 2;
22006 input_attribs[1].offset = 32;
22007 input_attribs[1].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22008 input_attribs[2].location = 4;
22009 input_attribs[2].offset = 64;
22010 input_attribs[2].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22011 input_attribs[3].location = 6;
22012 input_attribs[3].offset = 96;
22013 input_attribs[3].format = VK_FORMAT_R64G64B64A64_SFLOAT;
22014
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022015 char const *vsSource =
22016 "#version 450\n"
22017 "\n"
22018 "layout(location=0) in dmat4 x;\n"
22019 "out gl_PerVertex {\n"
22020 " vec4 gl_Position;\n"
22021 "};\n"
22022 "void main(){\n"
22023 " gl_Position = vec4(x[0][0]);\n"
22024 "}\n";
22025 char const *fsSource =
22026 "#version 450\n"
22027 "\n"
22028 "layout(location=0) out vec4 color;\n"
22029 "void main(){\n"
22030 " color = vec4(1);\n"
22031 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022032
22033 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22034 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22035
22036 VkPipelineObj pipe(m_device);
22037 pipe.AddColorAttachment();
22038 pipe.AddShader(&vs);
22039 pipe.AddShader(&fs);
22040
22041 pipe.AddVertexInputBindings(input_bindings, 1);
22042 pipe.AddVertexInputAttribs(input_attribs, 4);
22043
22044 VkDescriptorSetObj descriptorSet(m_device);
22045 descriptorSet.AppendDummy();
22046 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22047
22048 pipe.CreateVKPipeline(descriptorSet.GetPipelineLayout(), renderPass());
22049
22050 m_errorMonitor->VerifyNotFound();
22051}
22052
22053TEST_F(VkPositiveLayerTest, CreatePipelineInputAttachmentPositive) {
22054 TEST_DESCRIPTION("Positive test for a correctly matched input attachment");
22055 m_errorMonitor->ExpectSuccess();
22056
22057 ASSERT_NO_FATAL_FAILURE(InitState());
22058
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022059 char const *vsSource =
22060 "#version 450\n"
22061 "\n"
22062 "out gl_PerVertex {\n"
22063 " vec4 gl_Position;\n"
22064 "};\n"
22065 "void main(){\n"
22066 " gl_Position = vec4(1);\n"
22067 "}\n";
22068 char const *fsSource =
22069 "#version 450\n"
22070 "\n"
22071 "layout(input_attachment_index=0, set=0, binding=0) uniform subpassInput x;\n"
22072 "layout(location=0) out vec4 color;\n"
22073 "void main() {\n"
22074 " color = subpassLoad(x);\n"
22075 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022076
22077 VkShaderObj vs(m_device, vsSource, VK_SHADER_STAGE_VERTEX_BIT, this);
22078 VkShaderObj fs(m_device, fsSource, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22079
22080 VkPipelineObj pipe(m_device);
22081 pipe.AddShader(&vs);
22082 pipe.AddShader(&fs);
22083 pipe.AddColorAttachment();
22084 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22085
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022086 VkDescriptorSetLayoutBinding dslb = {0, VK_DESCRIPTOR_TYPE_INPUT_ATTACHMENT, 1, VK_SHADER_STAGE_FRAGMENT_BIT, nullptr};
22087 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dslb};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022088 VkDescriptorSetLayout dsl;
22089 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22090 ASSERT_VK_SUCCESS(err);
22091
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022092 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022093 VkPipelineLayout pl;
22094 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22095 ASSERT_VK_SUCCESS(err);
22096
22097 VkAttachmentDescription descs[2] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022098 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22099 VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22100 VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL},
22101 {0, VK_FORMAT_R8G8B8A8_UNORM, VK_SAMPLE_COUNT_1_BIT, VK_ATTACHMENT_LOAD_OP_LOAD, VK_ATTACHMENT_STORE_OP_STORE,
22102 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 -060022103 };
22104 VkAttachmentReference color = {
22105 0, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL,
22106 };
22107 VkAttachmentReference input = {
22108 1, VK_IMAGE_LAYOUT_GENERAL,
22109 };
22110
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022111 VkSubpassDescription sd = {0, VK_PIPELINE_BIND_POINT_GRAPHICS, 1, &input, 1, &color, nullptr, nullptr, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022112
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022113 VkRenderPassCreateInfo rpci = {VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO, nullptr, 0, 2, descs, 1, &sd, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022114 VkRenderPass rp;
22115 err = vkCreateRenderPass(m_device->device(), &rpci, nullptr, &rp);
22116 ASSERT_VK_SUCCESS(err);
22117
22118 // should be OK. would go wrong here if it's going to...
22119 pipe.CreateVKPipeline(pl, rp);
22120
22121 m_errorMonitor->VerifyNotFound();
22122
22123 vkDestroyRenderPass(m_device->device(), rp, nullptr);
22124 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22125 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22126}
22127
22128TEST_F(VkPositiveLayerTest, CreateComputePipelineMissingDescriptorUnusedPositive) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022129 TEST_DESCRIPTION(
22130 "Test that pipeline validation accepts a compute pipeline which declares a "
22131 "descriptor-backed resource which is not provided, but the shader does not "
22132 "statically use it. This is interesting because it requires compute pipelines "
22133 "to have a proper descriptor use walk, which they didn't for some time.");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022134 m_errorMonitor->ExpectSuccess();
22135
22136 ASSERT_NO_FATAL_FAILURE(InitState());
22137
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022138 char const *csSource =
22139 "#version 450\n"
22140 "\n"
22141 "layout(local_size_x=1) in;\n"
22142 "layout(set=0, binding=0) buffer block { vec4 x; };\n"
22143 "void main(){\n"
22144 " // x is not used.\n"
22145 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022146
22147 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22148
22149 VkDescriptorSetObj descriptorSet(m_device);
22150 descriptorSet.CreateVKDescriptorSet(m_commandBuffer);
22151
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022152 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22153 nullptr,
22154 0,
22155 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22156 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22157 descriptorSet.GetPipelineLayout(),
22158 VK_NULL_HANDLE,
22159 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022160
22161 VkPipeline pipe;
22162 VkResult err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22163
22164 m_errorMonitor->VerifyNotFound();
22165
22166 if (err == VK_SUCCESS) {
22167 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22168 }
22169}
22170
22171TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsSampler) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022172 TEST_DESCRIPTION(
22173 "Test that pipeline validation accepts a shader consuming only the "
22174 "sampler portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022175 m_errorMonitor->ExpectSuccess();
22176
22177 ASSERT_NO_FATAL_FAILURE(InitState());
22178
22179 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022180 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22181 {1, VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22182 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022183 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022184 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022185 VkDescriptorSetLayout dsl;
22186 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22187 ASSERT_VK_SUCCESS(err);
22188
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022189 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022190 VkPipelineLayout pl;
22191 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22192 ASSERT_VK_SUCCESS(err);
22193
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022194 char const *csSource =
22195 "#version 450\n"
22196 "\n"
22197 "layout(local_size_x=1) in;\n"
22198 "layout(set=0, binding=0) uniform sampler s;\n"
22199 "layout(set=0, binding=1) uniform texture2D t;\n"
22200 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22201 "void main() {\n"
22202 " x = texture(sampler2D(t, s), vec2(0));\n"
22203 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022204 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22205
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022206 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22207 nullptr,
22208 0,
22209 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22210 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22211 pl,
22212 VK_NULL_HANDLE,
22213 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022214
22215 VkPipeline pipe;
22216 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22217
22218 m_errorMonitor->VerifyNotFound();
22219
22220 if (err == VK_SUCCESS) {
22221 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22222 }
22223
22224 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22225 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22226}
22227
22228TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsImage) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022229 TEST_DESCRIPTION(
22230 "Test that pipeline validation accepts a shader consuming only the "
22231 "image portion of a combined image + sampler");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022232 m_errorMonitor->ExpectSuccess();
22233
22234 ASSERT_NO_FATAL_FAILURE(InitState());
22235
22236 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022237 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22238 {1, VK_DESCRIPTOR_TYPE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22239 {2, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022240 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022241 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 3, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022242 VkDescriptorSetLayout dsl;
22243 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22244 ASSERT_VK_SUCCESS(err);
22245
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022246 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022247 VkPipelineLayout pl;
22248 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22249 ASSERT_VK_SUCCESS(err);
22250
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022251 char const *csSource =
22252 "#version 450\n"
22253 "\n"
22254 "layout(local_size_x=1) in;\n"
22255 "layout(set=0, binding=0) uniform texture2D t;\n"
22256 "layout(set=0, binding=1) uniform sampler s;\n"
22257 "layout(set=0, binding=2) buffer block { vec4 x; };\n"
22258 "void main() {\n"
22259 " x = texture(sampler2D(t, s), vec2(0));\n"
22260 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022261 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22262
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022263 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22264 nullptr,
22265 0,
22266 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22267 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22268 pl,
22269 VK_NULL_HANDLE,
22270 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022271
22272 VkPipeline pipe;
22273 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22274
22275 m_errorMonitor->VerifyNotFound();
22276
22277 if (err == VK_SUCCESS) {
22278 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22279 }
22280
22281 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22282 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22283}
22284
22285TEST_F(VkPositiveLayerTest, CreateComputePipelineCombinedImageSamplerConsumedAsBoth) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022286 TEST_DESCRIPTION(
22287 "Test that pipeline validation accepts a shader consuming "
22288 "both the sampler and the image of a combined image+sampler "
22289 "but via separate variables");
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022290 m_errorMonitor->ExpectSuccess();
22291
22292 ASSERT_NO_FATAL_FAILURE(InitState());
22293
22294 VkDescriptorSetLayoutBinding bindings[] = {
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022295 {0, VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
22296 {1, VK_DESCRIPTOR_TYPE_STORAGE_BUFFER, 1, VK_SHADER_STAGE_COMPUTE_BIT, nullptr},
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022297 };
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022298 VkDescriptorSetLayoutCreateInfo dslci = {VK_STRUCTURE_TYPE_DESCRIPTOR_SET_LAYOUT_CREATE_INFO, nullptr, 0, 2, bindings};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022299 VkDescriptorSetLayout dsl;
22300 VkResult err = vkCreateDescriptorSetLayout(m_device->device(), &dslci, nullptr, &dsl);
22301 ASSERT_VK_SUCCESS(err);
22302
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022303 VkPipelineLayoutCreateInfo plci = {VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO, nullptr, 0, 1, &dsl, 0, nullptr};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022304 VkPipelineLayout pl;
22305 err = vkCreatePipelineLayout(m_device->device(), &plci, nullptr, &pl);
22306 ASSERT_VK_SUCCESS(err);
22307
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022308 char const *csSource =
22309 "#version 450\n"
22310 "\n"
22311 "layout(local_size_x=1) in;\n"
22312 "layout(set=0, binding=0) uniform texture2D t;\n"
22313 "layout(set=0, binding=0) uniform sampler s; // both binding 0!\n"
22314 "layout(set=0, binding=1) buffer block { vec4 x; };\n"
22315 "void main() {\n"
22316 " x = texture(sampler2D(t, s), vec2(0));\n"
22317 "}\n";
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022318 VkShaderObj cs(m_device, csSource, VK_SHADER_STAGE_COMPUTE_BIT, this);
22319
Mark Lobodzinski729a8d32017-01-26 12:16:30 -070022320 VkComputePipelineCreateInfo cpci = {VK_STRUCTURE_TYPE_COMPUTE_PIPELINE_CREATE_INFO,
22321 nullptr,
22322 0,
22323 {VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO, nullptr, 0,
22324 VK_SHADER_STAGE_COMPUTE_BIT, cs.handle(), "main", nullptr},
22325 pl,
22326 VK_NULL_HANDLE,
22327 -1};
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022328
22329 VkPipeline pipe;
22330 err = vkCreateComputePipelines(m_device->device(), VK_NULL_HANDLE, 1, &cpci, nullptr, &pipe);
22331
22332 m_errorMonitor->VerifyNotFound();
22333
22334 if (err == VK_SUCCESS) {
22335 vkDestroyPipeline(m_device->device(), pipe, nullptr);
22336 }
22337
22338 vkDestroyPipelineLayout(m_device->device(), pl, nullptr);
22339 vkDestroyDescriptorSetLayout(m_device->device(), dsl, nullptr);
22340}
22341
22342TEST_F(VkPositiveLayerTest, ValidStructPNext) {
22343 TEST_DESCRIPTION("Verify that a valid pNext value is handled correctly");
22344
22345 ASSERT_NO_FATAL_FAILURE(InitState());
22346
22347 // Positive test to check parameter_validation and unique_objects support
22348 // for NV_dedicated_allocation
22349 uint32_t extension_count = 0;
22350 bool supports_nv_dedicated_allocation = false;
22351 VkResult err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, nullptr);
22352 ASSERT_VK_SUCCESS(err);
22353
22354 if (extension_count > 0) {
22355 std::vector<VkExtensionProperties> available_extensions(extension_count);
22356
22357 err = vkEnumerateDeviceExtensionProperties(gpu(), nullptr, &extension_count, &available_extensions[0]);
22358 ASSERT_VK_SUCCESS(err);
22359
22360 for (const auto &extension_props : available_extensions) {
22361 if (strcmp(extension_props.extensionName, VK_NV_DEDICATED_ALLOCATION_EXTENSION_NAME) == 0) {
22362 supports_nv_dedicated_allocation = true;
22363 }
22364 }
22365 }
22366
22367 if (supports_nv_dedicated_allocation) {
22368 m_errorMonitor->ExpectSuccess();
22369
22370 VkDedicatedAllocationBufferCreateInfoNV dedicated_buffer_create_info = {};
22371 dedicated_buffer_create_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_BUFFER_CREATE_INFO_NV;
22372 dedicated_buffer_create_info.pNext = nullptr;
22373 dedicated_buffer_create_info.dedicatedAllocation = VK_TRUE;
22374
22375 uint32_t queue_family_index = 0;
22376 VkBufferCreateInfo buffer_create_info = {};
22377 buffer_create_info.sType = VK_STRUCTURE_TYPE_BUFFER_CREATE_INFO;
22378 buffer_create_info.pNext = &dedicated_buffer_create_info;
22379 buffer_create_info.size = 1024;
22380 buffer_create_info.usage = VK_BUFFER_USAGE_UNIFORM_BUFFER_BIT;
22381 buffer_create_info.queueFamilyIndexCount = 1;
22382 buffer_create_info.pQueueFamilyIndices = &queue_family_index;
22383
22384 VkBuffer buffer;
Karl Schultz47dd59d2017-01-20 13:19:20 -070022385 err = vkCreateBuffer(m_device->device(), &buffer_create_info, NULL, &buffer);
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022386 ASSERT_VK_SUCCESS(err);
22387
22388 VkMemoryRequirements memory_reqs;
22389 vkGetBufferMemoryRequirements(m_device->device(), buffer, &memory_reqs);
22390
22391 VkDedicatedAllocationMemoryAllocateInfoNV dedicated_memory_info = {};
22392 dedicated_memory_info.sType = VK_STRUCTURE_TYPE_DEDICATED_ALLOCATION_MEMORY_ALLOCATE_INFO_NV;
22393 dedicated_memory_info.pNext = nullptr;
22394 dedicated_memory_info.buffer = buffer;
22395 dedicated_memory_info.image = VK_NULL_HANDLE;
22396
22397 VkMemoryAllocateInfo memory_info = {};
22398 memory_info.sType = VK_STRUCTURE_TYPE_MEMORY_ALLOCATE_INFO;
22399 memory_info.pNext = &dedicated_memory_info;
22400 memory_info.allocationSize = memory_reqs.size;
22401
22402 bool pass;
22403 pass = m_device->phy().set_memory_type(memory_reqs.memoryTypeBits, &memory_info, 0);
22404 ASSERT_TRUE(pass);
22405
22406 VkDeviceMemory buffer_memory;
22407 err = vkAllocateMemory(m_device->device(), &memory_info, NULL, &buffer_memory);
22408 ASSERT_VK_SUCCESS(err);
22409
22410 err = vkBindBufferMemory(m_device->device(), buffer, buffer_memory, 0);
22411 ASSERT_VK_SUCCESS(err);
22412
22413 vkDestroyBuffer(m_device->device(), buffer, NULL);
22414 vkFreeMemory(m_device->device(), buffer_memory, NULL);
22415
22416 m_errorMonitor->VerifyNotFound();
22417 }
22418}
22419
22420TEST_F(VkPositiveLayerTest, PSOPolygonModeValid) {
22421 VkResult err;
22422
22423 TEST_DESCRIPTION("Verify that using a solid polygon fill mode works correctly.");
22424
22425 ASSERT_NO_FATAL_FAILURE(InitState());
22426 ASSERT_NO_FATAL_FAILURE(InitRenderTarget());
22427
22428 std::vector<const char *> device_extension_names;
22429 auto features = m_device->phy().features();
22430 // Artificially disable support for non-solid fill modes
22431 features.fillModeNonSolid = false;
22432 // The sacrificial device object
22433 VkDeviceObj test_device(0, gpu(), device_extension_names, &features);
22434
22435 VkRenderpassObj render_pass(&test_device);
22436
22437 VkPipelineLayoutCreateInfo pipeline_layout_ci = {};
22438 pipeline_layout_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_LAYOUT_CREATE_INFO;
22439 pipeline_layout_ci.setLayoutCount = 0;
22440 pipeline_layout_ci.pSetLayouts = NULL;
22441
22442 VkPipelineLayout pipeline_layout;
22443 err = vkCreatePipelineLayout(test_device.device(), &pipeline_layout_ci, NULL, &pipeline_layout);
22444 ASSERT_VK_SUCCESS(err);
22445
22446 VkPipelineRasterizationStateCreateInfo rs_ci = {};
22447 rs_ci.sType = VK_STRUCTURE_TYPE_PIPELINE_RASTERIZATION_STATE_CREATE_INFO;
22448 rs_ci.pNext = nullptr;
22449 rs_ci.lineWidth = 1.0f;
22450 rs_ci.rasterizerDiscardEnable = true;
22451
22452 VkShaderObj vs(&test_device, bindStateVertShaderText, VK_SHADER_STAGE_VERTEX_BIT, this);
22453 VkShaderObj fs(&test_device, bindStateFragShaderText, VK_SHADER_STAGE_FRAGMENT_BIT, this);
22454
22455 // Set polygonMode=FILL. No error is expected
22456 m_errorMonitor->ExpectSuccess();
22457 {
22458 VkPipelineObj pipe(&test_device);
22459 pipe.AddShader(&vs);
22460 pipe.AddShader(&fs);
22461 pipe.AddColorAttachment();
22462 // Set polygonMode to a good value
22463 rs_ci.polygonMode = VK_POLYGON_MODE_FILL;
22464 pipe.SetRasterization(&rs_ci);
22465 pipe.CreateVKPipeline(pipeline_layout, render_pass.handle());
22466 }
22467 m_errorMonitor->VerifyNotFound();
22468
22469 vkDestroyPipelineLayout(test_device.device(), pipeline_layout, NULL);
22470}
22471
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022472#if 0 // A few devices have issues with this test so disabling for now
Mark Lobodzinski008b6ba2016-10-19 10:27:54 -060022473TEST_F(VkPositiveLayerTest, LongFenceChain)
22474{
22475 m_errorMonitor->ExpectSuccess();
22476
22477 ASSERT_NO_FATAL_FAILURE(InitState());
22478 VkResult err;
22479
22480 std::vector<VkFence> fences;
22481
22482 const int chainLength = 32768;
22483
22484 for (int i = 0; i < chainLength; i++) {
22485 VkFenceCreateInfo fci = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 };
22486 VkFence fence;
22487 err = vkCreateFence(m_device->device(), &fci, nullptr, &fence);
22488 ASSERT_VK_SUCCESS(err);
22489
22490 fences.push_back(fence);
22491
22492 VkSubmitInfo si = { VK_STRUCTURE_TYPE_SUBMIT_INFO, nullptr, 0, nullptr, nullptr,
22493 0, nullptr, 0, nullptr };
22494 err = vkQueueSubmit(m_device->m_queue, 1, &si, fence);
22495 ASSERT_VK_SUCCESS(err);
22496
22497 }
22498
22499 // BOOM, stack overflow.
22500 vkWaitForFences(m_device->device(), 1, &fences.back(), VK_TRUE, UINT64_MAX);
22501
22502 for (auto fence : fences)
22503 vkDestroyFence(m_device->device(), fence, nullptr);
22504
22505 m_errorMonitor->VerifyNotFound();
22506}
22507#endif
22508
Cody Northrop1242dfd2016-07-13 17:24:59 -060022509#if defined(ANDROID) && defined(VALIDATION_APK)
22510static bool initialized = false;
22511static bool active = false;
22512
22513// Convert Intents to argv
22514// Ported from Hologram sample, only difference is flexible key
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022515std::vector<std::string> get_args(android_app &app, const char *intent_extra_data_key) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060022516 std::vector<std::string> args;
22517 JavaVM &vm = *app.activity->vm;
22518 JNIEnv *p_env;
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022519 if (vm.AttachCurrentThread(&p_env, nullptr) != JNI_OK) return args;
Cody Northrop1242dfd2016-07-13 17:24:59 -060022520
22521 JNIEnv &env = *p_env;
22522 jobject activity = app.activity->clazz;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022523 jmethodID get_intent_method = env.GetMethodID(env.GetObjectClass(activity), "getIntent", "()Landroid/content/Intent;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060022524 jobject intent = env.CallObjectMethod(activity, get_intent_method);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022525 jmethodID get_string_extra_method =
22526 env.GetMethodID(env.GetObjectClass(intent), "getStringExtra", "(Ljava/lang/String;)Ljava/lang/String;");
Cody Northrop1242dfd2016-07-13 17:24:59 -060022527 jvalue get_string_extra_args;
22528 get_string_extra_args.l = env.NewStringUTF(intent_extra_data_key);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022529 jstring extra_str = static_cast<jstring>(env.CallObjectMethodA(intent, get_string_extra_method, &get_string_extra_args));
Cody Northrop1242dfd2016-07-13 17:24:59 -060022530
22531 std::string args_str;
22532 if (extra_str) {
22533 const char *extra_utf = env.GetStringUTFChars(extra_str, nullptr);
22534 args_str = extra_utf;
22535 env.ReleaseStringUTFChars(extra_str, extra_utf);
22536 env.DeleteLocalRef(extra_str);
22537 }
22538
22539 env.DeleteLocalRef(get_string_extra_args.l);
22540 env.DeleteLocalRef(intent);
22541 vm.DetachCurrentThread();
22542
22543 // split args_str
22544 std::stringstream ss(args_str);
22545 std::string arg;
22546 while (std::getline(ss, arg, ' ')) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022547 if (!arg.empty()) args.push_back(arg);
Cody Northrop1242dfd2016-07-13 17:24:59 -060022548 }
22549
22550 return args;
22551}
22552
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022553static int32_t processInput(struct android_app *app, AInputEvent *event) { return 0; }
Cody Northrop1242dfd2016-07-13 17:24:59 -060022554
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022555static void processCommand(struct android_app *app, int32_t cmd) {
22556 switch (cmd) {
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022557 case APP_CMD_INIT_WINDOW: {
22558 if (app->window) {
22559 initialized = true;
22560 }
22561 break;
Cody Northrop1242dfd2016-07-13 17:24:59 -060022562 }
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022563 case APP_CMD_GAINED_FOCUS: {
22564 active = true;
22565 break;
22566 }
22567 case APP_CMD_LOST_FOCUS: {
22568 active = false;
22569 break;
22570 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060022571 }
22572}
22573
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022574void android_main(struct android_app *app) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060022575 app_dummy();
22576
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022577 const char *appTag = "VulkanLayerValidationTests";
Cody Northrop1242dfd2016-07-13 17:24:59 -060022578
22579 int vulkanSupport = InitVulkan();
22580 if (vulkanSupport == 0) {
22581 __android_log_print(ANDROID_LOG_INFO, appTag, "==== FAILED ==== No Vulkan support found");
22582 return;
22583 }
22584
22585 app->onAppCmd = processCommand;
22586 app->onInputEvent = processInput;
22587
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022588 while (1) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060022589 int events;
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022590 struct android_poll_source *source;
22591 while (ALooper_pollAll(active ? 0 : -1, NULL, &events, (void **)&source) >= 0) {
Cody Northrop1242dfd2016-07-13 17:24:59 -060022592 if (source) {
22593 source->process(app, source);
22594 }
22595
22596 if (app->destroyRequested != 0) {
22597 VkTestFramework::Finish();
22598 return;
22599 }
22600 }
22601
22602 if (initialized && active) {
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022603 // Use the following key to send arguments to gtest, i.e.
22604 // --es args "--gtest_filter=-VkLayerTest.foo"
22605 const char key[] = "args";
22606 std::vector<std::string> args = get_args(*app, key);
Cody Northrop1242dfd2016-07-13 17:24:59 -060022607
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022608 std::string filter = "";
22609 if (args.size() > 0) {
22610 __android_log_print(ANDROID_LOG_INFO, appTag, "Intent args = %s", args[0].c_str());
22611 filter += args[0];
22612 } else {
22613 __android_log_print(ANDROID_LOG_INFO, appTag, "No Intent args detected");
22614 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060022615
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022616 int argc = 2;
22617 char *argv[] = {(char *)"foo", (char *)filter.c_str()};
22618 __android_log_print(ANDROID_LOG_DEBUG, appTag, "filter = %s", argv[1]);
Cody Northrop1242dfd2016-07-13 17:24:59 -060022619
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022620 // Route output to files until we can override the gtest output
22621 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/out.txt", "w", stdout);
22622 freopen("/sdcard/Android/data/com.example.VulkanLayerValidationTests/files/err.txt", "w", stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060022623
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022624 ::testing::InitGoogleTest(&argc, argv);
22625 VkTestFramework::InitArgs(&argc, argv);
22626 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
Cody Northrop1242dfd2016-07-13 17:24:59 -060022627
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022628 int result = RUN_ALL_TESTS();
Cody Northrop1242dfd2016-07-13 17:24:59 -060022629
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022630 if (result != 0) {
22631 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests FAILED ====");
22632 } else {
22633 __android_log_print(ANDROID_LOG_INFO, appTag, "==== Tests PASSED ====");
22634 }
Cody Northrop1242dfd2016-07-13 17:24:59 -060022635
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022636 VkTestFramework::Finish();
Cody Northrop1242dfd2016-07-13 17:24:59 -060022637
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022638 fclose(stdout);
22639 fclose(stderr);
Cody Northrop1242dfd2016-07-13 17:24:59 -060022640
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022641 ANativeActivity_finish(app->activity);
Mark Lobodzinskice751c62016-09-08 10:45:35 -060022642 return;
Cody Northrop1242dfd2016-07-13 17:24:59 -060022643 }
22644 }
22645}
22646#endif
22647
Tony Barbour300a6082015-04-07 13:44:53 -060022648int main(int argc, char **argv) {
22649 int result;
22650
Cody Northrop8e54a402016-03-08 22:25:52 -070022651#ifdef ANDROID
22652 int vulkanSupport = InitVulkan();
Mark Lobodzinski64318ba2017-01-26 13:34:13 -070022653 if (vulkanSupport == 0) return 1;
Cody Northrop8e54a402016-03-08 22:25:52 -070022654#endif
22655
Tony Barbour300a6082015-04-07 13:44:53 -060022656 ::testing::InitGoogleTest(&argc, argv);
Tony Barbour6918cd52015-04-09 12:58:51 -060022657 VkTestFramework::InitArgs(&argc, argv);
Tony Barbour300a6082015-04-07 13:44:53 -060022658
22659 ::testing::AddGlobalTestEnvironment(new TestEnvironment);
22660
22661 result = RUN_ALL_TESTS();
22662
Tony Barbour6918cd52015-04-09 12:58:51 -060022663 VkTestFramework::Finish();
Tony Barbour300a6082015-04-07 13:44:53 -060022664 return result;
22665}